Pythonイテレータ
Pythonイテレータ
イテレータは、カウント可能な数の値を含むオブジェクトです。
イテレータは反復可能なオブジェクトです。つまり、すべての値をトラバースできます。
技術的には、Pythonでは、イテレータはイテレータプロトコルを実装するオブジェクトであり、メソッド__iter__()
と。で構成されます__next__()
。
イテレータとイテレータ
リスト、タプル、辞書、およびセットはすべて反復可能なオブジェクトです。これらは 、イテレータを取得できる反復可能なコンテナです。
これらすべてのオブジェクトには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
for
上記の例は、十分なnext()ステートメントがある場合、またはループで使用された場合、永久に続き
ます。
反復が永遠に続くのを防ぐために、
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)