Python
generator
Python3

pythonをストレスなく使う!(generatorに詳しくなる。since1975らしい。)


目的

 pythonをストレスなく使う!

そのためには、少しでも、理解のレベルを上げる必要あり。

なんでも、こだわって、、、、理解を深める。

ここで記載しているのは、

generatorに詳しくなる。since1975らしい。です。

generatorを理解するために、3、4時間、いろいろ調べた。

以下のような記載がある。

(出典: 「入門 Python3」オライリー・ジャパン )


ジェネレータがあれば、シーケンス全体を作ってメモリに格納しなくても、(巨大になることがある)シーケンスを反復処理できる。


説明は、よくわかるが、印象がやや弱いので、記憶に残らない気もしたので、

少し、調べてみた。

(想像力のある人は、素直な印象の薄い説明からでも、精力的な使い方が浮かぶのだろうと思いますが、ワタシは、ちょっと、無理です。このあたりは、才能が。。。)


調べてたどり着いたもの1(サンプル)

以下、ジェネレータ関数を使って「素数」を求めている。

よく、フィボナッチ数列を求める説明をみるが、フィボナッチ数列、あまり使わないのでは?

100歩譲ると、「素数」は使うことがある気がする。

(出典: https://en.wikipedia.org/wiki/Generator_(computer_programming) )

※一部、体裁変更あり。


sosu.py

def primes():

n = 2
p = []
while True:
if not any( n % f == 0 for f in p ):
yield n
p.append( n )
n += 1
f = primes()
print(next(f))
print(next(f))
print(next(f))
print(next(f))

上記の例、面白いですよ。

ジェネレータのメリットとして、大きなリストをつくらない、appendしないというような説明がよくあるのですが、「素数」の都合で、appendしている。

いい例だと思うが。。。。


調べてたどり着いたもの2(歴史:since1975)

1975年に現れたらしい。

(出典: https://en.wikipedia.org/wiki/Generator_(computer_programming) )


Generators first appeared in CLU (1975), were a prominent feature in the string manipulation language Icon (1977) and are now available in Python, C#,Ruby, the later versions of ECMAScript (as of ES6/ES2015) and other languages. In CLU and C#, generators are called iterators, and in Ruby, enumerators.



調べてたどり着いたもの3(定義方法、実装)


定義方法

関数内に、「yield」があるだけで、generator関数になる。

なんという、、、定義のされ方、処理方法の変化の大きさ!


実装方法

関数の途中で戻ってきて、また、そこから繰り返すというのが、凄すぎるが。。。。

実装は、以下のようらしい。

そうなりますよね。

→すごいもの提供するな。。。。

(出典: https://docs.python.org/ja/3/reference/expressions.html )


開始されると、最初の yield 式まで処理して一時停止し、呼び出し元へ expression_list の値を返します。ここで言う一時停止とは、ローカル変数の束縛、命令ポインタや内部の評価スタック、そして例外処理のを含むすべてのローカル状態が保持されることを意味します。再度、ジェネレータのメソッドが呼び出されて実行を再開した時、ジェネレータは yield 式がただの外部呼び出しであったかのように処理を継続します。



まとめ

generatorをうまく使おうと思います。


関連(本人)

pythonをストレスなく使う!(Pythonでは、すべてがオブジェクトとして実装されている)

pythonをストレスなく使う!(Pylintに寄り添う)

pythonをストレスなく使う!(ExpressionとStatement)

英語と日本語、両方使ってPythonを丁寧に学ぶ。


今後

コメントなどあれば、お願いします。:candy:

勉強します、、、、