Iteration & Generator
Iteration、エクセラーには反復計算でおなじみの単語だと思う。なので、反復処理をさせる仕組みをここで学ぶわけだ。
例えば、平方数を1から順に出して行こうとするとき、パッと思い浮かぶのは、リスト内包形式を使ったこういうコードになると思うんですよ。
#リスト内包形式 listincl = [x**2 for x in range(1,10)] print(listincl)
結果は以下のように表示される。
[1, 4, 9, 16, 25, 36, 49, 64, 81]
で、iterationとgeneratorを使うとこう表記できるらしいの。
#ジェネレーター i = (x**2 for x in range(1,10)) print(next(i)) #print(i)ではダメ for k in range(9): #iではなくi以外の変数を宣言する必要あってここではk print(next(i))
結果は以下のような感じ。
1 4 9 16 25 36 49 64 81
i=の時点で1から81までの数字はすでにメモリ上には生成されている。だからgeneratorと呼ばれる模様。generatorとリスト内包形式の違いは、カッコ。カッコが違う。とにかくカッコが違う。()カッコを使った時点でgeneratorなので、print(i)とかやってもエラーを食らう。generatorで生成したデータを出すにはnext()関数を使わなきゃいけない。結果の1行目はprint(next(i))の結果で、2行目の4以降はfor文以下の結果。
ざっくりいうと、リスト内包形式はドバッと計算結果が全て吐き出されるのに対し、iteration & generatorを使うと、結果を吐き出すタイミングをコントロールできる、という感じかな。でも、iとxとkと3つの変数を使うのはクソうざいな。
参考にしたのはみんPyではなく以下のウェブ記事。
【Python入門】イテレータの使い方を解説 | 侍エンジニア塾ブログ | プログラミング入門者向け学習情報サイト