Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

目的

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away