Pythonのイテレータ
- 前のページ Pythonの継承
- 次のページ Pythonのスコープ
Pythonのイテレータ
イテレータは値の可数数字を含むオブジェクトです。
イテレータはイテレーション可能なオブジェクトであり、すべての値を遍历することができます。
技術的には、Pythonでは、イテレータプロトコルを実装するオブジェクトがイテレータです。これには、以下のメソッドが含まれます __iter__()
そして __next__()
。
イテレータ VS イテレーション可能オブジェクト(イテレブル)
リスト、タプル、辞書、セットはすべてイテレーション可能なオブジェクトです。これらはイテレーション可能なコンテナで、そこからイテレータ(イテレータ)を取得できます。
これらのすべてのオブジェクトには、イテレータを取得するための iter()
メソッド:
インスタンス
タプルからイテレータを返し、各値を印刷します:
mytuple = ("apple", "banana", "cherry") myit = iter(mytuple) print(next(myit)) print(next(myit)) print(next(myit))
文字列もイテレーション可能なオブジェクトであり、イテレータを返すことができます:
インスタンス
文字列もイテレーション可能なオブジェクトであり、一連の文字を含んでいます:
mystr = "banana" myit = iter(mystr) print(next(myit)) print(next(myit)) print(next(myit)) print(next(myit)) print(next(myit)) print(next(myit))
イテレータの遍历
forループを使用して、イテレーション可能なオブジェクトを遍历することもできます:
インスタンス
タプルの値をイテレートします:
mytuple = ("apple", "banana", "cherry") for x in mytuple: print(x)
インスタンス
文字列内の文字をイテレートします:
mystr = "banana" for x in mystr: print(x)
ヒント:forループは実際にはイテレータオブジェクトを作成し、各ループ実行時に next()
される方法があります。
イテレータの作成
オブジェクト/クラスをイテレータとして作成するには、オブジェクトに __iter__()
そして __next__()
される方法があります。
Pythonのクラス/オブジェクトの章で学んだように、すべてのクラスには名前が __init__()
オブジェクトを作成する際に初期化を行うことができる関数です。
__iter__()
メソッドの役割は似ており、操作(初期化など)を実行できますが、常にイテレータオブジェクト自身を返す必要があります。
__next__()
メソッドも操作を実行することを許可し、シーケンスの次のプロジェクトを返す必要があります。
インスタンス
数字を返すイテレータを作成し、1から始め、各シーケンスは1増加します(1、2、3、4、5などを返します):
class MyNumbers: def __iter__(self): self.a = 1 return self def __next__(self): x = self.a self.a += 1 return x myclass = MyNumbers() myiter = iter(myclass) print(next(myiter)) print(next(myiter)) print(next(myiter)) print(next(myiter)) print(next(myiter))
StopIteration
十分な next()
文を使用したり、forループ内で使用することができます。上記の例では、永遠に続いてしまいます。
イテレーションが永遠に続かないようにするために、 StopIteration
文。
において、 __next__()
メソッド内で、イテレーションが指定された回数に達した場合、エラを発生させるための終了条件を追加できます:
インスタンス
20回のイテレーション後に停止:
class MyNumbers: def __iter__(self): self.a = 1 return self def __next__(self): if self.a <= 20: x = self.a self.a += 1 return x else: raise StopIteration myclass = MyNumbers() myiter = iter(myclass) for x in myiter: print(x)
- 前のページ Pythonの継承
- 次のページ Pythonのスコープ