Đọc về coroutines Python, tôi đi qua mã này:Tại sao máy phát Python/coroutine này mất một giá trị?
def countdown(n):
print("Start from {}".format(n))
while n >= 0:
print("Yielding {}".format(n))
newv = yield n
if newv is not None:
n = newv
else:
n -= 1
c = countdown(5)
for n in c:
print(n)
if n == 5: c.send(2)
mà tò mò kết quả đầu ra:
Start from 5
Yielding 5
5
Yielding 3
Yielding 2
2
Yielding 1
1
Yielding 0
0
Đặc biệt, nó bỏ lỡ in 3
. Tại sao?
Câu hỏi được tham chiếu không trả lời được câu hỏi này vì tôi không hỏi send
là gì. Nó sẽ gửi các giá trị trở lại hàm. Những gì tôi hỏi là lý do tại sao, sau khi tôi phát hành send(3)
, sản lượng tiếp theo, sẽ mang lại 3, không gây ra vòng lặp for in 3.
Đầu tiên, nó cũng bỏ lỡ 4. Thứ hai, bạn nghĩ 'c.send (3)' làm gì? – alfasin
@alfasin Nó bỏ lỡ 4 vì 'c.send (3)'. Vấn đề là mã nên đặt 'n' thành 3, và sau đó trên vòng lặp tiếp theo, năng suất 3. Nhưng nó không được in. Tại sao? – Ritzymon
nó trở nên rõ ràng hơn nếu bạn thêm một định dạng 'print ('newv: {}'. (Newv)' trong 'if newv không phải là None:' block –