Về giá trị sinh ra thì giống nhau, nhưng yield from uỷ quyền hẳn cho sub-generator chứ không chỉ chuyển tiếp giá trị.
Ba điểm khác biệt:
1. Chuyển tiếp hai chiều: send(), throw(), close() từ caller đi thẳng xuống sub-generator. Vòng for thủ công thì nuốt mất.
2. Lấy được giá trị return của sub-generator — thứ mà for không chạm tới được.
3. Ngắn gọn hơn và nhanh hơn (bớt một lớp trung gian mỗi vòng lặp).
python
def read_lines(paths):
for path in paths:
with open(path) as f:
yield from f # delegate, no manual loop
def count_words(text):
yield len(text.split())
return "done" # returned value
def outer(text):
result = yield from count_words(text)
print(result) # "done"Dùng nhiều nhất khi làm phẳng cấu trúc lồng nhau (đệ quy trên cây/nested list) và khi ghép pipeline generator. yield from xuất hiện ở Python 3.3 (PEP 380) và cũng là nền tảng cú pháp cho coroutine trước khi có async/await.