Python

【Python】第7章第3回:イテレータとジェネレータの基本

本記事では、Pythonのイテレータとジェネレータの基本を学び、効率的なデータ操作方法を理解します。初学者にもわかりやすく解説します。

0. 記事の概要

この記事を読むメリット

  • データ操作の効率化:イテレータとジェネレータを使用して、メモリ効率を向上させる方法を学べます。
  • Pythonの基礎理解:イテレータの仕組みやジェネレータの動作を理解します。
  • 実践的なスキル向上:データストリームを扱うコードを書けるようになります。

この記事で学べること

  • イテレータの基礎と活用例
  • ジェネレータの作成方法と利点
  • 実践的な応用例

1. イテレータとは?

1.1 基本概念

イテレータとは、要素を1つずつ順番に返すオブジェクトのことです。forループなどで使用されます。基本的な特性は以下の通りです。

  • イテラブルオブジェクト(リスト、タプルなど)から生成される
  • __iter__()__next__()メソッドを持つ

1.2 実例

# イテレータの例
numbers = [1, 2, 3, 4]
iterator = iter(numbers)

print(next(iterator))  # 1
print(next(iterator))  # 2
print(next(iterator))  # 3
print(next(iterator))  # 4
動作解説
  1. iter()を使用してリストからイテレータを生成します。
  2. next()でイテレータの次の要素を取得します。
  3. すべての要素が取得されるとStopIteration例外が発生します。

2. ジェネレータとは?

2.1 基本概念

ジェネレータは、イテレータを簡単に作成するための特殊な関数です。yieldを使用して値を一時的に返します。

2.2 実例

# ジェネレータの例
def simple_generator():
    yield 1
    yield 2
    yield 3

for value in simple_generator():
    print(value)
動作解説
  1. yieldステートメントを使用して、1つずつ値を返します。
  2. forループで自動的にnext()が呼び出されます。
  3. すべてのyieldが処理されると、ジェネレータは終了します。

3. 応用例:無限シーケンスの生成

3.1 ジェネレータを使用した無限シーケンス

# 無限シーケンスの生成
def infinite_sequence():
    num = 0
    while True:
        yield num
        num += 1

generator = infinite_sequence()
for _ in range(5):
    print(next(generator))  # 0, 1, 2, 3, 4
動作解説
  1. while Trueを使用して無限ループを作成します。
  2. 各ループでyieldを使って現在の値を返します。
  3. 呼び出すたびに値が1ずつ増加します。

4. 練習問題

以下の課題に挑戦してみましょう。

  1. イテレータを使用してリスト内の偶数を出力するコードを書いてください。
  2. ジェネレータを使ってフィボナッチ数列を生成してください。
  3. ジェネレータを使って特定の範囲の平方数を出力するプログラムを書いてください。

5. 練習問題の解答と解説

問1〜3の解答例

# 問1: イテレータで偶数を出力
numbers = [1, 2, 3, 4, 5, 6]
iterator = iter(numbers)
for num in iterator:
    if num % 2 == 0:
        print(num)

# 問2: フィボナッチ数列を生成
def fibonacci_generator():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b

fib_gen = fibonacci_generator()
for _ in range(5):
    print(next(fib_gen))  # 0, 1, 1, 2, 3

# 問3: 範囲内の平方数を生成
def square_generator(start, end):
    for num in range(start, end + 1):
        yield num ** 2

for square in square_generator(1, 5):
    print(square)  # 1, 4, 9, 16, 25

6. まとめ

本記事では、Pythonでのイテレータとジェネレータの基本を学びました。これらを活用して効率的なデータ操作を実現しましょう。