Python 函数调用中的星号
我正在使用itertools.chain以这种方式“展平”列表:Python 函数调用中的星号,python,operators,Python,Operators,我正在使用itertools.chain以这种方式“展平”列表: uniqueCrossTabs = list(itertools.chain(*uniqueCrossTabs)) 这与说: uniqueCrossTabs = list(itertools.chain(uniqueCrossTabs)) *是“splat”运算符:它将列表作为输入,并将其展开为函数调用中的实际位置参数 >>> def foo(a, b=None, c=None): ... print a
uniqueCrossTabs = list(itertools.chain(*uniqueCrossTabs))
这与说:
uniqueCrossTabs = list(itertools.chain(uniqueCrossTabs))
*
是“splat”运算符:它将列表作为输入,并将其展开为函数调用中的实际位置参数
>>> def foo(a, b=None, c=None):
... print a, b, c
...
>>> foo([1, 2, 3])
[1, 2, 3] None None
>>> foo(*[1, 2, 3])
1 2 3
>>> def bar(*a):
... print a
...
>>> bar([1, 2, 3])
([1, 2, 3],)
>>> bar(*[1, 2, 3])
(1, 2, 3)
因此,如果uniqueCrossTabs
是[[1,2],[3,4]
,那么itertools.chain(*uniqueCrossTabs)
就等于说itertools.chain([1,2],[3,4])
这显然不同于只传递uniqueCrossTabs
。在你的情况下,你有一个列表,你希望扁平化;itertools.chain()
所做的是在传递给它的所有位置参数的串联上返回一个迭代器,其中每个位置参数本身都是iterable的
换句话说,您希望将uniqueCrossTabs
中的每个列表作为参数传递给chain()
,这将把它们链接在一起,但是您没有单独变量中的列表,因此您可以使用*
操作符将列表扩展为多个列表参数
正如Jochen Ritzel在评论中指出的那样,它更适合于这种操作,因为它首先假设了一个单一的可移植性。然后,您的代码变得简单:
uniqueCrossTabs = list(itertools.chain.from_iterable(uniqueCrossTabs))
它将序列拆分为单独的函数调用参数
>>> def foo(a, b=None, c=None):
... print a, b, c
...
>>> foo([1, 2, 3])
[1, 2, 3] None None
>>> foo(*[1, 2, 3])
1 2 3
>>> def bar(*a):
... print a
...
>>> bar([1, 2, 3])
([1, 2, 3],)
>>> bar(*[1, 2, 3])
(1, 2, 3)
只是解释这个概念/使用它的另一种方式
import random
def arbitrary():
return [x for x in range(1, random.randint(3,10))]
a, b, *rest = arbitrary()
# a = 1
# b = 2
# rest = [3,4,5]
@拉斯曼斯:我认为这个词在Ruby世界更流行,但我似乎喜欢它,因为说起来很有趣;-)@拉斯曼:有趣!我一直认为它指的是将列表解包到参数列表中的操作,而不是实际的字符本身。也许字符串不是最好的例子,因为不是每个人都认为字符串是可编辑的。顺便说一句:我不会写
chain(*it)
而是写chain。你说得对,我会改成用数字。而且,我甚至不知道iterable的存在!我会把它加到我的答案里shortly@Ramy:*
仅用于将列表分解为函数的位置参数(是的,非常具体)。您可以在uniqueCrossTabs:
中对l执行以迭代它们。不幸的是,很难看到*
起作用,因为它只在向函数传递列表时起作用(而不是将列表作为第一个参数传递,*
导致列表中的每个元素作为一个单独的参数一个接一个地传递,就像它们在参数列表中被逗号分隔一样)查看Python文档中的更多信息。您还应该查看**
操作符——它与*
做的事情相同,但带有关键字参数。这个答案并不特别适用于这个问题,而是星号的一个重要应用(因此我认为在相当“模糊”的标题下是合适的)。同样,另一个重要的应用程序是函数定义:def func(a,b,*args):
有关详细信息,请参阅。