“替换(*某事)”中的星号是什么?

what is the asterisk in “replace(*something)” for? (python)

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
What does *args and **kwargs mean?

我刚刚阅读了挖掘社交网站,遇到了一个无法理解的python语法:

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

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

但是如果我打字

1
*transforms[0]

在解释器中,它说它是无效的语法。我在google上搜索了一下,但python docu真的不适合这个工作。

那么星号在这里是什么意思呢?谢谢大家。


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

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

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

这是最简单的演示:

1
2
3
4
5
6
>>> def foo(arg1, arg2):
...     print arg1, arg2
...
>>> arguments = ('spam', 'eggs')
>>> foo(*arguments)
spam, eggs

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

1
2
3
4
5
6
>>> def foo(arg1='ham', arg2='spam'):
...     print arg1, arg2
...
>>> arguments = dict(arg2='foo', arg1='bar')
>>> foo(**arguments)
bar, foo

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

1
2
3
4
5
>>> def foo(*args, **kw):
...     print args, kw
...
>>> foo('arg1', 'arg2', foo='bar', spam='eggs')
('arg1', 'arg2'), {'foo': 'bar', 'spam': 'eggs'}


星号将解包一个iterable。我认为最好用一个例子来解释:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
>>> 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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
>>> def example2 (*params):
    for param in params:
        print(param)

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

星号允许我们在这里定义一个参数,它获取传递的所有剩余值并将其打包成一个iterable,这样我们就可以迭代它了。


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

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

变成

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

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


查看python教程的第4.7.4节:http://docs.python.org/tutorial/controlflow.html有关定义函数的更多信息

1
2
3
4
But if I type

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

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

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

"Google,Inc."替换(转换[0][0],转换[0][1])