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)

インスタンスを実行