Pythonイテレータとforループの違い

(*-*)浩
リリース: 2019-07-09 10:18:56
オリジナル
6195 人が閲覧しました

Iterator (イテレーター):イテレーター オブジェクトがイテレーターになるには、__iter__ メソッドと __next__ メソッドの両方を実装する必要があります。イテレータの場合、__iter__ はそれ自体を返し、__next__ はイテレータ内の次の値を返します。最後に要素がない場合、例外がスローされます (開発者は例外を確認できます)。

Pythonイテレータとforループの違い

1. イテレータは __iter__() メソッドを実装するため、反復可能なオブジェクトである必要があります (推奨学習: Python ビデオ チュートリアル)

2. iter() メソッド (クラス内の __iter__) を通じて、反復可能オブジェクトは反復子を返すことができます。

3. イテレータの __iter__ メソッドはそれ自体を返し、新しいイテレータ オブジェクトを生成しません。

3 番目のプロパティは、反復可能なオブジェクトを繰り返し走査できる理由です (毎回独立した反復子を返すことで、異なる反復プロセスが相互に影響を与えないようにすることができます)。また、反復子はそれ自体を返すため、反復可能なオブジェクトのみを走査できます。一度通過する必要があります。

#for ループの動作メカニズム

オブジェクト自体がイテレータの場合、For ループの動作メカニズム:

Call_ _iter__ メソッドは、反復子であるそれ自体を返します。イテレータの next() メソッドを継続的に呼び出し、そのたびにイテレータ内の値を順番に返します。反復の最後に要素がない場合、例外 StopIteration がスローされます。

反復可能なオブジェクトでは、for ループの動作メカニズムが次のようになります。

最初に、 object は反復可能なオブジェクト ( __iter__ メソッドまたは __getitem__ メソッドがあるかどうかを判断するのと同じ) であり、存在しない場合はエラーが直接報告され、TypeError 例外がスローされます。その場合は、__iter__ メソッドを呼び出してイテレータを返します。イテレータの __next__ メソッドは Python 内で継続的に呼び出され、そのたびにイテレータ内の値が順番に返されます。反復の最後に要素がない場合、StopIteration 例外がスローされます。Python はこの例外を独自に処理し、開発者には公開しません。

さらに、Python の for ループは実際には 2 つのメカニズムと互換性があることに注意してください。

オブジェクトに __iter__ がある場合、イテレータが返されます。オブジェクトに __iter__ がなく、__getitem__ が実装されている場合は、代わりに添字反復が使用されます。 __getitem__ は、オブジェクトがカウントおよびスライス操作を実行するのに役立ちます。

for が __iter__ はないが __getitem__ があることを検出すると、IndexError が発生するまで対応する添字を 0 から読み取ります。これは古い反復プロトコルです。 iter メソッドもこの状況を処理し、__iter__ が存在しない場合は、代わりに添字反復を含むイテレータ オブジェクトを返します。重要な例は str です。文字列には __iter__ メソッドがありませんが、反復処理は可能です。その理由は、__getitem__ メソッドが for ループ中に呼び出されるからです。

Python 関連の技術記事の詳細については、

Python チュートリアル 列にアクセスして学習してください。

以上がPythonイテレータとforループの違いの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!