1

我想以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)
4

3 回答 3

4

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

例如,而不是:

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

于 2013-06-20T08:46:53.623 回答
1

这是我不想要的:

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

没关系,你也可以这样做:

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

    
0
1
2
3
4
于 2013-06-20T08:44:07.557 回答
0

使用ifilter和 lambda 或任何其他函数。

from itertools import ifilter

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

产生:

0
1
2
3
4
于 2013-06-20T08:55:14.523 回答