Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python func(*元组)和#x27;散布';元组,但func(**字典)是如何工作的?_Python_Dictionary_Args_Keyword Argument - Fatal编程技术网

Python func(*元组)和#x27;散布';元组,但func(**字典)是如何工作的?

Python func(*元组)和#x27;散布';元组,但func(**字典)是如何工作的?,python,dictionary,args,keyword-argument,Python,Dictionary,Args,Keyword Argument,让我们创建一个简单的元组、字典和函数 >>> tup = (7, 3) >>> dic = {"kw1":7, "kw2":3} >>> def pr(a, b): ... print a, b 下面显示了*在元组和字典作为参数之前所做的操作 >>> pr(tup) Traceback (most recent call last): File "<stdin>", line 1, in <mo

让我们创建一个简单的元组、字典和函数

>>> tup = (7, 3)
>>> dic = {"kw1":7, "kw2":3}
>>> def pr(a, b):
...    print a, b
下面显示了
*
在元组和字典作为参数之前所做的操作

>>> pr(tup)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: pr() takes exactly 2 arguments (1 given)

>>> pr(*tup)  
7 3   

>>> pr(*dic)
kw1 kw2
好吧,似乎**只在字典用作参数时才起作用。那我们就用字典试试吧

>>> pr(**dic)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: pr() got an unexpected keyword argument 'kw1'
公共关系(**dic) 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 TypeError:pr()获得意外的关键字参数“kw1” 什么?
有人能给我举一个不产生错误的最后一个例子吗?

dict表示法意味着你的字典变成了关键字参数。如果函数没有必要的关键字,那么它将返回一个错误,正如您所经历的那样

在您的情况下,如果您按照以下方式定义函数,则它将起作用:

>>> def pr(kw1, kw2):
...    print kw1, kw2

您的
pr
函数采用参数
a
b
,而不是
kw1
kw2

>>> def pr(a, b):
...   print a, b
... 
>>> 
>>> d = {'a': 1, 'b':2}
>>> pr(**d)
1 2

要添加到其他答案中,可以在函数定义中使用
*args
**kwargs
来支持任意参数。这可能会使代码不那么明确。但出于调试目的、灵活性和开发速度,采用以下方法可能有意义:

(函数定义中的
*
/
***
-符号类似于函数调用时参数解包操作的“逆”操作。)


文档的一些相关链接:


你和丹尼尔都回答了这个问题,但方式不同,如果我能把两个答案都打上正确的记号,我会的。我扔了一枚硬币,丹尼尔赢了。原谅我,谢谢你的回答。虽然你的回答很有帮助,但我还是在丹尼尔的回答上打了个勾,因为他是第一个。@Bentley4-当然,特别是因为我的回答没有直接回答你的问题,而是试图提供一些额外的信息。
>>> def pr(a, b):
...   print a, b
... 
>>> 
>>> d = {'a': 1, 'b':2}
>>> pr(**d)
1 2
def foo(*args, **kwargs): 
    for v in args: 
        print v
    for v in kwargs: 
        print v, "->", kwargs[v]

dic = {"kw1":7, "kw2":3}

foo(dic)
# prints:
# {'kw1': 7, 'kw2': 3}

foo(**dic)
# prints:
# kw1 -> 7
# kw2 -> 3