読者です 読者をやめる 読者になる 読者になる

イテレーターとジェネレーターの解釈

みんなのPython p.214から

イテレーターの概念で引っかかってしまったので、(一応)理解するよう努力した。

イテレーターは「順序がないデータ構造に、順番を与えてやって、順番に処理していく機能(手法)」と解釈した。

具体的な使い方は、「順番がないデータに順序つけを行う」と「順序つけした順に処理を行う」の2つ。

「順番がないデータに順序つけを行う」のことを、「イテレータオブジェクトに変換」というらしい。

で、その変換の方法は
iter(イテレート可能)

イテレータオブジェクトに変換」できるオブジェクトのことを「イテレート可能」というんだとさ。

・ジェネレーターについて

ジェネレータは「関数で簡単にイテレーターを使えるようにできる方法」と解釈した。
(本当は「ジェネレーターは関数の一種」としっかり明言されているけど p.220)

ジェネレータ関数の定義のページでp.221のコードがわからなくて困っていたが、なんとか解釈できたので、覚え書きに。

                                • -

#素数を返す関数(ジェネレータ関数)
def get_prime(x=2):
#無条件にループ(無限ループ)
while True:
#2からx未満の範囲でiを変化させる。つまり2からx未満のiで、xを割っていくことになる。もし、割り切れてしまったら、それは素数ではない(1とx自分自身以外で割り切れることになってしまうので)
for i in range(2,x):
if x % i == 0:
break

#elseブロックは直前のforが何事もなく処理を終えたときに実行されるブロック。もし、forがbreakした場合にはelseは実行されない。
else:
# yieldによってxを返す
yield x

x += 1

                        • -


この関数を使うには

i = get_prime()
for c in range(10):
print i.next()

になる。


こうするとi、つまり実体はget_prime、が10回next()を実行することを意味する。
なので、ジェネレータ関数内では10回yieldが実行されるのと同じ意味。

したがって、10個の素数が出力される仕組み。


だから、例えば上のコードを
for c in range(20):
print i.next()

にすれば、20個の素数が出力される。

i = get_prime()
for c in i:
print i.next()

にすれば、無限個の素数が出力される。

なんだか、プッチ神父になれる気がする。

もし、

i=get_prime()
for c in i:
print "「落ち着け………… 心を平静にして考えるんだ…こんな時どうするか……",i.next(),"… 落ち着くんだ…『素数』を数えて落ち着くんだ…
 『素数』は1と自分の数でしか割ることのできない孤独な数字……
 わたしに勇気を与えてくれる」"
 
とすれば、気軽にプッチ神父になれるだろう。

ただし、非常にうっとうしいことこの上ないが....