イテレータ

要素を順番に取り出すオブジェクト。

イテレータ
要素を順番に取り出すオブジェクト。
ジェネレータ
値を生成する関数。
イテラブル
イテレータを作成できるオブジェクト。
yield
ジェネレータで値を返すキーワード。
StopIteration
イテレータの終了を示す例外。

イテレータの基本

順番取り出し

イテレータは「順番取り出し」のようなもの。要素を順番に取り出すためのオブジェクトです。forループやリスト内包表記で広く使用されています。

なぜイテレータが必要か?

イテレータは、要素を順番に取り出すのに適しています。forループやリスト内包表記で広く使用されています。

いつ使うか?

  • 要素を順番に取り出す場合
  • forループを使用する場合
  • リスト内包表記を使用する場合
  • 大量のデータを処理する場合

実践テクニック

iter()を使う

iter()を使うことで、イテラブルからイテレータを作成できます。これにより、イテレータプロトコルを実装できます。

next()を使う

next()を使うことで、イテレータから次の要素を取得できます。これにより、イテレータを手動で進めることができます。

Iterator Basics
# イテレータの基本
numbers = [1, 2, 3, 4, 5]
iterator = iter(numbers)
print(next(iterator)) # 1
print(next(iterator)) # 2
print(next(iterator)) # 3
# イテレータプロトコル
class MyIterator:
def __init__(self, data):
self.data = data
self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index < len(self.data):
result = self.data[self.index]
self.index += 1
return result
else:
raise StopIteration
my_iter = MyIterator([1, 2, 3])
for item in my_iter:
print(item)

ジェネレータ

遅延評価

ジェネレータは「遅延評価」のようなもの。値を必要なときに生成するための関数です。メモリ効率が良く、大量のデータを処理する場合に有効です。

なぜジェネレータが必要か?

ジェネレータは、値を必要なときに生成するのに適しています。メモリ効率が良く、大量のデータを処理する場合に有効です。

いつ使うか?

  • 大量のデータを処理する場合
  • メモリ効率を重視する場合
  • 無限シーケンスを作成する場合
  • 遅延評価を行う場合

実践テクニック

yieldを使う

yieldを使うことで、ジェネレータを作成できます。これにより、値を必要なときに生成できます。

ジェネレータ式を使う

ジェネレータ式を使うことで、簡潔にジェネレータを作成できます。これにより、コードを簡潔に記述できます。

Generators
# ジェネレータの基本
def my_generator():
yield 1
yield 2
yield 3
gen = my_generator()
print(next(gen)) # 1
print(next(gen)) # 2
print(next(gen)) # 3
# ジェネレータ式
numbers = [1, 2, 3, 4, 5]
squared = (x * x for x in numbers)
for num in squared:
print(num)

イテレータプロトコル

インターフェース

イテレータプロトコルは「インターフェース」のようなもの。イテレータを実装するためのルールです。__iter__()と__next__()メソッドを実装する必要があります。

なぜイテレータプロトコルが必要か?

イテレータプロトコルは、イテレータを実装するのに適しています。__iter__()と__next__()メソッドを実装する必要があります。

いつ使うか?

  • カスタムイテレータを作成する場合
  • forループで使用できるオブジェクトを作成する場合
  • イテレータプロトコルを実装する場合

実践テクニック

__iter__()を実装する

__iter__()を実装することで、イテレータを返すことができます。これにより、forループで使用できます。

__next__()を実装する

__next__()を実装することで、次の要素を返すことができます。要素がない場合はStopIterationを投げる必要があります。

合格ライン

イテレータを作成できる
ジェネレータを作成できる
イテレータプロトコルを実装できる
イテレータの使い分けができる

演習課題

課題1: イテレータの作成
イテレータを作成し、要素を順番に取り出してください。
課題2: ジェネレータの作成
ジェネレータを作成し、値を生成してください。
課題3: イテレータプロトコルの実装
イテレータプロトコルを実装し、forループで使用してください。

参考文献

この記事は以下の公的ガイドライン/標準に基づいています。