1.1 收集多余的位置参数
收集多余的位置参数: 当你在函数定义中使用*args
时,它会收集所有未命名的位置参数并将它们放入一个元组中。
当函数参数前面加一个星号*
时,函数可以接收任意数量的位置参数。通常,这种参数被命名为*args
,但名字可以随意。
def foo(*args):
print(type(args)) # <class 'tuple'>
for arg in args:
print(arg)
def bar(a, b, *args):
print(type(args)) # <class 'tuple'>
for arg in args:
print(arg)
foo(1,2,3,'a','b',3.6)
print('-'*30)
bar(1,2,3,'a','b',3.6)
输出:
<class 'tuple'>
1
2
3
a
b
3.6
------------------------------
<class 'tuple'>
3
a
b
3.6
1.2 解包列表或元组
在调用函数时,*
也可以用来解包列表或元组,使其元素作为单独的位置参数传递。注意解包后的列表、元组元素个数要与函数参数相同。
def foo(a,b,c):
return a+b+c
lst = [1,2,3]
tu = (2,3,4)
print(foo(*lst)) # 6
print(foo(*tu)) # 9
1.3 强制关键字参数
如果你在参数列表中使用 *
,它会要求在它之后的所有参数必须以关键字方式传递。03.onestar.py
:
def foo(arg1, arg2, *, kwarg1, kwarg2):
print(arg1, arg2, kwarg1, kwarg2)
调用foo(1,2, kwarg1= 3, kwarg2 = 4)
输出:
1 2 3 4
调用foo(1,2, 3, 4)
,报错:
Traceback (most recent call last):
File "03.onestar.py", line 31, in <module>
foo(1,2, 3, 4)
TypeError: foo() takes 2 positional arguments but 4 were given