53

私は本からPythonを学んでいますが、この例に出くわしました:

M = [[1,2,3],
     [4,5,6],
     [7,8,9]]

G = (sum(row) for row in M) # create a generator of row sums
next(G) # Run the iteration protocol

私は全くの初心者であり、作者は例や next() 関数の説明を何も提供していないので、コードが何をしているのか理解できません。

4

2 に答える 2

10

ここまで来たら、一般的な for-in ステートメントがどのように機能するかを既に知っているはずです。

次のステートメント:

for row in M: print row

M は、それぞれ 3 つの項目で構成される 3 行のシーケンス (サブ シーケンス) として認識され、M を反復処理して、行列の各行を出力します。

[1, 2, 3]
[4, 5, 6]
[7, 8, 9]

あなたはそれを知っていました...

ジェネレーターは、for-in ループの構文糖衣のように見えます。sum() 呼び出しのことは忘れて、IDLE で次のように入力します。

G = (row for row in M)
print G
for a in G: print a

ご覧のとおり、ジェネレーターは、シーケンスとしてだけでなく、テキストとして直接表現することはできません。ただし、シーケンスであるかのように Generator を反復処理できます。

その場合、いくつかの大きな違いが見つかりますが、基本は、ジェネレーターを使用して、シーケンス内の各項目の値だけを返すのではなく、任意の式の結果を返すことができるということです。チュートリアルの例では、式は sum(row) です。

次のことを試して、何が起こるかを確認してください。

G = ("("+str(row[2])+";"+str(row[1])+";"+str(row[0])+")" for row in M)
G.next()
G.next()
G.next()
于 2009-11-14T03:49:51.377 に答える