函数参数
python3中函数也可以用中文
def func(a,b): #站在函数定义角度上:位置参数,是必须传的参数 print(a,b)
站在调用函数的角度上
func(1,2) #按照位置传参 func(b = 1,a = 2) #按照关键字传参 func(1,b = 2) #混用:必须先按照位置传参 def welcome(name,sex='male'): #sex 默认参数 print('welcome,%s,sex:%s%(name,sex)) welcome('fff') welcome('female') #默认参数可以不传,不传用默认,如果不传的话就用传入的值 def age(age,my_age=18) if age>my_age: return False else: return True
-----------------------------------------------------
默认参数陷阱
针对可变数据类型,不可变不受影响
def c(a=[]): a.append(1) print(a) c() c() c() 结果: [1] [1, 1] [1, 1, 1]
---------------------------------------------------
def c(a=[]): a.append(1) print(a) c([]) c([]) c([]) 结果: [1] [1] [1]
--------------------------------------------------
动态参数
arg形参 para实参
*是动态参数的标识 后面变量名
def func(*a): h = 0 for item in a: h += item print(h) func(33,44,55,88,77,78)
动态参数可以接受多个传过来的实参
li = [1,2,3,4,5,6,7] func(*li) #把列表打散了传参 #*在形参前,*是聚合,将每个参数组合成一个元组 #*在实参前,*是打散,将一个列表或者元组打散成多个参数 #一个*只针对按位置传参,不能关键字传参 func fa(**li): print(li) fa(a=1,b=1,c=1) 结果 {'a': 1, 'b': 1, 'c': 1}
#**两个*是针对关键字传参,传出值是字典,变量变成key #**在关键字形参前是聚合 组成字典 #**在实参前,是打散 def fa(*a,**f): print(a) print(f) fa(3,8,3,5,6,5,8,g=4,c=7,o=9)
混用必须位置传参在前
实参传形参也是这样一个*的放在前面两个*放在后面
站在函数定义角度上:所有参数都是形参
位置参数
默认参数
动态参数:*args,**kwargs
站在函数调用的角度上:所有的参数都是实际参数
按照位置传参
按照关键字传参
混用先位置再关键字
先定义动态参数里面的*args再放默认参数再放**kwargs
如
def func(位置参数,*args,默认参数=10,**kwargs): print(位置参数) print(*args) print(默认参数) print(**kwargs)
这样可以显示出默认参数,如果默认参数放在了*args前,就永远都用不到设定的默认参数值
放在关键词传参前面,就而已用,但是必须要在写入时用字符串写出默认参数的变量名,然后赋值
例如:
def funk(a,b,*args,c=10,**kwargs): print(a,b) print(args) print(c) print(kwargs) funk(3,5,4,8,6,2,1,z=10,y=8,o=9)
这样的话就可以将c=10利用,加载1和z=10中间的位置。