Tôi không thể hiểu phương thức send
. Tôi hiểu rằng nó được sử dụng để vận hành máy phát điện. Nhưng cú pháp là ở đây: generator.send(value)
.Python 3: gửi phương pháp máy phát điện
Tôi bằng cách nào đó không thể hiểu tại sao giá trị sẽ trở thành kết quả của biểu thức yield
hiện tại. Tôi đã chuẩn bị một ví dụ:
def gen():
for i in range(10):
X = yield i
if X == 'stop':
break
print("Inside the function " + str(X))
m = gen()
print("1 Outside the function " + str(next(m)) + '\n')
print("2 Outside the function " + str(next(m)) + '\n')
print("3 Outside the function " + str(next(m)) + '\n')
print("4 Outside the function " + str(next(m)) + '\n')
print('\n')
print("Outside the function " + str(m.send(None)) + '\n') # Start generator
print("Outside the function " + str(m.send(77)) + '\n')
print("Outside the function " + str(m.send(88)) + '\n')
#print("Outside the function " + str(m.send('stop')) + '\n')
print("Outside the function " + str(m.send(99)) + '\n')
print("Outside the function " + str(m.send(None)) + '\n')
Kết quả là:
1 Outside the function 0
Inside the function None
2 Outside the function 1
Inside the function None
3 Outside the function 2
Inside the function None
4 Outside the function 3
Inside the function None
Outside the function 4
Inside the function 77
Outside the function 5
Inside the function 88
Outside the function 6
Inside the function 99
Outside the function 7
Inside the function None
Outside the function 8
Vâng, nói thẳng thắn, đó là đáng ngạc nhiên cho tôi.
- Trong các tài liệu chúng ta có thể đọc thấy rằng khi một tuyên bố
yield
được thực thi, trạng thái của máy phát điện là đông lạnh và giá trị củaexpression_list
được trả lại cho người gọinext
‘s. Vâng, dường như điều đó không xảy ra. Tại sao chúng ta có thể thực hiện câu lệnhif
và hàmprint
bên tronggen()
. - Làm cách nào để hiểu lý do tại sao
X
bên trong và bên ngoài chức năng khác? Ok. Giả sử rằngsend(77)
truyền 77 thànhm
. Vâng, biểu thứcyield
trở thành 77. Sau đó,X = yield i
là gì? Và làm thế nào 77 bên trong hàm chuyển đổi thành 5 khi xảy ra bên ngoài? - Tại sao chuỗi kết quả đầu tiên không phản ánh bất kỳ thứ gì đang diễn ra bên trong trình tạo?
Dù sao, bạn có thể nhận xét bằng cách nào đó về những tuyên bố send
và yield
này không?
nó chạy đồng thời chỉ không song song. – jfs
@ J.F.Sebastian Tôi nghĩ "đồng thời" có nghĩa là song song? – ecatmur
trong lập trình "song song" ngụ ý "đồng thời" nhưng ngược lại nói chung là không đúng sự thật. [Sự khác biệt giữa lập trình đồng thời và lập trình song song] (http://stackoverflow.com/q/1897993/4279) – jfs