Đối chọn chỉ là một yếu tố của việc sử dụng máy phát điện break
trong một tuyên bố for
, hoặc list(itertools.islice(gen, 1))
Theo ví dụ của bạn (rác) bạn có thể làm như:
while True:
...
if something:
for my_element in myfunct():
dostuff(my_element)
break
else:
do_generator_empty()
Nếu bạn muốn "nhận jus t một phần tử từ [một lần tạo ra] máy phát điện bất cứ khi nào tôi thích "(Tôi cho rằng 50% thats ý định ban đầu, và mục đích phổ biến nhất) thì:
gen = myfunct()
while True:
...
if something:
for my_element in gen:
dostuff(my_element)
break
else:
do_generator_empty()
Bằng cách này sử dụng rõ ràng của generator.next()
có thể tránh và xử lý kết thúc đầu vào không yêu cầu (khó hiểu) StopIteration
xử lý ngoại lệ hoặc so sánh giá trị mặc định bổ sung.
Phần else:
của for
chỉ cần thiết nếu bạn muốn thực hiện điều gì đó đặc biệt trong trường hợp máy phát cuối.
Lưu ý về next()
/.next()
:
Trong Python3 phương pháp .next()
được đổi tên thành .__next__()
cho lý do chính đáng: được coi là ở mức độ thấp của nó (PEP 3114). Trước Python 2.6 hàm dựng sẵn next()
không tồn tại. Và thậm chí nó còn được thảo luận để di chuyển next()
đến mô-đun operator
(điều này sẽ khôn ngoan), vì nhu cầu hiếm hoi và lạm phát có vấn đề về tên dựng sẵn của nó.
Sử dụng next()
mà không mặc định vẫn là thực hành cấp độ rất thấp - ném mã khó hiểu StopIteration
giống như một bu lông ra khỏi màu xanh trong mã ứng dụng thông thường công khai. Và sử dụng next()
với nội dung gửi mặc định - tốt nhất nên là tùy chọn duy nhất cho số next()
trực tiếp trong builtins
- bị giới hạn và thường đưa ra lý do cho logic/không thể đọc được phi logic.
Dòng dưới cùng: Sử dụng tiếp theo() phải rất hiếm - như sử dụng các hàm của mô-đun operator
. Sử dụng for x in iterator
, islice
, list(iterator)
và các chức năng khác chấp nhận một trình lặp liên tục là cách tự nhiên của việc sử dụng trình vòng lặp ở cấp ứng dụng - và hoàn toàn có thể. next()
là cấp độ thấp, một khái niệm phụ, không rõ ràng - như câu hỏi của chủ đề này cho thấy. Trong khi ví dụ: sử dụng break
trong for
là thông thường.
Lưu ý, nó sẽ chỉ tăng StopIteration khi bạn cố gắng sử dụng g.next() sau khi mục cuối cùng trong g đã được cung cấp. – Wilduck
'next (gen, default)' cũng có thể được sử dụng để tránh ngoại lệ 'StopIteration'. Ví dụ 'next (g, None)' cho một bộ tạo chuỗi sẽ tạo ra một chuỗi hoặc None sau khi kết thúc quá trình lặp. – Attila
trong Python 3000, next() là __next __() –