yield from
ステートメントをネストすることは可能ですか?
単純な形式は明らかです。
def try_yield1():
x = range(3)
yield from x
生成するもの:
0
1
2
しかし、ネストされたジェネレーターがある場合はどうなりますか?
def try_yield_nested():
x = [range(3) for _ in range(4)]
yield from ((yield from y) for y in x)
これにより、次が生成されます。
0
1
2
None # why?
0
1
2
None # ...
0
1
2
None # ...
(ネストされているにもかかわらず)None
使用すると生成されるのはなぜですか?yield from
私は次のようなことができることを知っています:
from itertools import chain
def try_yield_nested_alternative():
x = [range(3) for _ in range(4)]
yield from chain.from_iterable(x)
これは、を除いて同じ出力を生成しますNone
(これは私が期待するものです)。簡単なループを書くこともできます:
for x in [range(3) for _ in range(3)]:
yield from x
しかし、ネストされた委任を使用する方がよりpythonicになると思いました(できればyield from x from y
oryield from x for x in y
ですが、それは適切な構文ではありません)。期待どおりに動作しないのはなぜですか?