版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_41402059/article/details/82229203
多个返回值:
def fun1():
return 1, 2, 3 # python解释器自动转换成元组类型,相当于rerun (1, 2, 3)
a = fun1() # a = (1, 2, 3) 元组
b, c, d = fun1() # b = 1, c = 2, d = 3
s1, s2 ,s3 = (1, 2, 3) # s1 = 1, s2 = 2, s3 = 3 自动解析
传参:
必须先位置传参,然后再关键字传参
函数定义形参顺序:位置参数, 动态参数*args, 默认参数'=', 动态关键字参数**kwargs
动态参数:
*args:可变参数,接收n个位置传参,args类型为元组
**kwargs:关键字参数,接收n个关键字传参,kwargs类型为元组
*args必须在**kwargs之前
def f(a, *args, default=1, **kwargs):
print(a, args, default, kwargs)
f(1, 2, 3, 4, 5, 6, default=0, b=7, c=8, d=9)
# args类型为元组,kwargs类型为字典
# 1 (2, 3, 4, 5, 6) 0 {'b': 7, 'c': 8, 'd': 9}
直接传列表等作为*args和直接传字典作为**kwargs:
def f1(*args):
print(args)
l = [1, 2, 3]
f1(*l)
# 相当于
"""
for i in l:
f(i)
"""
def f2(**kwargs):
print(kwargs)
d = {'a':1, 'b':2} # 字典key必须是str
f2(**d)
# 相当于
"""
for k, v in d.items():
f2(k=v)
"""
函数参数的坑:
需求:定义一个函数,使得列表结尾增加‘end’然后返回列表
# 错误定义
def add_end(L=[]):
L.append('end')
return L
add_end([1, 2]) # 正常 [1, 2, 'end']
add_end() # 正常 ['end']
#再次调用默认参数
add_end() # 错误 ['end', 'end']
原因:函数在定义的时候,默认参数L就被计算出来了,因此L也是一个变量,
所以,函数的默认参数必须是不可变类型
def add_end(L=None):
if L is None:
L = []
L.append('end')
print(L)
add_end([1, 2]) # 正常 [1, 2, 'end']
add_end() # 正常 ['end']
#再次调用默认参数
add_end() # 正常 ['end']