加入加星标的表达式
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
func1
和 func2
的参数相同。
我很确定有一种方法可以只调用一次,比如
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
可能我还没有完全理解 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
func1
和 func2
的参数相同。
我很确定有一种方法可以只调用一次,比如
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