ジェネレータ

早い話が yield で、処理を止めて値を返す。
値が1つずつ処理できるので、list の全体をコピーするよりもパフォーマンスが良い。

エキパイには「ループ処理や、シーケンス処理を返す関数を実装する時は
まずジェネレータの利用を検討すべき」と記載がある。

def fibo():
...: a, b = 0, 1
...: while True:
...: yield b
...: a, b = b, a + b

fib = fibo()
next fib

とすると、1 が返ってくる。

一個一個処理できるので、実装が楽になる時があるよね♪

ジェネレータにデータを渡す

def my_generator():
try:
yield 'something'
except ValueError:
yield 'dealing with the exception'
finally:
print('ok')

>>> gen = my_generator()
>>> next(gen)
'something'
>>> gen.send(value)
'something value'
>>> gen.throw(ValueError('mean'))
'dealing with the exception'
>>> gen.close()
'ok'

(ref: expert python)

このとき、一回、next を呼び出すことが大事。
send() で値を yield に渡せる。