Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.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 函数调用中的星号_Python_Operators - Fatal编程技术网

Python 函数调用中的星号

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

我正在使用itertools.chain以这种方式“展平”列表:

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):
有关详细信息,请参阅。