イテラブル(Iterable)、イテレーター(Iterator)、ジェネレーター(Generator)について使いこなしたいが、正直なんとなくしか分からないのでイメージしやすいように簡単にまとめました。
###イテラブル(Iterable)
繰り返しに使えるオブジェクト。list, dict, set, strクラスのオブジェクトはイテラブル。
簡単に言うとfor構文で使えるもの
###イテレーター(Iterator)
イテレーターは、イテラブルの一種(イテラブルは、イテレーターとは限らない)
簡単に言うとリストみたいなもの
next()で現在の要素を返し、次の要素に進めます
簡単に言うとリストみたいなものから空になるまで取り出していく
###ジェネレーター(Generator)
関数中に[yield 返り値]があると、その関数をジェネレーター関数と呼ぶ。また、リストの内包表記を角括弧から丸括弧に変えたものをジェネレーター式と呼ぶ。
例***(i for i in range(N))***
その関数や式の返り値をジェネレーターイテレーターと呼ぶ。
簡単に言うとイテレーターを返すものです。
def sample():
cumsum = 0
for i in range(1, 5):
cumsum += i
print(f'最初にこっち→{cumsum}')
yield cumsum
for cumsum in generator_sample2(): #ポイント
print(f'yieldの分→{cumsum}')
<出力結果>
最初にこっち→1
yieldの分→1
最初にこっち→3
yieldの分→3
最初にこっち→6
yieldの分→6
最初にこっち→10
yieldの分→10
sample_list = [i for i in range(1, 6)]
print(f'リストの中身 {sample_list}')
sample_iter = iter(sample_list) #iter()でイテレーターにする
for i in sample_iter:
print(i)
print(f'リストの中身は変わらない {sample_list}')
print(f'イテレーターは使うと空になる {list(sample_iter)}')
<出力結果>
リストの中身 [1, 2, 3, 4, 5]
1
2
3
4
5
リストの中身は変わらない [1, 2, 3, 4, 5]
イテレーターは使うと空になる []
sample_list = [i for i in range(1, 6)]
print(f'リストの中身 {sample_list}')
sample_iter = iter(sample_list) #iter()でイテレーターにする
print(f'リストみたいなもの {sample_iter}') #ここで使ってる
print(f'リストとして見れる {list(sample_iter)}')
print(f'イテレーターは使うと空になる {list(sample_iter)}')
<出力結果>
リストの中身 [1, 2, 3, 4, 5]
リストみたいなもの
リストとして見れる [1, 2, 3, 4, 5]
イテレーターは使うと空になる []
<参考>
イテラブルについて
イテレーターについて
ジェネレーターについて
まとめてるうちに何となく理解できました。
まだまだざっくりのうちなので、もう少し理解できたらまとめます
追記
@shiracamusさんご指摘ありがとうございます。