2015-10-13 23 views
5

Tôi đang chơi đùa với máy phát điện để hiểu rõ hơn về cách họ làm việc, nhưng tôi nhầm lẫn với kết quả của các đoạn mã sau:Python Generator: khó hiểu kết quả

>>> def gen(): 
... for i in range(5): 
... yield i 
... 
>>> count=gen() 
>>> for i in count: 
... print count.next() 
... 
1 
3 
Traceback (most recent call last): 
    File "<stdin>", line 2, in <module> 
StopIteration 
>>> 

gì đang xảy ra ở đây? Có vẻ như nó chạm vào dòng "cho tôi đếm:", máy phát sẽ mang lại giá trị đầu tiên. Tôi không chắc.

EDIT: Tôi nên thêm rằng tôi không cố gắng "làm cho nó đúng". Tôi đang cố gắng phá vỡ mọi thứ để xem cách Python phản ứng. Tôi tìm hiểu thêm về ngôn ngữ khi tôi tạo lỗi. Lỗi này đã cho tôi gốc nhưng bây giờ tất cả đã rõ ràng. Cho đến nay tất cả các câu trả lời đều ngắn gọn và ngọt ngào. Cảm ơn mọi người!

+2

'cho i in count' và' count.next() 'are * both * cố gắng lấy mục tiếp theo - tại sao bạn sử dụng chúng cả trong cùng một vòng lặp ?! – jonrsharpe

Trả lời

5

Mã của bạn nên được như thế

Bộ luật này:

def gen(): 
    for i in range(5): 
     yield i 

count=gen() 
for i in count: 
    print i 

đầu ra:

0 
1 
2 
3 
4 

Ghi chú:

Khi bạn lặp for i in count bạn cố gắng để có được những mục tiếp theo lại đây count.next() bạn cố gắng để có được những yếu tố thứ hai Vì vậy, về cơ bản bạn đang cố gắng để có được yếu tố 2 từ vị trí hiện tại

Vì vậy, những gì xảy ra trong bạn mã là như dưới đây:

bước sau:

1. for i in count đây giá trị tiếp theo là có đó là 0

2. print count.next() đây một lần nữa tiếp theo giá trị được gọi và in rất 1 được in

3. for i in count đây một lần nữa giá trị tiếp theo được gọi là 2

4. print count.next() đây một lần nữa giá trị tiếp theo được gọi và in rất 3 được in

5. for i in count tại đây một lần nữa giá trị tiếp theo được gọi là 4

6.cuối cùng ở đây bạn đang gọi print count.next() vì không có giá trị nào trong trình tạo. Bạn đã được cung cấp ngoại lệ StopIteration

2

for i in count: đã được gọi tiếp theo (và gán giá trị cho i). Mã của bạn sau đó gọi lại lần nữa.

Nếu bạn chỉ muốn in mỗi giá trị

for i in count: 
    print i 

hoặc chặng đường dài vòng

while True: 
    try: 
     print count.next() 
    except StopIteration, si: 
     break 
+0

"Con đường dài của bạn" thú vị. Tôi sẽ thực hành điều này. – solid

3

Bởi vì "cho" chu kỳ đã lặp giá trị máy phát điện của bạn, tại mỗi bước hai giá trị này được mang lại: một trong "cho" và một trong cơ thể của chu kỳ.

+0

Tôi thực sự thích cách bạn chụp tất cả trong một câu. Tôi đã cố gắng để xây dựng một câu trả lời ngắn nhưng tôi đã không thể. – solid

Các vấn đề liên quan