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を丁寧に学ぶ。

今後

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