一尘不染

*and**有什么作用

javascript

以下方法定义中,*and**有什么作用param2

def foo(param1, *param2):
def bar(param1, **param2):

阅读 243

收藏
2022-01-25

共1个答案

一尘不染

*argsand是一个常见的**kwargs习惯用法,允许函数使用任意数量的参数,如Python 文档中关于定义函数的更多部分所述。

将为您提供*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习惯用法的另一种用法是在调用函数时解压缩参数列表。

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语义上用于关键字参数传递的 Python是任意排序的。但是,在 Python 3.6 中,保证关键字参数会记住插入顺序。
  • **kwargs现在元素的顺序对应于关键字参数传递给函数的顺序。” - Python 3.6 的新功能
  • 事实上,CPython 3.6 中的所有 dicts 都会记住插入顺序作为实现细节,这在 Python 3.7 中成为标准。
2022-01-25