LoginSignup
2
3

More than 3 years have passed since last update.

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

Posted at

目的

 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:
勉強します、、、、

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3