**(双星/星号)和*(星号/星号)对参数有什么作用?

  • 问题:
  • 在下面的方法定义中,***param2做了什么?在

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

  • 答案:
  • *args**kwargs是一种常见的习惯用法,允许函数具有任意数量的参数,如本节所述more on defining functions在Python文档中

    *参数将为您提供所有函数参数as a tuple公司名称:

    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)
    # age 27
    # name one

    这两种习惯用法都可以与常规参数混合使用,以允许一组固定参数和一些可变参数:

    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

    在python3中,可以在赋值的左边使用*l(Extended Iterable Unpacking),但在这种情况下,它给出了一个列表而不是元组:

    first, *rest = [1,2,3,4]
    first, *l, last = [1,2,3,4]

    Python3还添加了新的语义(请参阅PEP 3102)公司名称:

    def func(arg1, arg2, arg3, *, kwarg1, kwarg2):
    pass

    这样的函数只接受3个位置参数,*之后的所有内容都只能作为关键字参数传递