不定长的参数:
定义一个函数,可以求任意个数字的和
咱们举一个例子:
defsum(a,b): print(a+b) sum(123,345)
调用函数sum,就会算出a+b的值。
如果传入3个函数,那就会报错。
defsum(a,b): print(a+b) sum(123,345,222)
报错:TypeError: sum() takes 2 positional arguments but 3 were given
在定义函数时,可以在形参前加*,这样形参将会获取所有实参,它会将所有的实参保存到一个元组中
*a 会接受所有的位置实参,并且会将这些实参统一保存到一个元组中(装包)
deffn(*a): print('a=',a,type(a)) fn()
得到的结论是:a= () <class 'tuple'>,a是一个元组
deffn(*a): print('a=',a,type(a)) fn(1,2,3,4)
得到的结论是:a= (1, 2, 3, 4) <class 'tuple'>
这样就完美解决上面的问题啦。
二、实参与形参的定义及各种用法
defsum(*nums): # 定义一个变量,来保存结果result=0# 遍历元组,并将元组中的数进行累加forninnums: result+=nprint(result) sum(12,3,4,5,6,333,22,22)
得到的结果是:407.
不论传几个参数,都可以相加
#带星号的形参只能有一个
#带星号的参数,可以和其他参数配合使用
#以一个参数给 a,第二个参数给 b,余下的参数都保存到c的元组中
deffn(a,b,*c): print('a=',a) print('b=',b) print('c=',c) fn(1,2,3,4,5,6,7,8)
#可变参数不是必须写在最后,但是带*参数后的所有参数,必须以关键字参数的形式传递
deffn(a,*b,c): print('a=',a) print('b=',b) print('c=',c) #fn()这样写会报错: missing 1 required keyword-only argument: 'c'#fn(1,2,3,4,5,6,7,8) #应该这样写:fn(1,2,3,4,5,6,7,c=8)
#所有的位置参数都给 a,b 和 c 必须使用关键字参数
deffn(*a,b,c): print('a=',a) print('b=',b) print('c=',c) fn(1,2,3,4,5,6,b=7,c=8)
#如果在形参的开头直接写一个*,则要求所有的参数必须以关键字参数的形式传递
deffn(*,a,b,c): print('a=',a) print('b=',b) print('c=',c) fn(a=3,b=7,c=8)
*形参只能接受位置参数,而不能接受关键字参数
举个例子:
deffn(*a): print('a=',a) fn(d=3,b=7,c=8)
会报错;fn() got an unexpected keyword argument 'd',*行参不能接受关键字参数
怎么办呢,咱们用**行参
**形参可以接收其他的关键字参数,它会将这些参数统一保存到一个字典中
#字典的 key 就是参数的名字,字典的值就是参数的值
#形参只能有一个,并且必须卸载所有参数的最后
deffn(**a): print('a=',a,type(a)) fn(d=3,b=7,c=8)