イテレーターとジェネレーターの解釈
みんなの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と自分の数でしか割ることのできない孤独な数字……
わたしに勇気を与えてくれる」"
とすれば、気軽にプッチ神父になれるだろう。
ただし、非常にうっとうしいことこの上ないが....