#目的
pythonをストレスなく使う!
そのためには、少しでも、理解のレベルを上げる必要あり。
なんでも、こだわって、、、、理解を深める。
ここで記載しているのは、
**generatorに詳しくなる。since1975らしい。**です。
generatorを理解するために、3、4時間、いろいろ調べた。
以下のような記載がある。
(出典: 「入門 Python3」オライリー・ジャパン )
ジェネレータがあれば、シーケンス全体を作ってメモリに格納しなくても、(巨大になることがある)シーケンスを反復処理できる。
説明は、よくわかるが、印象がやや弱いので、記憶に残らない気もしたので、
少し、調べてみた。
(想像力のある人は、素直な印象の薄い説明からでも、精力的な使い方が浮かぶのだろうと思いますが、ワタシは、ちょっと、無理です。このあたりは、才能が。。。)
#調べてたどり着いたもの1(サンプル)
以下、ジェネレータ関数を使って「素数」を求めている。
よく、フィボナッチ数列を求める説明をみるが、フィボナッチ数列、あまり使わないのでは?
100歩譲ると、「素数」は使うことがある気がする。
(出典: https://en.wikipedia.org/wiki/Generator_(computer_programming) )
※一部、体裁変更あり。
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を丁寧に学ぶ。
#今後
コメントなどあれば、お願いします。
勉強します、、、、