ホームページ >バックエンド開発 >Python チュートリアル >Python イテレータとジェネレータの詳細な紹介
1. イテレーターとは何ですか?
まず反復とは何かについて話しましょう。反復とは、for ループ など、1 つのことを何度も繰り返すことです。
for ループは、iter メソッドを持つすべての オブジェクト を反復処理できます。では、iter メソッドとは何でしょうか。
オブジェクトが反復可能かどうかは、オブジェクトの iter メソッドを呼び出すと、この iterator の next メソッドが返されるかどうかによって決まります。反復子に返す値がない場合、反復を停止するために StopIteration という例外がスローされます。 イテレータのもう 1 つの非常に重要な特徴は、イテレータが不可逆であり、前方へのみ進むことができ、後方へは進められないことです。
これが for ループの仕組みです。for ループがオブジェクトをループするとき、オブジェクトの iter メソッドを呼び出してイテレータを取得し、次にイテレータの next メソッドを呼び出してイテレータに含まれる各項目を取得します。 。 価値。
2. リストとイテレータの違いは何ですか?基本的なイテレータを実装するにはどうすればよいですか?
イテレーターの仕組みは、使用時に値を計算して取得することですが、リストはすべての値を一度に取得します。値が多い場合、大量のメモリを消費します。
自分でオブジェクトを作成するとき、オブジェクトを反復可能にするにはどうすればよいですか?
classtest_class: def init(self,start_num,stop_num):
self.start_num = start_num
self.stop_num = stop_num
def next(self):
if
self.start_num < ; Self.stop_num: Self.start_num += 1
Rturn
Self.start_num Return Selfst_Obj = Test_class (0,3)>
ジェネレーターとは何ですか?私の個人的な理解では、ジェネレーターは他の反復可能オブジェクトとは異なります。つまり、他の反復可能オブジェクトは iter メソッドを呼び出し、それを反復処理する必要があります。 next メソッドを実行してイテレータの値を取得しますが、ジェネレータは iter メソッドを実行せずに直接反復処理できます。
pythonには 2 つのジェネレーターの表現形式があります:
Functiongenerator: つまり、文字通り、ステートメントの戻り値は return を使用しなくなり、代わりに使用します。関数内で複数の結果を返すことはできませんが、関数内の各 yield は、yield が実行されるたびに結果を返します。
は一時停止として理解できる「一時停止」になります。次回この関数を呼び出すと、最後に一時停止された位置から下方向に実行が継続されます。 以下は関数ジェネレーターの例です: 次の例は、yield の 2 つの特性を検証します。1 つ目は、関数が複数の値を生成でき、複数の利回りが存在することです。もう 1 つは関数ジェネレーターです。一時停止機能。 yield 1 print "1回目のyield実行が完了しました〜" print "2回目のyield実行が完了しました〜"yield 3 print "3回目のyield実行が完了しました実行が完了しました ~ "
for IN Func1 (): Print I & GT; & GT; & GT; 3 3 回目の yield 実行が完了しました~GeneratorExpression
: 次のようなメソッドを使用しますリストの内包理解ですが、返されるオブジェクトはリストではなくなり、オンデマンドで結果を生成できるオブジェクト (ビルダー) になります。print i
(i for i in range(5)) これがジェネレータ式です。
(i for i in range(10000)) = def test(): for i in range(10000):yield i
これら 2 つの書き方は同じ効果がありますが、ジェネレーターの書き方が異なります。もう 1 つは関数ジェネレーターです。
この種のジェネレーター式はリスト内包表記に非常に似ていると思ったことはありますか? 違いは、リスト内包表記では [] 角括弧が使用されるのに対し、ジェネレーター式では () 括弧が使用されることです。
以上です。実際、それらの間の構文は括弧 1 つだけが異なりますが、ジェネレーター式はより多くのメモリ領域を節約します。
ジェネレーターについては、これで終わりです。
ジェネレーターの定義方法は、通常の関数とまったく同じです。違いは、ジェネレーターが値を返すために yield を使用するのに対し、関数は値を返すために return を使用することです。 。
Python では、ジェネレーターは反復プロトコルを自動的に実装し、返す値がない場合は StopIteration 例外を返します。
ジェネレーターは、yield ステートメントを使用して値を返します。 yield ステートメントはジェネレーター関数の状態を一時停止し、後で中断したところから実行を再開するのに十分な情報を保持します。
次の例は、リスト内包表記とジェネレーター式の実行効率の比較です。興味のある方は、自分のコンピューターで試してみてください。
#リスト解析
sum([i for i in range(100000000)])#メモリ使用量が多くマシンが詰まりやすい
#ジェネレータ式
sum(i for i in range(100000000) ))# メモリをほとんど消費しません
以上がPython イテレータとジェネレータの詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。