Có hai điều đang diễn ra trong dòng đó. Một trong những dễ dàng hơn để giải thích là báo cáo kết quả yield
được trả lại một giá trị mà là một chuỗi, do đó dấu phẩy mất giá trị của dãy và đặt chúng trong các biến, nhiều như thế này:
>>> def func():
... return (1,2,3)
...
>>> a,b,c = func()
>>> a
1
>>> b
2
>>> c
3
Bây giờ, báo cáo kết quả yield
được sử dụng để create a generator, có thể trả lại một số giá trị thay vì chỉ một giá trị, trả về một giá trị mỗi lần sử dụng yield
. Ví dụ:
>>> def func():
... for a in ['one','two','three']:
... yield a
...
>>> g = func()
>>> g.next()
'one'
>>> g.next()
'two'
>>> g.next()
'three'
Có hiệu lực, chức năng dừng tại câu hỏi yield
, đang chờ để được hỏi giá trị tiếp theo trước khi tiếp tục.
Trong ví dụ trên next()
nhận giá trị tiếp theo từ trình tạo. Tuy nhiên, nếu chúng ta sử dụng send()
thay vì chúng ta có thể gửi các giá trị trở lại các máy phát điện được trả về bởi các tuyên bố yield
lại vào chức năng:
>>> def func():
... total = 0
... while True:
... add = yield total
... total = total + add
...
>>> g = func()
>>> g.next()
0
>>> g.send(10)
10
>>> g.send(15)
25
Đưa này tất cả cùng nhau chúng ta nhận được:
>>> def func():
... total = 0
... while True:
... x,y = yield total
... total = total + (x * y)
...
>>> g = func()
>>> g.next()
0
>>> g.send([6,7])
42
Một máy phát điện được sử dụng theo cách này là called a coroutine.