🔖
Pythonの初心者レッスンーーイテレータとジェネレータ
シーリズの目次
Pythonの初心者レッスンをここにまとめています。
Pythonにおけるイテレータ(Iterator)とジェネレータ(Generator)は、反復処理を行うための重要なツールです。以下でそれぞれについて詳しく説明します。
イテレータ(Iterator)
イテレータは、要素を一つずつ順に返すオブジェクトのことです。Pythonでは、イテレータは以下の2つのメソッドを実装するオブジェクトとして定義されます:
- iter(): イテレータオブジェクト自身を返すメソッド。
- next(): 次の要素を返すメソッド。要素がなくなった場合はStopIteration例外を投げます。
イテレータの作成方法
- 組み込みのイテラブルオブジェクトから作成
my_list = [1, 2, 3, 4, 5]
iterator = iter(my_list)
print(next(iterator)) # 出力: 1
print(next(iterator)) # 出力: 2
- カスタムイテレータの作成
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ステートメントを使って値を一つずつ返すものです。ジェネレータは一時停止と再開が可能で、メモリ効率が非常に高いです。
ジェネレータの作成方法
- ジェネレータ関数
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
- ジェネレータ式
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