私は本から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() 関数の説明を何も提供していないので、コードが何をしているのか理解できません。
ここまで来たら、一般的な 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()