Python ではイテレータ プロトコルはどのように定義されますか?

WBOY
リリース: 2023-10-24 08:43:47
オリジナル
1169 人が閲覧しました

Python ではイテレータ プロトコルはどのように定義されますか?

Python のイテレータ プロトコルはどのように定義されていますか?

Python では、イテレータ (Iterator) は、イテレータ プロトコル (Iterator Protocol) を実装するオブジェクトです。イテレータ プロトコルは、イテレータ オブジェクトの動作を定義する標準仕様です。イテレータ プロトコルを実装するオブジェクトは、iter() 関数と next() 関数を使用して要素に 1 つずつアクセスできます。

イテレータ プロトコルには 2 つのメソッドが含まれています。

  1. __iter__(): イテレータ オブジェクト自体を返します。このメソッドにより、反復子オブジェクトを for ループ内で使用できるようになります。
  2. __next__(): イテレータの次の要素を返します。次の要素がない場合は、StopIteration 例外がスローされます。

具体的なコード例を通じてイテレータ プロトコルの実装を理解しましょう。

class MyIterator:
    def __init__(self, data):
        self.data = data
        self.index = 0
    
    def __iter__(self):
        return self
    
    def __next__(self):
        if self.index >= len(self.data):
            raise StopIteration
        value = self.data[self.index]
        self.index += 1
        return value

# 创建一个可迭代对象
my_list = [1, 2, 3, 4, 5]
my_iterator = MyIterator(my_list)

# 使用for循环迭代
for item in my_iterator:
    print(item)

# 手动迭代
while True:
    try:
        item = next(my_iterator)
        print(item)
    except StopIteration:
        break
ログイン後にコピー

上の例では、カスタム反復子クラス MyIterator を実装しました。入力データとしてリストを受け取り、__next__() メソッドが呼び出されるたびにリスト内の次の要素を返します。リストの最後まで反復すると、反復の終了を通知するために StopIteration 例外がスローされます。

MyIterator オブジェクトを使用する場合、for ループを通じて要素を反復処理するか、next() 関数を使用して次のことを行うことができます。スローされるまで手動で繰り返します。 StopIteration 例外が発生しました。

イテレータ プロトコルを実装するオブジェクトのみを反復できることに注意してください。オブジェクトが __iter__() メソッドを実装し、反復子オブジェクトを返す場合、そのオブジェクトは反復可能です。 iter() 関数を使用して、この反復可能オブジェクトのイテレータを取得できます。上記のコード例では、MyIterator クラスに __iter__() メソッドを実装し、self オブジェクトを返し、MyIteratorThe を作成しました。オブジェクト自体は反復可能なオブジェクトになります。

つまり、反復子プロトコルは反復子オブジェクトの動作を定義する仕様です。 Python では、要素に 1 つずつアクセスする __iter__() メソッドと __next__() メソッドを実装することでイテレータ オブジェクトを実装できます。この反復子プロトコルの実装により、便利で効率的かつ柔軟な反復操作方法が提供されます。

以上がPython ではイテレータ プロトコルはどのように定義されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート