asterisk in function call
我正在使用itertools.chain以这种方式"扁平"列表:
1
| uniqueCrossTabs = list(itertools.chain(*uniqueCrossTabs)) |
这和说:
1
| uniqueCrossTabs = list(itertools.chain(uniqueCrossTabs)) |
- 查看python文档中解包参数列表以了解更多信息。
- 您还应该检查**操作符——它与*的作用相同,但使用关键字参数。
"啪"的一*操作员列表:它需要的输入电流和扩大,它对现有的函数调用的参数。
如果操作系统是[ [ 1, 2 ], [ 3, 4 ] ]uniqueCrossTabsitertools.chain(*uniqueCrossTabs)是相同的,那么在itertools.chain([ 1, 2 ], [ 3, 4 ])
显然,这是一个刚刚从uniqueCrossTabs传递中。在你的案例中,你有一个列表的列表,你想的是什么itertools.chain()不平整;返回的迭代器的所有现有的concatenation支配你通它在现有参数的迭代变量,每个是在它自己的权利。
在其他的话,你想传递的参数列表中的每一uniqueCrossTabs到chain()链,这将他们联系在一起,但你有单独的变量列表中,你*算子的使用扩大到几个参数列表的列表的列表。
蛛网膜下腔出血(SAH)的约10 ritzel尖尖的评论,这是一chain.from_iterable()——它是适合你的工作,学院开始学习单与迭代变量。然后你的代码变得简单。
1
| uniqueCrossTabs = list(itertools.chain.from_iterable(uniqueCrossTabs)) |
- +我不知道他们叫它splat。
- @拉尔斯曼:我认为这个术语在Ruby世界中更受欢迎,但对于Python来说,它似乎也是可以接受的。我喜欢它,因为它很有趣;-)
- 啊,当然了:catb.org/jargon/html/s/splat.html
- @拉尔曼:有趣!我一直认为它指的是将列表解包成参数列表的操作,而不是实际字符本身。
- 也许字符串不是最好的例子,因为不是每个人都将字符串视为iterables。顺便说一句:我写的不是chain(*it),而是chain.from_iterable(it)。
- @乔森:你说得对,我改成用数字。而且,我甚至不知道from_iterable的存在!我马上把它加入我的答案
- @卡梅伦:好吧,itertools.chain(123, 456)不起作用,因为int是绝对不可靠的。
- @乔森:艾克,我没在想。良好捕捉;
- +1、答案很有趣,写得很好。
- 好的,这一切都很好,但似乎你不能在for循环中使用splat。这样:对于l in*uniquecrosstabs:打印长度(l)。似乎是一个非常具体的应用程序。我想这就是为什么我在上面最模糊的原因。很难看到Python解释器中发生了什么。
- @拉米:*只用于将列表分解为函数的位置参数(所以是的,非常具体)。您可以执行for l in uniqueCrossTabs:来迭代它们。不幸的是,很难在工作中看到*,因为它只在将列表传递给函数时才起作用(而不是将列表作为第一个参数传递,*会使列表中的每个元素作为一个单独的参数逐个传递,就好像它们在参数列表中被逗号分隔开一样)。
- 因此,它的工作方式与javascript中的spread operator(...s)类似!我得到了它。
它的序列分割为单独的参数的函数调用。
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] |
- 这很重要,其他地方没有提到
- 这个答案不适用于具体的问题,而是星号的一个重要应用(所以我认为在相当"模糊"的标题下是合适的)。同样,另一个重要的应用是在函数定义中:def func(a, b, *args):有关更多信息,请参阅此答案。