Python:理解列表,访问外部循环/

时间:2017-07-10 21:28:51

标签: python loops list-comprehension nested-loops

这可能很简单,但是,由于某些原因我找不到它。例如:

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)

我希望注释掉的行与双嵌套循环有类似的行为。这可能吗?我放弃了,我找不到它!感谢您的任何意见。

3 个答案:

答案 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(),虽然我不确定这是否实际上是可实现的)。 然而,实施将是一种失常。

列表推导旨在作为过滤,组合和/或处理列表中的数据以生成另一个数据的快速方法。您应该将它们视为快速将函数应用于列表中的所有数据的方法,每次将函数结果附加到输出列表时。 这就是为什么在理解中没有语法来做分配或外部函数调用。如果你需要在处理数据之前在内部循环中调用一个函数,那么你最好使用嵌套循环方法(这比在理解中工作的任何等效的东西更具可读性)