ホームページ  >  記事  >  バックエンド開発  >  Python プログラミングでイテレータを実装するためのヒントのまとめ

Python プログラミングでイテレータを実装するためのヒントのまとめ

WBOY
WBOYオリジナル
2016-07-21 14:53:151000ブラウズ

yield はイテレータを実装します
導入部で説明したように、反復可能な関数を実装するために毎回手動で iter, next を実装するのは少し面倒で、必要なコードも比較的客観的です。 Python では、yield を使用してイテレータを実装することもできます。 Yield には、現在の実行ロジックを中断し、シーン (さまざまな値のステータス、実行位置など) を維持し、対応する値を返し、次回の実行で前回の実行をシームレスに継続することができます。ループは、あらかじめ設定された終了条件が満たされるか、エラーが発生して強制的に中断されるまで継続します。
その具体的な機能は、関数から値を返すために return として使用できることです。違いは、関数は、yield で返された後、yield で返された時点から実行を続行できることです。つまり、yield は関数を返し、呼び出し元に戻り値を与えてから「テレポート」して戻り、yield ステートメントが新しい値を返すまで関数の実行を継続できます。 yield を使用して戻った後、呼び出し元が実際に取得するのはイテレータ オブジェクトであり、イテレータの値が戻り値になります。イテレータの next() メソッドを呼び出すと、関数は yield ステートメントの実行環境を復元し、次のyieldが発生するまで実行を継続します。yieldが見つからない場合は、反復の終了を示す例外がスローされます。
例を見てみましょう:

リーリー

説明を聞いただけで、イテレータの動作方法と非常に一致していると思いますよね? 確かに、yield は、配置された関数をイテレータに変えることができます。最も古典的なフィボナッチの例を使用して、動作方法を簡単に説明しましょう。シーケンス:

リーリー

for キーワードの構文を思い出してください。5 以内のフィボナッチ数列値を走査するとき、fab(5) が反復可能オブジェクトを生成することは明らかです。その呼び出しは反復子オブジェクトを返します。これは実際に機能し、次のメソッドを呼び出すたびにフィボナッチ数列値が返されて出力されます。
ジェネレーター関数を呼び出して返されたオブジェクトのプロパティを出力して、何が起こっているかを確認できます:

リーリー

上で説明したように、fab を呼び出すだけでは関数はすぐに値を返し始めません。fab(5) の出力された属性リストから、ジェネレーター関数によって返されるオブジェクトには __iter__ と next の実装が含まれていることがわかります。 。手動で実装する場合と比較して、yield を使用すると、必要な機能を実現するのに非常に便利で、コードの量も大幅に削減されます。

ジェネレーター式
Python でイテレータ オブジェクトをよりエレガントに生成するもう 1 つの方法は、ジェネレータ式を使用することです。これは、角括弧 [] を () に変更するだけの書き方です。確かに全く違います:

リーリー
上記の yield の説明を読んだ後、この例と対応する出力ログは、temp_gen の印刷ログの説明、for ステートメントのトラバーサルの出力結果、または dir を呼び出して出力された属性リストのいずれであっても、すべて明確です。世代を示します。 iterator 式は、反復をサポートできるオブジェクトを生成します。さらに、式内で関数を呼び出して、適切なフィルタリング条件を追加することもできます。

組み込みライブラリ itertools および iter
Python の組み込みライブラリ itertools は、効率的なトラバーサルと反復を実行できるオブジェクトの作成に役立つツール メソッドを多数提供します。これには、chain、izip/izip_longest、組み合わせ、ifilter など、多くの興味深い便利なメソッドが含まれています。待って。 Python には非常に便利な組み込みの iter 関数もあります。この関数はイテレータ オブジェクトを返すことができ、対応するヘルプ ドキュメントを簡単に参照できます。
リーリー

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。