这可能很简单,但是,由于某些原因我找不到它。例如:
def fnc(dt):
print dt
return;
#[(fnc(y)) for y in range(5) for x in range(5)]
for x in range(0, 5):
fnc(x)
for y in range(0, 5):
fnc(y)
我希望注释掉的行与双嵌套循环有类似的行为。这可能吗?我放弃了,我找不到它!感谢您的任何意见。
答案 0 :(得分:4)
您必须使用嵌套列表推导来实现相同的结果:
[(fnc(x),[fnc(y) for y in range(5)]) for x in range(5)]
在为(fnc(x), [...])
执行列表推导之前,我使用元组x
输出y
。
P.S。:实际上不要使用它。坚持你的循环。
答案 1 :(得分:3)
这里你不需要列表理解。列表推导用于构建列表不用于副作用,就像在 for 循环中一样。任何使用list comp提供相同结果的解决方案。 (如下所示)将产生一个无用的None
s列表:
[fnc(y) for x in range(5) if fnc(x) or 1 for y in range(5)]
代码 unpythonic 且无法读取。你永远不应该使用它。在评估fnc(x)
时始终会对if
进行评估,并且始终使用分支,因为它使用or
与 truthy 值短路,因此嵌套循环总是执行∀ x
。
Pythonic的方式就是像你一样使用 香草。
答案 2 :(得分:1)
你可以做的事情可能在技术上是可行的(我在思考一个带有重写迭代器的类,它在迭代中调用func(),虽然我不确定这是否实际上是可实现的)。 然而,实施将是一种失常。
列表推导旨在作为过滤,组合和/或处理列表中的数据以生成另一个数据的快速方法。您应该将它们视为快速将函数应用于列表中的所有数据的方法,每次将函数结果附加到输出列表时。 这就是为什么在理解中没有语法来做分配或外部函数调用。如果你需要在处理数据之前在内部循环中调用一个函数,那么你最好使用嵌套循环方法(这比在理解中工作的任何等效的东西更具可读性)