pythonのyieldがわからない自分のためのメモ
要するにこう
def for_in_generator():
for i in range(0, 10, 3):
yield i
print([x for x in for_in_generator()]) # => [0, 3, 6, 9]
returnではなくyieldで値を返す。
返す度に止まります。
もう一度呼ばれると続きから。
generatorを理解するといいらしい
def my_generator():
print('before yield')
yield 1
print('yielded 1')
yield 2
print('yielded 2')
yield 3
print('yielded 3, finished')
実行してみる
gen = my_generator()
print(type(gen))
v1 = gen.__next__()
print(type(v1))
print(v1)
v2 = gen.__next__()
v3 = gen.__next__()
v4 = gen.__next__()
<class 'generator'>
before yield
<class 'int'>
1
yielded 1
yielded 2
yielded 3, finished
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
/tmp/ipykernel_101/3825958683.py in <module>
17 v2 = gen.__next__()
18 v3 = gen.__next__()
---> 19 v4 = gen.__next__()
StopIteration:
__next__()
で、最初のyield のが返ってくる。
gen
はそこで一時停止している状態。
__next__()
をもう一度呼ぶと続きから次のyieldまでを実行。
現実的な使い方
for
文にgeneratorを与えて、最後までgenerateしてあげること
for v in my_generator():
print(v)
before yield
1
yielded 1
2
yielded 2
3
yielded 3, finished
リスト内包表記にも使う
print([v * 2 for v in my_generator()]) # => [2, 4, 6]