【问题标题】:What do * and ** before a variable name mean in a function signature? [duplicate]函数签名中变量名前的 * 和 ** 是什么意思? [复制]
【发布时间】:2012-07-04 03:02:39
【问题描述】:

可能重复:
Understanding kwargs in Python

看过一段python代码,不知道这段代码中*和**是什么意思:

def functionA(self, *a, **kw):
   // code here

我只知道 * 的一种用途:提取它对方法或构造函数的参数的所有属性。

如果上述功能是这样,那么其余的:** 是什么?

【问题讨论】:

标签: python


【解决方案1】:

函数头内:

* 将所有位置参数收集在一个元组中。

** 收集字典中的所有关键字参数。

>>> def functionA(*a, **kw):
       print(a)
       print(kw)


>>> functionA(1, 2, 3, 4, 5, 6, a=2, b=3, c=5)
(1, 2, 3, 4, 5, 6)
{'a': 2, 'c': 5, 'b': 3}

函数调用中

* 将列表或元组解包到位置参数中。

** 将字典解压缩为关键字参数。

>>> lis=[1, 2, 3, 4]
>>> dic={'a': 10, 'b':20}
>>> functionA(*lis, **dic)  #it is similar to functionA(1, 2, 3, 4, a=10, b=20)
(1, 2, 3, 4)
{'a': 10, 'b': 20}

【讨论】:

  • 有趣的功能,解释清楚。。现在可以看懂代码,也许有一天会在我自己的代码中找到它的用途。有关位置参数与关键字参数的清晰解释,另请参阅this answer
【解决方案2】:

** 采用指定的参数名称并将它们放入字典中。所以:

def func(**stuff):
    print(stuff)

func(one = 1, two = 2)

将打印:

{'one': 1, 'two': 2}

【讨论】:

    【解决方案3】:

    ** 表示函数的命名参数。

    $ cat 2.py
    def k(**argv):
        print argv
    
    k(a=10, b = 20)
    
    $ python 2.py
    {'a': 10, 'b': 20}
    

    argv 是一个包含函数所有命名参数的字典。

    你也可以反转它。您可以将字典用作一组参数 对于函数:

    def k(a=10, b=20):
      print a
      print b
    
    d={'a':30,'b':40}
    k(**d)
    

    会打印

    30
    40
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-30
      • 2011-10-05
      • 1970-01-01
      • 1970-01-01
      • 2018-07-31
      • 1970-01-01
      • 2018-03-02
      • 2011-05-22
      相关资源
      最近更新 更多