5

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 yoryield from x for x in yですが、それは適切な構文ではありません)。期待どおりに動作しないのはなぜですか?

4

1 に答える 1