Pythonを学ぶなかで、イテラブル
、イテレーター
、ジェネレータ式
という存在に直面しました、、
これらはデータの処理やアルゴリズムの実装において非常に重要なものだそう。
本記事では、これらの概念をなるべく簡潔にまとめてみました。
イテラブル (Iterable)
イテラブルは、メンバーを一つずつ返すことができるオブジェクトです。
リスト、タプル、文字列、辞書など、Pythonの多くの組み込みデータ型がイテラブルです。
特徴
- forループで繰り返し処理が可能
- イテレーターに変換できる(
iter()
関数を使用)。
例
python
my_list = [1, 2, 3]
for item in my_list:
print(item)
#->1
#->2
#->3
イテラブルではないもの
イテラブルでないとは、forループなどを使い、その要素を一つずつ取り出すことができないことを意味します。
整数 (int)
整数は単一の数値を表すため、イテラブルではありません。例えば、for i in 5:のようなコードはエラーを引き起こします。
浮動小数点数 (float)
浮動小数点数も単一の数値を表すため、イテラブルではありません。
論理値 (bool)
TrueやFalseのような論理値もイテラブルではありません。
NoneType
Noneは特別な値で、何も値を持たないことを表します。イテラブルではありません。
イテレーター (Iterator)
イテレーターは、next()
関数を使用して次の要素を返すオブジェクトです。
イテラブルからiter()
関数を使って生成されます。
特徴
-
next()
関数を使って、次の要素を取得する - 要素がなくなると、StopIteration例外を発生させる
-イテラブルよりも低レベルで、より制御が細かい
例
python
my_list = [1, 2, 3]
my_iter = iter(my_list)
print(next(my_iter)) # 1
print(next(my_iter)) # 2
# my_iterにはもう要素がない場合、next(my_iter)はStopIterationを発生させる
ジェネレータ式 (Generator Expression)
ジェネレータ式は、リスト内包表記に似た構文を用いて、一連の値を遅延評価で生成します。
ジェネレータはイテレーターの一種で、一度に一つの要素しかメモリに保持しません。
特徴
- 大量のデータを扱う場合にメモリ効率が良い
- 必要に応じて一つずつ値を生成し、
next()
でアクセスする - リスト内包表記よりもメモリ使用量が少ない
python
my_gen = (x * 2 for x in range(3))
for item in my_gen:
print(item) # 0, 2, 4