Python `for`循环中的条件生成器

Python `for`循环中的条件生成器,python,python-2.7,Python,Python 2.7,我想以简洁、干净的方式在for循环中使用条件。我可以重写这个吗 >>> for m in (m for m in range(10) if m < 5): ... print m 这是我不想要的: 或 这是我不想要的: 这是我不想要的: 如果我们假设你实际上要做更复杂的事情,实际上需要如果语句,你应该考虑的是定义一个生成器来生成相关的序列。 e、 g.而不是: for m in candidates: if isvalid(m): ...

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

>>> for m in (m for m in range(10) if m < 5):
...     print m
这是我不想要的:

这是我不想要的:

这是我不想要的:


如果我们假设你实际上要做更复杂的事情,实际上需要<代码>如果语句,你应该考虑的是定义一个生成器来生成相关的序列。 e、 g.而不是:

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

def valid_candidates(candidates):
    for m in candidates:
        is isvalid(m): yield m

for m in valid_candidates(candidates):
    ... do something ...

这样,复杂条件就被一个描述性名称所取代,for循环就尽可能简单了。另外,如果你把这两个逻辑混合在一起,你就可以测试循环逻辑。如果你认为你实际上是想做更复杂的事情,实际上需要“<代码> > < /Cord>语句”,那么你应该考虑的是定义一个生成器来生成相关的序列。 e、 g.而不是:

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

def valid_candidates(candidates):
    for m in candidates:
        is isvalid(m): yield m

for m in valid_candidates(candidates):
    ... do something ...
这样,复杂条件就被一个描述性名称所取代,for循环就尽可能简单了。此外,您可以将循环逻辑与处理逻辑分开进行测试,如果将两者混合在一起,则无法对循环逻辑进行测试。

使用and lambda或任何其他函数

from itertools import ifilter

for m in ifilter(lambda x: x<5, range(10)):
    print m
使用和lambda或任何其他函数

from itertools import ifilter

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

为什么不使用:
表示范围(5)中的m:
?天哪,这只是一个例子!如果你能给我们提供真实的用例,那就更好了。你为什么不在范围(5)内的m中使用:
?天啊,这只是一个例子!如果你能给我们提供真实的用例会更好。我想要的是让这个生成器与
for
保持一致,我的建议是你写清晰的可测试代码。我想要的是让这个生成器与
for
保持一致,我的建议是你写清晰的可测试代码。
for m in candidates:
    if isvalid(m):
        ... do something ...
def valid_candidates(candidates):
    for m in candidates:
        is isvalid(m): yield m

for m in valid_candidates(candidates):
    ... do something ...
from itertools import ifilter

for m in ifilter(lambda x: x<5, range(10)):
    print m
0
1
2
3
4