5

可能重复:
*args 和 **kwargs 是什么意思?

我刚刚阅读 Mining the social web 并遇到了我无法弄清楚的 python 语法:

transforms = [(', Inc.', ''), (', Inc', ''), (', LLC', ''), (', LLP', '')]

"google, Inc.".replace(*transforms[0])

但是如果我输入

*transforms[0]

在解释器中,它说它是无效的语法。我用谷歌搜索了它,但 python 文档确实不适合这份工作。

那么这里的星号是什么意思呢?谢谢你们。

4

4 回答 4

15

python中的*argument格式意味着:使用序列中的所有元素argument并将它们作为参数传递给函数。

在这种特定情况下,这意味着:

"google, Inc.".replace(', Inc.', '')

这是最容易证明的:

>>> def foo(arg1, arg2):
...     print arg1, arg2
...
>>> arguments = ('spam', 'eggs')
>>> foo(*arguments)
spam, eggs

您还可以使用**kw双星格式来传递关键字参数:

>>> def foo(arg1='ham', arg2='spam'):
...     print arg1, arg2
...
>>> arguments = dict(arg2='foo', arg1='bar')
>>> foo(**arguments)
bar, foo

您可以在函数定义中使用相同的拼写来捕获任意位置和关键字参数:

>>> def foo(*args, **kw):
...     print args, kw
...
>>> foo('arg1', 'arg2', foo='bar', spam='eggs')
('arg1', 'arg2'), {'foo': 'bar', 'spam': 'eggs'}
于 2012-09-02T12:43:37.977 回答
7

星号解包一个可迭代对象。我认为最好用一个例子来解释:

>>> def exampleFunction (paramA, paramB, paramC):
    print('A:', paramA)
    print('B:', paramB)
    print('C:', paramC)

>>> myTuple = ('foo', 'bar', 'baz')
>>> myTuple
('foo', 'bar', 'baz')
>>> exampleFunction(myTuple)
Traceback (most recent call last):
  File "<pyshell#8>", line 1, in <module>
    exampleFunction(myTuple)
TypeError: exampleFunction() takes exactly 3 arguments (1 given)
>>> exampleFunction(myTuple[0], myTuple[1], myTuple[2])
A: foo
B: bar
C: baz
>>> exampleFunction(*myTuple)
A: foo
B: bar
C: baz

如您所见,我们定义了一个函数,该函数接受三个参数和一个包含三个元素的元组。现在,如果我们想直接使用元组中的值,我们不能只传递元组并让它工作。我们可以分别传递每个元素,但这非常冗长。我们所做的是使用星号来解包元组,并基本上使用元组中的元素作为参数。

当使用未知数量的参数时,解包功能还有第二种用法:

>>> def example2 (*params):
    for param in params:
        print(param)

>>> example2('foo')
foo
>>> example2('foo', 'bar')
foo
bar
>>> example2(*myTuple)
foo
bar
baz

星号允许我们在这里定义一个参数,该参数采用传递的所有剩余值并将其打包到一个可迭代对象中,因此我们可以对其进行迭代。

于 2012-09-02T12:49:13.187 回答
3

它将传递的元组转换为参数列表。所以

"google, Inc.".replace(*transforms[0])

变成

"google, Inc.".replace(', Inc.', '')

通过这种方式,您可以以编程方式构造正在传递的参数列表(可变长度是一个关键优势)。

于 2012-09-02T12:43:26.417 回答
0

检查 Python 教程的第 4.7.4 节:http: //docs.python.org/tutorial/controlflow.html#more-on-defining-functions

But if I type

*transforms[0]
in the interpreter, it says it is invalid syntax.

transforms[0] 前面的 * 只在函数调用中有意义。

使用列表中第一个元组中的数据进行此调用的另一种方法是:

“谷歌公司”.replace(transforms[0][0],transforms[0][1])

于 2012-09-02T12:46:27.527 回答