🔖

Pythonの初心者レッスンーーイテレータとジェネレータ

2024/06/23に公開

シーリズの目次

Pythonの初心者レッスンをここにまとめています。
https://zenn.dev/datasciencekun/articles/319e0f4b4021c5

Pythonにおけるイテレータ(Iterator)とジェネレータ(Generator)は、反復処理を行うための重要なツールです。以下でそれぞれについて詳しく説明します。

イテレータ(Iterator)

イテレータは、要素を一つずつ順に返すオブジェクトのことです。Pythonでは、イテレータは以下の2つのメソッドを実装するオブジェクトとして定義されます:

  • iter(): イテレータオブジェクト自身を返すメソッド。
  • next(): 次の要素を返すメソッド。要素がなくなった場合はStopIteration例外を投げます。

イテレータの作成方法

  1. 組み込みのイテラブルオブジェクトから作成
my_list = [1, 2, 3, 4, 5]
iterator = iter(my_list)

print(next(iterator))  # 出力: 1
print(next(iterator))  # 出力: 2
  1. カスタムイテレータの作成
class Counter:
    def __init__(self, start, end):
        self.current = start
        self.end = end
    
    def __iter__(self):
        return self
    
    def __next__(self):
        if self.current >= self.end:
            raise StopIteration
        else:
            self.current += 1
            return self.current - 1

counter = Counter(1, 5)
for number in counter:
    print(number)  # 出力: 1 2 3 4

イテレータの使用

my_list = [1, 2, 3, 4, 5]
iterator = iter(my_list)

while True:
    try:
        print(next(iterator))
    except StopIteration:
        break

ジェネレータ(Generator)

ジェネレータは、特殊なタイプのイテレータであり、通常の関数内でyieldステートメントを使って値を一つずつ返すものです。ジェネレータは一時停止と再開が可能で、メモリ効率が非常に高いです。
ジェネレータの作成方法

  1. ジェネレータ関数
def count_up_to(max):
count = 1
while count <= max:
    yield count
    count += 1

counter = count_up_to(5)
for number in counter:
    print(number)  # 出力: 1 2 3 4 5
  1. ジェネレータ式
gen = (x**2 for x in range(1, 6))
for number in gen:
    print(number)  # 出力: 1 4 9 16 25

ジェネレータの使用

def fibonacci(n):
    a, b = 0, 1
    while a < n:
        yield a
        a, b = b, a + b

for number in fibonacci(10):
    print(number)  # 出力: 0 1 1 2 3 5 8

ジェネレータの使用2

def countdown(n):
    while n > 0:
        yield n
        n -= 1
 
# ジェネレータを作る
generator = countdown(5)
 
# イテレータで結果をもらう
print(next(generator))  # 出力: 5
print(next(generator))  # 出力: 4
print(next(generator))  # 出力: 3
 
# forループを使う
for value in generator:
    print(value)  # 输出: 2 1

イテレータとジェネレータの違い

特性 イテレータ ジェネレータ
定義方法 クラスで__iter__()__next__()を実装 yieldを使った関数
作成 iter()関数でイテラブルから作成 ジェネレータ関数やジェネレータ式で作成
メモリ効率 通常のイテレータと同じ 非常に高い(必要なときに要素を生成)
状態保持 内部的に状態を保持 一時停止と再開が可能
例外処理 StopIterationで終了 StopIterationで終了

Discussion