Pythonイテレータ
Pythonイテレータ
イテレータは、数えられる数の値を含むオブジェクトです。
イテレータは反復可能なオブジェクトであり、すべての値を横断できることを意味します。
技術的には、Pythonでは、イテレータはメソッド__iter__()
と__next__()
で構成されるイテレータプロトコルを実装するオブジェクトです。
イテレータとイテラブル
リスト、タプル、辞書、セットはすべて反復可能なオブジェクトです。これらは反復子を取得できる反復可能な*コンテナー*です。
これらすべてのオブジェクトには、反復子を取得するために使用されるiter()
メソッドがあります。
例
タプルから反復子を返し、各値を出力します。
mytuple = ("りんご", "バナナ", "さくらんぼ")
myit = iter(mytuple)
print(next(myit))
print(next(myit))
print(next(myit))
文字列も反復可能なオブジェクトであり、反復子を返すことができます。
例
文字列も反復可能なオブジェクトであり、一連の文字が含まれます。
mystr = "バナナ"
myit = iter(mystr)
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
イテレータのループ
for
ループを使用して、反復可能なオブジェクトを反復処理することもできます。
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__()
:
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)プログラミング学習を加速させる
プログラミングをプロの講師に教えてもらいませんか。