この記事では、Python のジェネレーターとイテレーターについて簡単に紹介します (例とともに)。これには一定の参考価値があります。必要な友人は参照できます。お役に立てば幸いです。
Python では、オブジェクトをループ (トラバース) できる場合、オブジェクト内の各要素のプロセスを反復と呼びます。たとえば、辞書、文字列、リスト、タプル、セットなどです。これらを反復できる理由は、すべてに共通の組み込み関数 __iter__ があるためです。組み込みオブジェクトの __next__ 関数を実行すると、オブジェクトのすべての要素を順番に出力できます。たとえば、1 ~ 100 の値を格納するリストがありますが、最初の 50 要素だけを出力したいとします。
flag=True l=[x for x in range(1,101)] l_iter = l.__iter__() while flag: try: item=l_iter.__next__() if item==51: flag=False break else: print(item) except: break
while ループでは、反復子は常にループして __next__() 関数を実行しますが、反復子自体は反復する必要がある要素の数を知りません。最後の要素が実行されると、引き続き __next__() 関数が実行されますが、この時点では反復できる要素がありません。反復子は反復できる要素を見つけることができないため、エラーが報告されます。そのため、while ループを使用する場合は、例外をキャッチするコード try else と併用することで、繰り返し処理中に例外が発生した場合、次のループが自動的に停止されます。
要件があるとします。最初と 2 番目の要素を除き、他の要素は最初の 2 つの要素の合計です。
#こんな感じで書けますdef fib1(max): n,a,b=0,0,1 while n<max: print(b) a,b=b,a+b n=n+1 return 'done' a=fib1(5) print(a)出力結果
1 1 2 3 5 done導出過程は図の通りです 別のメソッドを使用します
def fib2(max): n,a,b=0,0,1 while n<max: yield b a,b=b,a+b n=n+1 return 'done'この関数を呼び出します
a=fib2(5) print(a)出力結果
1 2b2a51d19d7c64a0eab3732f7e789d7c
今回定義した fib は単純な関数ではなく、ジェネレーターに変換されています。生成された結果を知りたい場合は、__next__ 関数を順番に実行できますが、毎回返される結果は 1 つだけであり、反復できる要素がなくなると例外がスローされます。 さらに、for ループと while (tryException と一緒に使用する必要があります) を使用して結果を出力することもできます。a=fib2(5) for c in a: print(c)出力結果の表示 1 1 2 3 5.ジェネレーターを使用する利点: ジェネレーターは、導出プロセスに基づいて次の要素を計算します。最初の 2 つの関数 fib1 と fib2 を見てみましょう。fib1 は、完全な計算結果を保存するためにコンピュータに固定メモリ領域を開きます。ただし、計算結果内の特定の要素にアクセスしたい場合は、計算全体を走査する必要があります。結果が最初です。オブジェクトの添え字や for ループや if 条件判断を使用して、必要な結果を得ることができます。これによりニーズは満たされますが、より多くのメモリ領域を消費します。 fib2 は推論プロセスに基づいて次の要素を計算するため、完全なオブジェクトを作成する前に必要な要素を取得できます。これにより、メモリ消費量が削減されます。
以上がPython のジェネレーターとイテレーターの簡単な紹介 (例付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。