LoginSignup
4
6

More than 1 year has passed since last update.

[Python]イテラブル、イテレーター、ジェネレーターをざっくり理解する

Last updated at Posted at 2020-05-27

イテラブル(Iterable)、イテレーター(Iterator)、ジェネレーター(Generator)について使いこなしたいが、正直なんとなくしか分からないのでイメージしやすいように簡単にまとめました。

イテラブル(Iterable)

繰り返しに使えるオブジェクト。list, dict, set, strクラスのオブジェクトはイテラブル。
簡単に言うとfor構文で使えるもの

イテレーター(Iterator)

イテレーターは、イテラブルの一種(イテラブルは、イテレーターとは限らない)
簡単に言うとリストみたいなもの
next()で現在の要素を返し、次の要素に進めます
簡単に言うとリストみたいなものから空になるまで取り出していく

ジェネレーター(Generator)

関数中に[yield 返り値]があると、その関数をジェネレーター関数と呼ぶ。また、リストの内包表記を角括弧から丸括弧に変えたものをジェネレーター式と呼ぶ。
(i for i in range(N))
その関数や式の返り値をジェネレーターイテレーターと呼ぶ。
簡単に言うとイテレーターを返すものです。

イメージ図
スクリーンショット 2020-05-28 14.47.39.png

ジェネレーターの特徴
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

イテレーターの特徴1
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]
イテレーターは使うと空になる []

イテレーターの特徴2
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さんご指摘ありがとうございます。

4
6
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6