このページの目的は、2 つの反復プロトコルのダイナミクスを示すことです:
- 反復可能
- イテレーター
1. ただし、最初に (紛らわしい類似の単語に追加するため)、反復について説明しましょう
- 反復は、もちろん、ソースから項目を 1 つずつ取得し、それぞれに対して順番に何かを行うことです
- Python では、これは一般的に次のように使用されます。
- a) for/while ループと
- b) 内包表記
- デフォルトでは、これらの構造は構造全体を反復します
- ただし、ジェネレーター のように、よりきめの細かい制御が必要になる場合もあります。
- このために、2 つの重要な概念/プロトコルがあり、その上に Python の大部分が構築されています。
- a) 反復可能なオブジェクト
- b) イテレータオブジェクト
- 両方とも標準の Python プロトコルに反映されます
- これは特別なことではありません。実際、for/while ループと内包表記は反復プロトコルのこれらの下位レベルの要素に直接構築されます
2. ITER() メソッドは反復可能オブジェクトから反復子を作成します
-
反復可能なオブジェクト (オブジェクトのコレクションまたはストリーム) は、組み込みの iter() 関数
に渡すことができる任意のオブジェクトです。
- 組み込み iter() 関数が渡されると、渡された型の イテレータ オブジェクト が返されます。つまり、文字列イテレータは次のように作成されます。
>>> example_iterator = iter('abc')
>>> example_iterator
<str_iterator object at 0x063DCE38>
- イテレータは、基礎となるシーケンシャル データセット への シーケンシャル
(ランダムではありません!) アクセスを提供する暗黙的なシーケンス オブジェクトであることに注意してください。
- たとえば、range オブジェクト自体はイテレータではありません
- 反復子は、基礎となるシリーズの任意の要素へのアクセスを許可しません
- シリーズの 次の 要素へのアクセスのみを提供します
- それらは順次アクセスを提供します
<!-- THIS IS NOT AN ITERATOR -->
>>> r = range(10)[5]
>>> r
5
3. NEXT() 関数はイテレータから次の値を返します
- 組み込み next() には iterator オブジェクトが必要です。コレクションの反復で次の値を返します
- イテレータは 2 つのコンポーネントで構成されます:
- コレクションの次の要素を取得するメカニズム
- シリーズの終了を知らせるメカニズム
オブジェクト システムが組み込まれたプログラミング言語では、この抽象化は通常、クラスによって実装できる特定のインターフェイスに対応します
-
next() を使用すると、最初から最後までシリーズ全体ではなく、リクエストに応じて各項目を順番に検討できます
- 反復子インターフェイスには 2 つのメッセージが含まれています
-
next → 次の要素のクエリ
-
iter → イテレータを返します
- 制約: イテレータは 1 回反復可能
4. クラスルームの例 - 反復可能から反復子、停止例外まで
- Python は、StopIteration タイプの 例外 を自由に発生させます。
>>> example_iterator = iter('abc')
>>> example_iterator
<str_iterator object at 0x063DCE38>
5. 実際の例 - 複数のコマンドライン入力の単体テスト
- リスト ["20.01", "y"] などの反復可能なオブジェクトを定義/取得します
- 反復可能なオブジェクトを iter() に渡す → 反復子オブジェクトを作成する
- コード内で入力関数が呼び出されるたびに、反復子オブジェクトを next() に渡してリストの次の値を生成します。
<!-- THIS IS NOT AN ITERATOR -->
>>> r = range(10)[5]
>>> r
5
- 初めて input() に遭遇すると、「20.01」値が渡されます。
- 2回目は「y」です
- 3 回目は例外となります
6. リンク
- https://mypy.readthedocs.io/en/stable/protocols.html#iteration-protocols
- 5.2 暗黙的なシーケンス - Python の SICP
以上がPython の Iterable と Iterator の説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。