调用函数,需要知道函数的名称和参数结构
函数参数
函数传参实际是一种赋值,将调用者的引用值赋值给被调用函数的局部变量
# x,y为函数A的局部变量
def A(x,y):
pass
定义函数的参数结构
常规参数(位置参数):接受调用者位置或变量名匹配
def fun(name):
print(name)
>>>fun(1) # 1
>>>fun(name=2) # 2
默认参数:定义时已提供给参数默认值,接受调用者位置或变量名匹配,需写在常规参数后面
def fun(name=0):
print(name)
>>>fun() # 0
>>>fun(1) # 1
>>>fun(name=2) # 2
非关键字形式可变参数:参数前增加*号表示,接受调用者位置参数匹配完后剩余的无关键字变量
可以传入任意个参数,包括0个参数
def fun(*name):
print (name)
>>>fun(1,2) # (1,2) 参数name接收到一个tuple
关键字参数:关键字参数允许你传入任意个含参数名的参数,这些参数调用时自动组装为一个dict
def fun(**name):
print (name)
>>>fun(a=1,b=3) # {'a': 1, 'b': 3}
判断字典中key值是否存在
if 'c' in name:
print(name["c"],end='')
if 'c' in name.keys():
print (name['c'])
关键字参数分隔符:如果要限制关键字参数的名字,就可以用命名关键字参数。
使用*号分隔后,其后的参数只能使用关键字传参,且只接受age作为关键字传参
def fun(name,*,age):
print (name,age)
>>>fun(1,2)
>>>TypeError: fun() takes 1 positional argument but 2 were given
>>>fun(1,age=2) # 1,2
命名关键字参数:给与被强制为关键字传参的参数一个默认值,避免调用时不传参引起报错
def fun(name,*,age):
print (name,age,sep=',')
>>>fun(1)
>>>TypeError: fun() missing 1 required keyword-only argument: 'age'
def fun(name,*,age=0):
print (name,age,sep=',')
>>>fun(1) # 1,0 age自带默认值,可不传参
定义顺序:
常规参数,默认参数,非关键字可变参数/关键字参数分隔符,命名关键字参数,关键字参数
def f2(a, b, c=0, *, d, **kw):
pass
如果函数中已有一个非关键字可变参数,则不再需要一个关键字参数分隔符*,其后变量必须使用关键字传参
def person(name, age, *args, city, job):
pass
>>>person('Jack', 24, city='Beijing', job='Engineer')
调用顺序:
按位置匹配非关键字参数(即单变量名形式,如name)
按变量名匹配关键字参数
其他额外的非关键字参数分配到name中
最后剩余的关键字参数分配到*name中
return
函数无return语句,或者return后没有参数,调用函数返回None
执行到return语句即退出函数,像调用方返回表达式的结果,return后的语句不再执行
def fun():
name = 1
return
print(name)
>>>fun() # None
return可以返回多个值
return语句放在try...finally语句块中,return之后的语句仍然执行
def fun():
try:
name = 1
return
finally:
print(name)
>>>fun() # 1
解包
解包:将可迭代对象的元素逐个取出赋值给左侧变量
# 左侧元素个数和右侧相等
a,b,c=[1,2,3] # 多元赋值本质上也是一种自动解包
print(a,b,c)
>>>1 2 3
a,b,c=(4,5,6)
print(a,b,c)
>>>4 5 6
字典解包,只会把key取出来,value丢掉
a,b,c = {"a":1, "b":2, "c":3}
print(a,b,c)
>>>'a' 'b' 'c'
等号两边个数不等时
a, *b, c = [1,2,3,4]
print(a,b,c)
>>>1 [2, 3] 4
调用函数时,使用*号解包一个可迭代对象作为函数的参数
def func(a,b,c):
print(a,b,c)
>>>func(*{'a':4,'b':5,'c':6}) # a b c
字典对象,也可以使用**,解包之后将整体作为关键字参数传递给函数
def func(a,b,c):
print(a,b,c)
>>>func(**{'a':4,'b':5,'c':6}) # 4 5 6