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

时间:2012-09-02 12:40:58

标签: python

  

可能重复:
  What does *args and **kwargs mean?

我正在阅读挖掘社交网络并遇到一个我无法弄清楚的python语法:

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

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

但如果我输入

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

那么星号在这里意味着什么呢?谢谢大家。

4 个答案:

答案 0 :(得分:13)

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'}

答案 1 :(得分: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

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

答案 2 :(得分:3)

它将元组传递给参数列表。所以

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

变为

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

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

答案 3 :(得分: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.

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

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

“Google,Inc。”。replace(变换[0] [0],变换[0] [1])