「各要素に順番にアクセスする」パターンです。
Pythonはビルトインの形でIteratorをサポートしています。
例えば、リストをfor文に渡すと変数に代入してくれるのも、Iteratorをサポートしているからです。
l = [1, 2, 3]
for i in l:
print(i)
以下の例では、PythonのIteratorについていくつか紹介をします。
Iteratorを自作します。
シンプルに、10, 20, 30という3つの数字を順番に出力するHoge
クラスを作成します。
def main():
my_iterator = Hoge(10, 20, 30)
for num in my_iterator:
print(num)
class Hoge:
def __init__(self, *numbers):
self._numbers = numbers
self._i = 0
def __iter__(self):
print("__iter__ is called")
return self
# return "hoge" # => TypeError: iter() returned non-iterator of type 'str'
def __next__(self):
print("__next__ is called")
if self._i == len(self._numbers):
raise StopIteration()
value = self._numbers[self._i]
self._i += 1
return value
if __name__ == "__main__":
main()
あるオブジェクトがイテレータを期待するコンテクストに置かれると、
(例:for i in object:
となると)
__iter__
メソッドが呼ばれる__next__
メソッドが呼ばれるStopIteration()
をraiseすると繰り返しが止まる上記3つの処理が走ります。
したがって、上のようなコードを書くと、本来のfor文の挙動を再現することができます。
Pythonのビルトイン機能を使うことで特に意識することなくIteratorを使用できます。
特になし