40のおっさんのPython学習記録

20年以上前、学部の必修のC言語が全く理解できずに同級生に放り投げ、その後コーディングから遠ざかったガチ文系のおっさんが、ふと思い立ってPythonに挑戦しています。

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入門】イテレータの使い方を解説 | 侍エンジニア塾ブログ | プログラミング入門者向け学習情報サイト