-3

Python では、イテラブルに対して、多くの 1 行反復コマンドを作成できます。

このような反復の一部では、if ステートメントが必要です。

if ステートメントと for ステートメントの順序が重要な場合があります。0 から 10 までの奇数の合計を求めたいとします。

>>> sum(i if not i%2==0 for i in range(10))
SyntaxError: invalid syntax
>>> sum(i for i in range(10) if not i%2==0)
25

これらのワンライナーは本質的にあまり理解できませんが、if ステートメントがfor ステートメントの後に来る必要がある理由がよくわかりません。前の を使用する方が常識的ではないでしょうi if not i%2==0 for i in range(10)か?

4

2 に答える 2

5

ジェネレーター式 (またはリスト内包表記) では、ステートメントをネストしているかのようにリストする必要があります。

式は次のsum()ようにネストできます。

for i in range(10):
    if not i%2 == 0:
        # do something with i

その順序を変更することはできません。次はi定義されていないため意味がありません。

if not i%2 == 0:
    for i in range(10):
        # do something with i
于 2012-12-04T22:22:26.013 に答える
1

最初の例では、リスト内包表記として if 式を使用した無条件ループがあります。正しい構文は次のとおりです。

(a if b else c for i in iterable)
 \___________/
    |
   actual expression

a if b else cがtrue と評価されたa場合と同等であり、それ以外の場合と同等です。bc

2 番目の例では、条件付きリスト内包表記があります。基本的に、イテラブルから値をスキップしています。より正確には、どれを取得するかを指定しています。

(a for i in iterable if <condition>)

合計の場合、最初の構文を使用してリスト内包表記を書き直すことができます。これは、ゼロが加算 (および合計) の null 要素であるためです。

sum(i if i % 2 != 0 else 0 for i in range(10))
于 2012-12-04T22:29:08.520 に答える