ホームページ >バックエンド開発 >Python チュートリアル >Python プログラミングにおけるイテレータ プロトコルとトラバーサル メソッド

Python プログラミングにおけるイテレータ プロトコルとトラバーサル メソッド

WBOY
WBOY転載
2023-05-08 14:34:08955ブラウズ

はじめに

前のパートの導入により、Python の反復可能なオブジェクトとイテレータ (Iterable と Iterator) を理解し、習得することが容易になります。このコンテンツでは、イテレータに関連するコンテンツをさらに紹介します。

Python プログラミングにおけるイテレータ プロトコルとトラバーサル メソッドイテレータ プロトコル

Python では、イテレータ (Iterator) オブジェクトは次の 2 つのメソッドをサポートする必要があります。これらは一緒になってイテレータ プロトコルを形成します。

1) __iter__():

オブジェクトのこのメソッドは、反復子オブジェクト自体を返します。これは、コンテナーとイテレーターを for-in ステートメントで使用するために必要です。また、組み込みの iter() 関数を使用することもできます。この関数は基本的に __iter__() メソッドをバックグラウンドで呼び出します。

2)__next__():

イテレータから次の項目を返します。他に項目がない場合は、StopIteration 例外がスローされます。組み込みの next() 関数を使用して次の項目を読み取ることもできます。これは基本的に __next__() メソッドを呼び出します。

前に述べたように、リスト、タプル、辞書、セットはすべて反復可能な型です。つまり、イテレータを取得できる型です。例を見てください:

Python プログラミングにおけるイテレータ プロトコルとトラバーサル メソッドコード スニペット リスト-01

入力結果は次のとおりです:

A
B
C

サンプル コードでは、タプルの反復を定義します。次に、この反復可能オブジェクトに対して iter() 関数を呼び出します。 iter() 関数は、tupIter という名前の反復子を返します。次に、 next() 関数を複数回呼び出します。 next() 関数が実行されるたびに、イテレータ内の次の項目が自動的に返されます。

次のサンプル コードを見てください:

Python プログラミングにおけるイテレータ プロトコルとトラバーサル メソッド コード スニペット-02

実行出力の結果は次のとおりです:

P
y

上記のコード リストでは、文字列オブジェクトに対して __ iter__() メソッドが呼び出されます。 String オブジェクトは反復子プロトコルを実装しているため、文字列は一連の文字を含む反復可能なオブジェクトです。 __iter__() メソッドを呼び出すと、イテレータが直接返されます。次に、返されたイテレータを介して __next__() メソッドを呼び出し、イテレータ内の要素を 1 つずつ出力します。

簡単に言えば、オブジェクトがイテレータ プロトコルを実装している限り、オブジェクトは上記 2 つのメソッドに従って繰り返し呼び出すことができます。

反復子の走査

前の紹介で見たように、next() 関数 (または __next__() メソッド) を使用して反復子の項目を手動で走査します。 next() 関数がイテレータの最後に到達すると、返すデータがなくなり、StopIteration 例外が発生します。

例を参照してください:

Python プログラミングにおけるイテレータ プロトコルとトラバーサル メソッドコード スニペット リスト-03

上記のプログラムを実行すると、出力は次のようになります。 :

10

##20

#30

##トレースバック (最後の呼び出し):

# #ファイル ……、

print(next(listIter))

反復の停止

上記のコードでは、next() 関数が 4 回呼び出されます。これはイテレータ内の項目の数を超えています。最後の呼び出しでは、反復子の要素が反復されたため、StopIteration 例外がスローされました。さらに、手動反復の完了後に例外が確実にスローされるようにするには、例外処理を自分で実行する必要があります。そうしないと、以降の実行が正常に実行されなくなります。

認識する必要があるのは、ほとんどのシナリオでは、次のメソッドを自分で手動で呼び出す必要がないということです。Python の for ループは、イテレータを返すことができるオブジェクトを自動的に走査できます。言い換えれば、for ループは Python の任意の反復可能なオブジェクトを反復できます。

例を参照してください:

Python プログラミングにおけるイテレータ プロトコルとトラバーサル メソッド

コード リスト スニペット 04

上記のコードでは、for ループを使用してリストを走査します。前に定義しました。 next() 関数を手動で使用していないこと、および StopIteration 例外が発生していないことは明らかです。これが Python の for ループの利点です。これらすべてを舞台裏で処理してくれます。

もちろん、この方法でループの反復を自分で処理することもできます。次に、独自のバージョンの for ループを定義します。 while ループを使用して、for ループの動作を複製します。ここでは、この実装に必要なものすべてを自分たちで構築します。以下に示すように:

Python プログラミングにおけるイテレータ プロトコルとトラバーサル メソッド

コード リスト スニペット-05

上記のリストでは、シミュレートされた for ループの独自のバージョンを実装しました。コードでは無限 while ループが使用されています: while True。 Try-Except ブロックはループ内に設定されます。 try ブロックで、反復子の __next__() メソッドを呼び出して次の要素を取得します。呼び出しが成功すると、要素が出力されます。 StopIteration タイプのエラーが発生した場合、例外は例外ブロックでキャッチされます。例外ブロックで行うことは非常に簡単です。このループから抜け出すだけです。これは、反復子の終わりに到達したことを意味します。

概要

この記事は以上です。主にイテレータ プロトコルとイテレータ トラバーサルについて紹介します。コンテンツのテキストは長くないため、コードと組み合わせることで、これらの Python プログラミングの知識ポイントをより深く理解し、習得することができます。

以上がPython プログラミングにおけるイテレータ プロトコルとトラバーサル メソッドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事は51cto.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。