关于python:函数调用中的星号

asterisk in function call

我正在使用itertools.chain以这种方式"扁平"列表:

1
uniqueCrossTabs = list(itertools.chain(*uniqueCrossTabs))

这和说:

1
uniqueCrossTabs = list(itertools.chain(uniqueCrossTabs))


"啪"的一*操作员列表:它需要的输入电流和扩大,它对现有的函数调用的参数。

如果操作系统是[ [ 1, 2 ], [ 3, 4 ] ]uniqueCrossTabsitertools.chain(*uniqueCrossTabs)是相同的,那么在itertools.chain([ 1, 2 ], [ 3, 4 ])

显然,这是一个刚刚从uniqueCrossTabs传递中。在你的案例中,你有一个列表的列表,你想的是什么itertools.chain()不平整;返回的迭代器的所有现有的concatenation支配你通它在现有参数的迭代变量,每个是在它自己的权利。

在其他的话,你想传递的参数列表中的每一uniqueCrossTabschain()链,这将他们联系在一起,但你有单独的变量列表中,你*算子的使用扩大到几个参数列表的列表的列表。

蛛网膜下腔出血(SAH)的约10 ritzel尖尖的评论,这是一chain.from_iterable()——它是适合你的工作,学院开始学习单与迭代变量。然后你的代码变得简单。

1
uniqueCrossTabs = list(itertools.chain.from_iterable(uniqueCrossTabs))


它的序列分割为单独的参数的函数调用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
>>> 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)


一种替代的方式,只是用它来说明概念/。

1
2
3
4
5
6
7
8
9
10
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]