ホームページ  >  記事  >  バックエンド開発  >  Python イテレータとジェネレータの混同されやすい概念

Python イテレータとジェネレータの混同されやすい概念

零下一度
零下一度オリジナル
2017-07-17 09:58:131289ブラウズ

イテレーターとジェネレーター

イテレーターとジェネレーターは、Python でよく使用され、混同されやすい 2 つの概念です。今日は、それらを整理し、よく使用される例をいくつか示します。

for文と反復可能オブジェクト(反復可能オブジェクト):

for i in [1, 2, 3]:

print(i)

obj = {"a": 123, "b": 456}

for k in obj:

print(k)

for ステートメントでループに使用できるこれらのオブジェクトは、反復可能なオブジェクトです。 for ステートメントで反復できる組み込みのデータ型 (リスト、タプル、文字列、辞書など) に加えて、一連の要素を含むコンテナを自分で作成することもでき、各要素をループすることもできます。この A コンテナはイテレータです。

for ループは、シーケンス、タプル、文字列など、Python のあらゆるシーケンス型に使用できます。例:

>>> for x in [1,2,3,4]: print(x * 2,end='')
...
2468

>>> x in (1,2,3,4): print(x * 2,end='')
...
2468

>>> 'Python' の y: print(y * 2 , end =' ')
...
pp yy tt hh oo nn

実際、for ループはこれよりもさらに一般的であり、任意の反復可能なオブジェクトで使用できます。 for は反復ツールとして考えることができ、他にもメンバーシップ テストにおけるリスト分析、マップ組み込み関数などの例があります。

ファイル反復子

File には __next__ というメソッドがあり、呼び出されるたびにファイル内の次の行を返します。ファイルの終わりに到達すると、__next__ は空の文字列を返すのではなく、組み込みの StopIteration 例外を発生させることに注意してください。

例:

ここでの出力では、常に end='' を使用して n を追加していることに注意してください。これは、行文字列には既に n が含まれているためです (これがないと、出力は 2 行に分かれたものになります)。

この方法でファイルを読み取ることには 3 つの利点があります:

1. 書き込み方法が簡単

2. メモリ使用量の面でも最高です

同じ効果を持つオリジナルの方法、 for ループは、ファイルの readlines メソッドを呼び出します。これにより、ファイルがメモリにロードされ、行文字列のリストが作成されます。

2 つの効果は同じですが、後者はファイルを一度にメモリにロードします。ファイルが大きすぎると、コンピュータのメモリ領域が十分ではなくなり、動作しない可能性があります。以前の反復子のバージョンには、この問題に対する耐性があります。 (Python3 では、Unicode テキストをサポートするように i/o を書き換えることで、これが少しわかりにくくなり、システムへの依存度が低くなります)

もちろん、while ループを使用して実装することもできますが、相対的に言えば、while は依然として for よりも遅いです。

手動反復: iter と next

コードの手動反復をサポートするために、python3 はオブジェクトの __next__ メソッドを自動的に使用する組み込み関数 next も提供します。反復可能なオブジェクト z を指定すると、 next(z) の呼び出しは z.__next__() と同等ですが、前者の方がはるかに簡単です。例:

技術的な観点から見ると、for ループが開始されると、それを介して iter 組み込み関数が与えられ、反復可能オブジェクトから反復子を取得します。返されるオブジェクトには、次のメソッドが必要です。

リストや他の多くの組み込みオブジェクトは、反復子を複数回開くことをサポートしているため、それ自体は反復子ではありません。このようなオブジェクトの場合、反復を開始するには iter を呼び出す必要があります:

技術的には、for ループは、ここで使用されている next(I) の代わりに、I.__next__ の内部同等物を呼び出します

次に、次の間の自動等価性を示します。手動反復:

アクションを実行し、操作中に発生する例外をキャプチャするための try ステートメントについては、後で詳しく説明する記事を公開します。

以上がPython イテレータとジェネレータの混同されやすい概念の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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