2013-01-06 26 views
21

Tôi tò mò về sự khác biệt giữa việc sử dụng raise StopIteration và tuyên bố return trong máy phát.Sự khác nhau giữa tăng StopIteration và câu lệnh trả về trong máy phát điện là gì?

Ví dụ: có sự khác biệt nào giữa hai hàm này không?

def my_generator0(n): 
    for i in range(n): 
     yield i 
     if i >= 5: 
      return 

def my_generator1(n): 
    for i in range(n): 
     yield i 
     if i >= 5: 
      raise StopIteration 

Tôi đoán càng "pythonic" cách để làm điều đó là cách thứ hai (hãy sửa lại cho tôi nếu tôi sai), nhưng như xa như tôi có thể thấy cả hai cách nâng cao một ngoại lệ StopIteration.

+2

Explicit hoặc ngầm ('off cuối cùng') 'return' là cách dự định chấm dứt một máy phát điện. Nếu PEP 479 được chấp nhận, phiên bản 'raise StopIteration' sẽ không hoạt động như hiện tại. –

Trả lời

28

Không cần phải tăng rõ ràng StopIteration vì đó là những gì một tuyên bố trần return làm cho một chức năng máy phát điện - vì vậy có chúng giống nhau. Nhưng không, chỉ cần sử dụng return là thêm Pythonic.

Từ: http://docs.python.org/2/reference/simple_stmts.html#the-return-statement (có giá trị đến Python 3,2)

Trong một chức năng máy phát điện, báo cáo kết quả lợi nhuận không được phép bao gồm expression_list. Trong bối cảnh đó, một sự trở lại trần chỉ ra rằng máy phát điện được thực hiện và sẽ gây ra StopIteration được nâng lên.

Hoặc như @Bakuriu chỉ ra - ngữ nghĩa của máy phát điện đã thay đổi một chút cho Python 3.3, vì vậy sau đây là thích hợp hơn:

Trong một chức năng máy phát điện, báo cáo kết quả lợi nhuận chỉ ra rằng máy phát điện là thực hiện và sẽ gây ra StopIteration được nâng lên. Giá trị trả về (nếu có) được sử dụng như một đối số để xây dựng StopIteration và trở thành thuộc tính StopIteration.value.

+3

Trong python3 sự trở lại có thể có một đối số danh sách biểu thức: http://docs.python.org/3.3/reference/simple_stmts.html#the-return-statement – Bakuriu

3

Đó là sự thật, chúng tương đương ngoại trừ một cái có thể đọc được trong khi người kia thì ít người biết đến. Điều này ngày trở lại phiên bản đầu tiên của máy phát điện (PEP 255, theo "Đặc điểm kỹ thuật: Return"), và các cải tiến tiếp theo của (chẳng hạn như coroutines) không thay đổi điều này. 3.(PEP 380) mở rộng đến return <expr> làm đường cú pháp cho raise StopIteration(<expr>), nhưng điều đó không thay đổi ý nghĩa của return;.

12

Cuối năm 2014 return là chính xác và raise StopIteration để kết thúc trình phát có lịch biểu khấu hao. Xem PEP 479 để biết chi tiết đầy đủ.

Tóm tắt

PEP này đề xuất một sự thay đổi để máy phát điện: khi StopIteration được nâng lên bên trong một máy phát điện, nó được thay thế bằng RuntimeError. (Chính xác hơn, điều này xảy ra khi ngoại lệ sắp bong bóng ra khỏi khung ngăn xếp của máy phát điện.) Vì thay đổi không tương thích ngược, tính năng ban đầu được giới thiệu sử dụng câu lệnh __future__.

Chấp nhận

PEP này được chấp nhận bởi BDFL vào ngày 22 ...

Sự tương tác của máy phát điện và StopIteration hiện có phần ngạc nhiên, và có thể che giấu lỗi tối nghĩa.Một ngoại lệ không mong muốn sẽ không dẫn đến hành vi bị thay đổi một cách tinh tế, nhưng sẽ gây ra một truy nguyên không được sửa lỗi và dễ dàng sửa lỗi. Hiện tại, StopIteration được nâng lên vô tình bên trong một chức năng của máy phát sẽ được hiểu là kết thúc của phép lặp bởi cấu trúc vòng lặp điều khiển máy phát.

...

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