“for”循环中的条件生成器

2024-05-03 10:19:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望以简洁、干净的方式在for循环中使用条件。我能重写这个吗

>>> for m in (m for m in range(10) if m < 5):
...     print m

为了避免加倍for m in ...,并且仍然有一个漂亮的for?在

^{pr2}$

这就是我不想要的:

>>> for m in range(10):
...     if m < 5: 
...         print m

我用Python2.7

编辑

range(10),这只是一个玩具的例子。例如,一个真正的用例包括

for m in items if any(cond(item) for cond in conditions)

或者

for m in items if cond1(m) and cond2(m) or cond3(m)

Tags: in编辑forif方式anyitemsrange
3条回答

如果我们假设您实际上打算执行更复杂的操作,而实际上需要if语句,那么您应该考虑定义一个生成器来生成相关的序列。在

例如,代替:

for m in candidates:
    if isvalid(m):
        ... do something ...

写下:

^{pr2}$

这样,复杂的条件被一个描述性的名称替换,for循环就尽可能简单了。此外,您可以测试循环逻辑和处理逻辑,如果您将两者混合在一起,则无法测试。在

使用^{}和lambda或任何其他函数。在

from itertools import ifilter

for m in ifilter(lambda x: x<5, range(10)):
    print m

产生:

^{pr2}$

This is what I don't want:

>>> for m in range(10):
...     if m < 5: 
...         print m

这是必须直截了当的方法,你应该习惯于那样。不建议这样做,但您可以使用函数式编程消除双for m in ...,但在IMO中它非常乏味:

^{pr2}$

相关问题 更多 >