加入加星标的表达式

Join starred expressions

可能我还没有完全理解 python 中带星号的表达式的含义,但是我在这部分遇到了一些麻烦。

我有一些工作代码允许我并行地 运行 多个异步函数,每个函数为一个函数提供不同的参数,通过这样写:

result = asyncio.get_event_loop().run_until_complete(asyncio.gather( *( func1(c) for c in mylist ) ))

现在我需要以类似的方式调用两个函数,并合并两个结果。我能做的一件事是

result1 = asyncio.get_event_loop().run_until_complete(asyncio.gather( *( func1(c) for c in mylist ) ))
result2 = asyncio.get_event_loop().run_until_complete(asyncio.gather( *( func2(c) for c in mylist ) ))
result = result1 + result2

func1func2 的参数相同。

我很确定有一种方法可以只调用一次,比如

result = asyncio.get_event_loop().run_until_complete(asyncio.gather( *( func1(c), func2(c) for c in mylist ) ))

(这当然行不通)。 result 的顺序并不重要(我可以得到所有 func1 结果然后所有 func2 结果或者 func1(c0), func2(c0), func1(c1), func2(c1), ...)。

提前致谢

写的时候

( func1(c) for c in mylist )

您创建一个生成器

你写的时候

*( func1(c) for c in mylist )

您正在从生成器中获取所有元素。同样的情况也会发生在列表中,例如,如果你有

[func(c1), func(c2), func(c3)]

然后使用解包你将得到

func(c1) func(c2) func(c3)

你的问题是 *( func1(c), func2(c) for c in mylist ) ) 正在创建类似 (func1(c1), func2(c1)) (func1(c2), func2(c2)) 的东西等等。您正在创建元组,而不是孤立的元素

因此您需要删除元组部分。一种解决方案是连接所有内容然后解压缩。

result = asyncio.get_event_loop().run_until_complete(asyncio.gather( *sum(([func1(c), func2(c)] for c in mylist), []) ))

我在解压前使用 sum( tuple of lists, []) 到 concatenate all lists