次の記事では、Python のジェネレーターとは何かについて学びます。 python ジェネレーター とは何か、pythonプログラミング で ジェネレーター が果たせる役割を理解します。
Python ジェネレーターとは何ですか?
リスト生成を使用すると、リストを直接作成できます。ただし、メモリの制約により、リストの容量には確実に制限があります。さらに、100 万個の要素を含むリストを作成すると、大量の記憶領域が必要になるだけでなく、最初の数要素にアクセスするだけで済む場合、後続の要素のほとんどが占有する領域が無駄になります。 では、リストの要素を特定のアルゴリズムに従って計算できれば、ループ中に後続の要素を継続的に計算できるでしょうか?これにより、完全なリストを作成する必要がなくなり、スペースを大幅に節約できます。 Python では、ループと計算を同時に行うこの仕組みをジェネレーター: ジェネレーターと呼びます。ジェネレーター
を作成するには、さまざまな方法があります。最初の方法は非常に簡単です。リスト生成の [] を () に変更してジェネレーターを作成するだけです:
>>> L = [x * x for x in range(10)] >>> L [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] >>> g = (x * x for x in range(10)) >>> g <generator object <genexpr> at 0x1022ef630>ジェネレーターを作成した後、for ループを使用して反復処理します。 StopIteration エラーについて心配する必要はありません。 ジェネレーターは非常に強力です。計算アルゴリズムが比較的複雑で、リスト生成のような for ループを使用して実装できない場合は、関数を使用して実装することもできます。 たとえば、有名なフィボナッチ数列では、最初と 2 番目の数値を除き、最初の 2 つの数値を加算することで任意の数値を取得できます。
def fib(max): n, a, b = 0, 0, 1 while n < max: print(b) a, b = b, a + b n = n + 1 return 'done'次の代入ステートメントに注意してください。
a, b = b, a + bは
t = (b, a + b) # t是一个tuplea = t[0]b = t[1]と同等ですが、一時変数 t は明示的に書き出さなくても割り当てることができます。 上記の関数は、フィボナッチ数列の最初の N 個の数値を出力できます:
>>> fib(6)112358'done'よく見ると、fib 関数が実際にフィボナッチ数列の計算を定義していることがわかります。最初の要素から開始して後続の要素を計算するこのロジックは、実際にはジェネレーターと非常によく似ています。 言い換えれば、上記の関数はジェネレーターからわずか 1 ステップ離れたところにあります。 fib 関数をジェネレーターに変えるには、print(b) を変更して b を生成します。
def fib(max): n, a, b = 0, 0, 1 while n < max: yield b a, b = b, a + b n = n + 1 return 'done'これは、
ジェネレーターを定義する別の方法です。関数定義に yield キーワードが含まれている場合、その関数は通常の関数ではなくジェネレーターになります。
>>> f = fib(6) >>> f<generator object fib at 0x104feaaa0>
ここで、最も理解しにくいのは、ジェネレーターと関数の実行フローが異なることです。関数は順番に実行され、return ステートメントまたは関数ステートメントの最後の行に到達すると戻ります。ジェネレーターとなる関数は next() が呼び出されるたびに実行され、yield ステートメントに遭遇するとリターンし、再度実行されると最後に返された yield ステートメントから実行を継続します。 以上がこの記事の内容です。この記事では主に
pythonのジェネレーターに関する知識を紹介します。上記の内容を理解するために活用していただければ幸いです。この記事で説明したことがあなたのお役に立ち、Python の学習が容易になることを願っています。
関連知識の詳細については、php 中国語 Web サイトの Python チュートリアル 列を参照してください。
以上がPythonのジェネレーターとは何ですか?発電機は何に使われますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。