当不清楚有多少参数传入函数时可以使用收集参数,例如print函数就是使用收集参数
*:打包为元组
>>> def f(*a):
print('有%d个参数' % len(a))
print('第二个参数是:',a[1])
>>> f(1,2,3,4,5)
有5个参数
第二个参数是: 2
>>> def f(*a):
print(type(a))
>>> f(1,1,1,1,1)
<class 'tuple'> #收集参数的参数被打包为一个元组
当收集参数后还有其他参数时,调用函数时必须用关键参数来指定,否则都将被视为收集参数
>>> def f(*a, b):
print('收集参数:', a)
print('其他参数:', b)
>>> f(1,1,2,3,4,5)
Traceback (most recent call last):
File "<pyshell#15>", line 1, in <module>
f(1,1,2,3,4,5)
TypeError: f() missing 1 required keyword-only argument: 'b'
>>> f(1,2,3,4, b = 5)
收集参数: (1, 2, 3, 4)
其他参数: 5
#在有收集参数的情况下,建议将其他参数设置为默认参数,例如print函数
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
*在形参中的作用是打包,在实参中的作用是解包
>>> a = (1,2,3,4,5)
>>> print(a)
(1, 2, 3, 4, 5)
>>> print(*a)
1 2 3 4 5
>>> a = [1,2,3,4,5]
>>> print(a)
[1, 2, 3, 4, 5]
>>> print(*a)
1 2 3 4 5
>>> a = 'lzm'
>>> print(a)
lzm
>>> print(*a)
l z m
**:打包为字典
>>> def f(**a):
print('有%d个参数' % len(a))
print('分别是:', a)
>>> f(a=1, b=2, c=3, d=4, e=5)
有5个参数
分别是: {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
# 当参数带两个**时,传递给函数的任意数量的key=value实参会被打包进一个字典中
# 下面演示解包
>>> a = {'a':1, 'b':2, 'c':3}
>>> f(**a)
有3个参数
分别是: {'a': 1, 'b': 2, 'c': 3}