以下方法定义中,*and**有什么作用param2?
*
**
param2
def foo(param1, *param2): def bar(param1, **param2):
*argsand是一个常见的**kwargs习惯用法,允许函数使用任意数量的参数,如Python 文档中关于定义函数的更多部分所述。
*args
**kwargs
将为您提供*args所有函数参数作为元组:
def foo(*args): for a in args: print(a) foo(1) # 1 foo(1,2,3) # 1 # 2 # 3
**kwargs将为您提供所有 关键字参数,除了与作为字典的形式参数相对应的关键字参数。
def bar(**kwargs): for a in kwargs: print(a, kwargs[a]) bar(name='one', age=27) # name one # age 27
这两个习语都可以与普通参数混合,以允许一组固定和一些可变参数:
def foo(kind, *args, **kwargs): pass
也可以反过来使用它:
def foo(a, b, c): print(a, b, c) obj = {'b':10, 'c':'lee'} foo(100,**obj) # 100 10 lee
*l习惯用法的另一种用法是在调用函数时解压缩参数列表。
*l
def foo(bar, lee): print(bar, lee) l = [1,2] foo(*l) # 1 2
在 Python 3 中,可以*l在赋值的左侧使用(Extended Iterable Unpacking),尽管在这种情况下它给出了一个列表而不是一个元组:
first, *rest = [1,2,3,4] first, *l, last = [1,2,3,4]
Python 3 还添加了新语义(请参阅PEP 3102):
def func(arg1, arg2, arg3, *, kwarg1, kwarg2): pass
此类函数仅接受 3 个位置参数,之后的所有内容*都只能作为关键字参数传递。
dict