Có thể làm tổ tuyên bố yield from
không?Tại sao lồng ghép "lãi suất từ" báo cáo (bộ tạo máy phát) tạo ra giá trị `None` kết thúc?
Các hình thức đơn giản là rõ ràng:
def try_yield1():
x = range(3)
yield from x
nào sản xuất:
0
1
2
Nhưng nếu tôi đã lồng máy phát điện?
def try_yield_nested():
x = [range(3) for _ in range(4)]
yield from ((yield from y) for y in x)
này tạo ra:
0
1
2
None # why?
0
1
2
None # ...
0
1
2
None # ...
Tại sao nó sản xuất None
nếu tôi sử dụng yield from
(mặc dù nó là lồng nhau)?
Tôi biết tôi có thể làm điều gì đó như:
from itertools import chain
def try_yield_nested_alternative():
x = [range(3) for _ in range(4)]
yield from chain.from_iterable(x)
nào tạo ra cùng một sản lượng bỏ đi None
(đó là những gì tôi mong đợi). Tôi cũng có thể viết một vòng lặp đơn giản:
for x in [range(3) for _ in range(3)]:
yield from x
Nhưng, tôi nghĩ rằng nó sẽ được nhiều hơn pythonic sử dụng đoàn lồng nhau (tốt thậm chí yield from x from y
hoặc yield from x for x in y
, nhưng đó không phải là cú pháp thích hợp). Tại sao nó không hoạt động như tôi mong đợi?