[转]Python函数默认参数陷阱 阅读目录 可变对象与不可变对象 函数默认参数陷阱 默认参数原理 避免 修饰器方法 扩展 参考 请看如下一段程序: def extend_list(v, li=[]): li.append(v) return li list1 = extend_list(10) list2 = extend_list(123, []) list3 = extend_list('a') print(list1) print(list2) print(list3) print(li…
详解python函数的参数 一.参数的定义 1.函数的参数在哪里定义 在python中定义函数的时候,函数名后面的括号里就是用来定义参数的,如果有多个参数的话,那么参数之间直接用逗号, 隔开 案列: # 利用函数的参数,定义一个可以完成任意两个数相加的函数 def add_num(a,b): c = a + b print(c) 2.带参数的函数调用: 函数定义了参数,那么调用函数的时候就需要传入参数 add_num(,) #运行结果 上面的案列中,我们定义函数的时候在函数名后面的括号里定义的参…
写python的都知道,python函数或者方法可以使用默认参数,比如 1 def foo(arg=None): 2 print(arg) 3 4 foo() 5 6 foo("hello world") 一个很简单的函数,参数arg默认使用None,当调用foo函数时,可以传入一个参数,也可以不传入参数,运行结果如下 1 None 2 hello world 这很好理解.默认参数是python一个很好的特性. 但是如果使用可变对象作为默认参数,就会引发问题.之前写过一个脚本,bug不…
按"指针"传递 python中变量赋值.参数传递都是通过"指针"拷贝的方式进行的.除了按"指针"拷贝,还有一种按值拷贝的方式,关于按值.按指针拷贝的细节,参见按值传递 vs. 按指针传递. 所以在python中,变量赋值.参数传递,都只是拷贝了源数据的一个地址,而不会拷贝内存中完整的数据对象副本.所以,如果在函数内部修改变量指向的数据对象,会影响函数外部的数据. 例如: def f(x): print(x+3) a=4 f(a) 在将a赋值给本地…
## 函数 - 函数是代码的一种组织形式,一般一个函数完成一个特定功能 - 函数需要先定义后使用 - 函数的定义 def func_name(参数): func_body ... return func_result ## 函数的返回值 - 函数和过程的区别就在于有没有返回值 - 用return关键字表示返回内容 - 函数内在执行到return语句后,整个函数无条件结束执行 - 若在函数定义时没有明确的写明return内容,则该函数默认返回None - 推荐无论函数有没有返回值都以return结…
什么是函数 函数就是有特定功能的工具 # python中有内置函数(python解释器预先封装好的)与自定义函数(用户自定义封装的)之分 为什么要用函数 # 可以减少代码冗余,增加代码复用性 # 使代码逻辑更加清晰 # 一次编写,任意次数调用 函数定义 ''' 精简版定义: def 函数名(): 代码体 调用: 函数名() ''' 函数名命名规范 # 函数名的命名规则与变量名的一模一样 ,千万注意两点 # 不能以关键字作为函数名,避免与内置函数重名(比如内置函数 len)(******) , #…
python中函数根据是否有返回值可以分为四种:无参数无返回值,无参数有返回值,有参数无返回值,有参数有返回值. Python中函数传递参数的形式主要有以下五种,分别为位置传递,关键字传递,默认值传递,不定参数传递(包裹传递)和解包裹传递. 1.位置传递实例: def fun(a,b,c) return a+b+c print(f(1,2,3)) 2.关键字传递 关键字(keyword)传递是根据每个参数的名字传递参数.关键字并不用遵守位置的对应关系. def fun(a,b,c) return…
函数搞不熟,后边就晕头转向了,在此重新归纳一下廖大神的函数教程,加深记忆 一.函数的参数分为: 位置参数 def power(x): # x 就是power(x)的一个位置参数,我们调用power(x)必须传入一个参数x return x * x 默认参数 def power(x, n=2): #修改后的power()函数有两个位置参数,调用函数时如果传入两个参数,会依次传给x,n; s = 1 #如果仅仅传入一个参数的话,那么n=2就是一个默认参数,默认为2,这就是默认参数 while n >…
Python的函数除了正常使用的必选参数外,还可以使用默认参数.可变参数和关键字参数. 默认参数 基本使用 默认参数就是可以给特定的参数设置一个默认值,调用函数时,有默认值得参数可以不进行赋值,如: def power(x, n=2): s=1 while n > 0: n = n - 1 s = s * x return s 这样调用power(5)时,相当于调用power(5, 2). 设置默认参数时的注意事项: 一是必选参数必须在前,默认参数在后,否则Python的解释器会报错: 二是如何…
请看如下一段程序: def extend_list(v, li=[]): li.append(v) return li list1 = extend_list(10) list2 = extend_list(123, []) list3 = extend_list('a') print(list1) print(list2) print(list3) print(list1 is list3) 请先猜想打印的结果: 是不是这样: [10] [123] [a] False 但是,实际的打印效果 请…
定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了.对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调用者无需了解. Python的函数定义非常简单,但灵活度却非常大.除了正常定义的必选参数外,还可以使用默认参数.可变参数和关键字参数,使得函数定义出来的接口,不但能处理复杂的参数,还可以简化调用者的代码. 默认参数 我们仍以具体的例子来说明如何定义函数的默认参数.先写一个计算x2的函数: def power(x…
在学习Python函数的时候,函数本身的定义和调用并不是很复杂,但是函数的参数类型和用法的确有些复杂.在此做一个小结,加深理解. Python参数的定义 负责给函数提供一些必要的数据或信息,以保证函数的正常运行. 形式参数(parameter):在函数定义的时候使用到的参数,一般没有赋值(默认参数除外). 实参(argument):在函数调用的时候实际赋予的值. 如果在函数定义时给定了形式参数,并且没有给该参数默认值,则在调用的时候必须给定一个实参 def SayHello(person): p…
函数 数学定义 y=f(x), y是x函数,x是自变量.y=f(x0,x1...xn) Python函数 由若干语句组成的语句块,函数名称,参数列表构成,它是组织代码的最小单位 完成一定的功能 函数作用 结构化编程对代码的最基本的封装,一般按照功能组织一段代码 封装的目的为了复用,减少冗余代码 代码更加简洁美观,可读易懂 函数分类 内建函数,如max(),reversed()等 库函数,如math.ceil()等 函数定义.调用 def语句定义函数 def 函数名(参数列表): 函数体(代码块)…
python 函数参数定义有四类: 1.必选参数:调用函数时候必须赋值的参数. a,须以正确的顺序传入函数b,调用时的数量必须和声明时的一样 def exa(x): return x #b作为参数进入函数体内 b=1 print exa() #错误 TypeError: exa() takes exactly 1 argument (0 given) 2,默认参数:初始已经有值,在调用时未更改使用默认值 def exa(x=1) return x 3,可变参数:不确定参数个数,会分配给带“*”参…
函数 将重复的代码,封装到函数,只要使用直接找函数 函数可以增强代码的模块化和提高代码的重复利用率 函数的定义和调用 格式 def 函数名([参数,参数...]): 函数体 定义函数 import random def generate_random(): for i in range(10): ran = random.randint(1,20) print(ran,end=',') 调用函数 generate_random() 输出 3,13,6,3,11,16,9,1,10,19, 参数…
Python的动态参数: 1,参数前一个"*":在函数中会把传的参数转成一个元组. def func (*args): print(args) func(123,1,2,'a') result:(123, 1, 2, 'a') 2,"**args"的参数:函数中被转成一个字典. 如果这样传参的话会报错,因为没有指定key或value: def func (**args): print(args) func(123,1,2,'a') result:TypeError:…
一.函数的参数有四种,位置参数.默认参数.可变参数和关键字参数 def func(x, y=0, *arg, **args): '''x为位置参数 y有默认值 *arg为可变参数 **args为关键字参数 ''' print('x= ', x) print('y= ', y) print('*arg= ', arg) print('**arg= ', args) 二.仅输入位置参数时,默认参数会打印默认值 >>> func(1) x= 1 y= 0 *arg= () **arg= {}…
函数:指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可. def sayhi( ): # 函数名 print('hello world') sayhi( ) #调用函数 , 调用函数时要加上括号(), 不加的话调用的是定义函数名的那个内存地址 示例: #普通代码: a,b = 5,8 # 这句话的意思是给两个变量a,b 分别赋值5和8, 即 a= 8, b=8 c= a**b print(c) #改成用函数写: def calc(x,y) : res =…
* 函数接收参数为元组 例如 def myfun(*args): #相当于 def myfun(1,2,3)    ==> args 就相当于(1,2,3) for a in args: print(a) ** 表示函数接收参数为一个字典 def myfun(**args) :#相当于 def myfun({a:1,b:2,c:3}) ==>args 就相当于{a:1,b:2,c:3} for k,v in args: print(k,":",v)…
1.代码在执行的过程中,遇到函数定义,初始化函数生成存储函数名,默认参数初识值,函数地址的函数对象. 2.代码执行不在初始化函数,而是直接执行函数体. 代码实例 这要从函数的特性说起,在 Python 中,函数是第一类对象(function is the first class object),换而言之,函数也是对象,跟整数.字符串一样可以赋值给变量.当做参数传递.还可以作为返回值.函数也有自己的属性,比如函数的名字.函数的默认参数列表. # 函数的名字 >>> func.__name_…
Python 的内建标准类型有一种分类标准是分为可变类型与不可变类型: 可变类型:列表.字典 不可变类型:数字.字符串.元组 因为变量保存的实际都是对象的引用,所以在给一个不可变类型(比如 int)的变量 a 赋新值的时候,你实际上是在内存中新建了一个对象,并将 a 指向这个新的对象,然后将原对象的引用计数 –1. 比如下面的示例: >>> id(1),id(2) (507098784, 507098816) >>> a = 1 >>> id(a) 5…
# -*- coding: utf-8 -*- #coding=utf-8 ''' @author: tomcat @license: (C) Copyright 2017-2019, Personal exclusive right. @contact: liliang07@yungengxin.com @software: coding @file: decorator.py @time: 2019/7/24 19:22 ''' ''' dict 字典参数 关键字参数在函数内部自动组装为一个…
参数组合 在Python中定义函数,可以用必选参数.默认参数.可变参数.关键字参数和命名关键字参数,这5种参数都可以组合使用.但是请注意,参数定义的顺序必须是:必选参数.默认参数.可变参数.命名关键字参数和关键字参数. 比如定义一个函数,包含上述若干种参数: def f1(a, b, c=0, *args, **kw): print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw) def f2(a, b, c=0, *, d,…
##################################总结######################################动态参数 *args:位置参数动态传参,接收到的是元祖,传多少都可以,不传也可以 **kwargs:关键字参数动态传参,接收到的是字典 顺序: 位置参数—*args—默认值参数—**kwargs 以上参数可以随意搭配使用 def func(): pass 形参的位置*,** ——聚合 实参的位置*,** ——打散 def hehe(*args,**k…
在Python中定义函数,可以用必选参数.默认参数.可变参数和关键字参数,这4种参数都可以一起使用,或者只用其中某些,但是请注意,参数定义的顺序必须是:必选参数.默认参数.可变参数和关键字参数 定义一个函数,包含上述4种参数: def func(a,b,c=0,*args,**kw): print 'a=',a,'b=',b,'c=',c,'args=',args,'kw=',kw 在函数调用的时候,Python解释器自动按照参数位置和参数名把对应的参数传进去. print func(1,2)…
1.python中默认缺省参数----定义默认参数要牢记一点:默认参数必须指向不变对象! 1 def foo(a,b=1): 2 print a,b 3 4 foo(2) #2 1 5 foo(3,100) #2 100 定义有默认参数的函数时,默认值参数位置必须都在非默认值参数后面. 调用时提供默认值参数值时,使用提供的值,否则使用默认值. 2.Python可以根据参数名传参数 1 def foo(ip,port): 2 print "%s:%d" % (ip,port) 3 4 f…
python中一切皆对象,函数中参数传递的是对象的引用. 1在函数中改变变量指向的对象,即指向不同对象. 当在函数中修改传递进来的变量指向另一个对象时,实参的对象不会改变. >>> def fun(num,l,d): ... num=; ... l=[,,] ... d={} ... print("inside:","num=%f,l=%s,d=%s"%(num,l,d)) ... >>> num= >>> l=…
Python唯一支持的参数传递方式是『共享传参』(call by sharing)多数面向对象语言都采用这一模式,包括Ruby.Smalltalk和Java(Java的引用类型是这样,基本类型按值传递)共享传参是指函数的各个形式参数获得实参中各个引用的副本:也就是说,函数内部的形参是实参的别名(alias)这种方案的结果是,函数可能会修改作为参数传入的可变对象,但是无法修改那些对象的标识(即不能把一个对象替换为另一个对象. >>> def fun(num,l,d): ... num=12…
参数定义:1. 位置参数:    这是熟悉的标准化参数,位置参数必须在调用函数中定义的准确顺序来传递,在没有默认参数的情况下,传入参数    的精确数目必须和声明的数目一致. def foo(who, name): print('{0} is {1}'.format(who, name) foo函数有两个位置参数,那么意味这foo的调用必须有两个参数,不能多也不能少2. 默认参数: 定义默认参数的如下: def func(posargs, defargs=dval, defargs2=dval2…
def func(a,b,c,*args,**kw): print('a=',a,'b=',b,'c=',c,'args=',args,'kw=',kw) 必选参数,默认参数,可变参数,关键字参数 def func(a, b, c=0, *args, **kw):   必选参数 默认参数 可变参数 关键字参数   a c=0 *agrs **kw                     #添加默认参数def power(x,n=2): 一是必选参数在前,默认参数在后 二是如何设置默认参数. 当函…
BS