1. 使用一个星号*
作为函数
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+clst = [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
2. 使用两个星号**
作为函数
2.1 收集多余的关键字参数
当在函数定义中使用**kwargs
时,它会收集所有未命名的关键字参数并将它们放入一个字典中。
04.twostar.py
:
def foo(**kwargs):print(kwargs)print(type(kwargs))for key, value in kwargs.items():print(f'{key}: {value}')foo(a=1, b=2.3, c='stockA')
输出:
{'a': 1, 'b': 2.3, 'c': 'stockA'}
<class 'dict'>
a: 1
b: 2.3
c: stockA
2.2 解包字典为关键字参数
在调用函数时,**
可以用来解包字典,使其键值对作为关键字参数传递。
def foo(name, age, job):print(f'{name} is {age} years old, as a {job}')info = {"name":'garrylau', "age":30, "job":"Engineer"}foo(**info)
输出:
garrylau is 30 years old, as a Engineer
2.3 结合使用普通参数、*args
和**kwargs
def foo(a,b, *args, **kwargs):print(a) # 普通参数print(b) # 普通参数print(args) # 捕获所有的位置参数print(kwargs) # 捕获所有的关键字参数foo(1, 2.3, 666, 'freedom', 'positio
输出:
1
2.3
(666, 'freedom', 'positional argument BEFORE keyword argument')
{'name': 'stockA', 'job': 'Engineer'}
2.4 强制关键字参数和位置参数结合
如果你在参数列表中使用 *
,它会要求在它之后的所有参数必须以关键字方式传递。
def foo(arg1, arg2, *, kwarg1, kwarg2 , **kwargs):print(arg1, arg2, kwarg1, kwarg2, kwargs)print(type(arg1), type(arg2), type(kwarg1), type(kwarg2), type(kwargs))foo(1,2, kwarg1='name', kwarg2='age', extra1 = 3, extra2 = 4)
输出:
1 2 name age {'extra1': 3, 'extra2': 4}
<class 'int'> <class 'int'> <class 'str'> <class 'str'> <class 'dict'>