前のパートの導入により、Python の反復可能なオブジェクトとイテレータ (Iterable と Iterator) を理解し、習得することが容易になります。このコンテンツでは、イテレータに関連するコンテンツをさらに紹介します。
イテレータ プロトコル
オブジェクトのこのメソッドは、反復子オブジェクト自体を返します。これは、コンテナーとイテレーターを for-in ステートメントで使用するために必要です。また、組み込みの iter() 関数を使用することもできます。この関数は基本的に __iter__() メソッドをバックグラウンドで呼び出します。
2)__next__():イテレータから次の項目を返します。他に項目がない場合は、StopIteration 例外がスローされます。組み込みの next() 関数を使用して次の項目を読み取ることもできます。これは基本的に __next__() メソッドを呼び出します。
前に述べたように、リスト、タプル、辞書、セットはすべて反復可能な型です。つまり、イテレータを取得できる型です。例を見てください:
コード スニペット リスト-01
入力結果は次のとおりです:
A B C
サンプル コードでは、タプルの反復を定義します。次に、この反復可能オブジェクトに対して iter() 関数を呼び出します。 iter() 関数は、tupIter という名前の反復子を返します。次に、 next() 関数を複数回呼び出します。 next() 関数が実行されるたびに、イテレータ内の次の項目が自動的に返されます。
次のサンプル コードを見てください:
コード スニペット-02
実行出力の結果は次のとおりです:
P y
上記のコード リストでは、文字列オブジェクトに対して __ iter__() メソッドが呼び出されます。 String オブジェクトは反復子プロトコルを実装しているため、文字列は一連の文字を含む反復可能なオブジェクトです。 __iter__() メソッドを呼び出すと、イテレータが直接返されます。次に、返されたイテレータを介して __next__() メソッドを呼び出し、イテレータ内の要素を 1 つずつ出力します。
簡単に言えば、オブジェクトがイテレータ プロトコルを実装している限り、オブジェクトは上記 2 つのメソッドに従って繰り返し呼び出すことができます。
反復子の走査
前の紹介で見たように、next() 関数 (または __next__() メソッド) を使用して反復子の項目を手動で走査します。 next() 関数がイテレータの最後に到達すると、返すデータがなくなり、StopIteration 例外が発生します。
例を参照してください:
コード スニペット リスト-03
上記のプログラムを実行すると、出力は次のようになります。 :
##20 #30 ##トレースバック (最後の呼び出し): # #ファイル ……、 print(next(listIter)) 反復の停止 上記のコードでは、next() 関数が 4 回呼び出されます。これはイテレータ内の項目の数を超えています。最後の呼び出しでは、反復子の要素が反復されたため、StopIteration 例外がスローされました。さらに、手動反復の完了後に例外が確実にスローされるようにするには、例外処理を自分で実行する必要があります。そうしないと、以降の実行が正常に実行されなくなります。 認識する必要があるのは、ほとんどのシナリオでは、次のメソッドを自分で手動で呼び出す必要がないということです。Python の for ループは、イテレータを返すことができるオブジェクトを自動的に走査できます。言い換えれば、for ループは Python の任意の反復可能なオブジェクトを反復できます。 例を参照してください: コード リスト スニペット 04 上記のコードでは、for ループを使用してリストを走査します。前に定義しました。 next() 関数を手動で使用していないこと、および StopIteration 例外が発生していないことは明らかです。これが Python の for ループの利点です。これらすべてを舞台裏で処理してくれます。 もちろん、この方法でループの反復を自分で処理することもできます。次に、独自のバージョンの for ループを定義します。 while ループを使用して、for ループの動作を複製します。ここでは、この実装に必要なものすべてを自分たちで構築します。以下に示すように: コード リスト スニペット-05 上記のリストでは、シミュレートされた for ループの独自のバージョンを実装しました。コードでは無限 while ループが使用されています: while True。 Try-Except ブロックはループ内に設定されます。 try ブロックで、反復子の __next__() メソッドを呼び出して次の要素を取得します。呼び出しが成功すると、要素が出力されます。 StopIteration タイプのエラーが発生した場合、例外は例外ブロックでキャッチされます。例外ブロックで行うことは非常に簡単です。このループから抜け出すだけです。これは、反復子の終わりに到達したことを意味します。 この記事は以上です。主にイテレータ プロトコルとイテレータ トラバーサルについて紹介します。コンテンツのテキストは長くないため、コードと組み合わせることで、これらの Python プログラミングの知識ポイントをより深く理解し、習得することができます。 |
以上がPython プログラミングにおけるイテレータ プロトコルとトラバーサル メソッドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。