我想以简洁,干净的方式在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)
答案 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