ホームページ  >  記事  >  バックエンド開発  >  Python での Iterator の使用に関するその他の話

Python での Iterator の使用に関するその他の話

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

イテレータは next() 操作をサポートするオブジェクトです。これには一連の要素が含まれており、 next() 操作が実行されると、要素の 1 つが返され、すべての要素が返されると、StopIteration 例外が生成されます。

リーリー

ite() は、リスト、タプル、辞書、セットなどのさまざまな Python オブジェクトをパラメーターとして受け入れ、それらをイテレーターに変換できます。イテレータは、for ステートメントまたはステートメント内で使用できます。多くの一般的な操作では、sum()、max() などの反復子もサポートされています。

リーリー

言うまでもなく、イテレータには多くの利点があります:

1.「ストリーミング」データ処理方法によりメモリ消費量が削減されます:
例えば、ファイルを処理する場合、いきなりすべてのデータを取り出してメモリに入れて処理すると、プログラムが大量のメモリを消費し、場合によっては処理が不可能になることもあります。パーツごと:

リーリー

2. XML ファイルを処理する場合:

リーリー

組み込み関数 open によって返されるファイル オブジェクトと、etree.iterparse によってシリアル化される XML ツリーはどちらも反復可能なオブジェクトであり、ファイルの内容を段階的に処理できます。

3. データを消費するための for ステートメントの使用の利便性をサポートします。
配列、リスト、文字列などの Python の一般的な組み込み型はすべて反復可能な型であるため、ヒューマン ループでインデックス位置を記録することなく、for ステートメントの糖衣構文を使用してデータを簡単に利用できます。

リーリー
イテレーターの利点を簡単に理解した後、Python のイテレーター モードについて真剣に話しましょう。

ここでは、反復可能オブジェクトと反復子オブジェクトという 2 つの複雑な用語を紹介します。個人的には、これら 2 つの概念から始めると反復子をよりよく理解できると思います。例を示す前に、これら 2 つの概念について大まかに説明しましょう:

Iterable オブジェクト: オブジェクトには __iter()__ メソッドの実装が含まれます。オブジェクトの iter 関数が呼び出された後、特定のデータ取得の実装を含むイテレーターが返されます。

Iterator: 次のメソッドの実装が含まれており、正しい範囲内で予期されるデータを返します。また、範囲を超えた後に反復を停止するために StopIteration エラーをスローできます。

例を挙げて、読みながら言ってください:

リーリー
例の iterable_range は反復可能なオブジェクトであるため、for ステートメントを使用してそれを反復処理することもできます。

リーリー

出力:

リーリー

出力ログを詳しく見ることができます:

データは確かに「ストリーミング」されています
  • イテレータは実際に舞台裏で作業を行う人です
  • for ステートメントは、オブジェクトのデータを非常に便利に反復できます。
  • 反復可能オブジェクトは実際には、制約、契約、仕様などの反復子パターン全体の上位層に似ており、実際の作業を実行する反復子オブジェクトを返すことができます。反復可能オブジェクトを受け入れる for や sum などのメソッドはすべてこの仕様に従います。つまり、オブジェクトの __iter__ 関数を呼び出し、反復子を返し、反復子オブジェクトによって返された各値を処理し、いくつかの要約操作を必要とします。例として挙げます:

リーリー

for の糖衣構文の背後にあるロジックは、上記の例のコードに示されているとおりです。まず、反復可能オブジェクトによって返される反復子オブジェクトを取得し、次に反復子オブジェクトの次のメソッドを呼び出して各値を取得し、任意の値を取得します。値を取得するプロセス中の時間 境界を検出します。つまり、StopIteration などのエラーがスローされるかどうかを確認します。イテレーター オブジェクトがエラーをスローした場合、反復は停止します (注: この例からわかるように、実際には、反復子オブジェクトは機能せず、TypeError: 非シーケンスに対する反復のようなエラーが報告される場合があります)。 もちろん、通常はアプリケーションのプロセス中にこれらを意図的に分離することはありません。イテレータ オブジェクトをわずかに変更して __iter__ メソッドの実装を追加することで、オブジェクト自体がイテラブル オブジェクトとイテレータ オブジェクトの両方になるようにすることができます。

リーリー

出力:

リーリー

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