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

时间:2013-06-20 08:40:13

标签: python python-2.7

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

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

避免加倍for m in ...,仍然有一个很好的单行for

>>> for m in range(10) if m < 5: print m
  File "<stdin>", line 1
    for m in range(10) if m < 5: print m
                               ^

这是我想要的:

>>> 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)

3 个答案:

答案 0 :(得分:4)

如果我们假设您实际上打算做一些实际需要if语句的更复杂的事情,那么您应该考虑的是定义一个生成器来生成相关序列。

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循环就像它可能的那样简单。此外,您可以将循环逻辑与处理逻辑分开测试,如果将两者混合在一起,则无法对其进行测试。

答案 1 :(得分:1)

  

这是我不想要的:

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

这是必须直截了当的方式,你应该习惯于此。不建议使用功能样式编程来消除双for m in ...,但IMO非常繁琐:

>>> from functools import partial
>>> from operator import gt
>>> for m in filter(partial(gt, 5), range(10)):
        print m


0
1
2
3
4

答案 2 :(得分:0)

使用ifilter和lambda或任何其他功能。

from itertools import ifilter

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

产地:

0
1
2
3
4