1

for簡潔でクリーンな方法でループ内の条件を使用したい。これ書き直そうかな

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

doubled を回避しfor m in ...、それでも素敵な 1 行があり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 ループが可能な限り単純になります。また、ループ ロジックを処理ロジックとは別にテストすることもできますが、この 2 つを混在させるとできなくなります。

于 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 に答える