Để chọn chỉ một phần tử của trình tạo, sử dụng break
trong for
câu lệnh hoặclist(itertools.islice(gen, 1))
Theo ví dụ của bạn (theo nghĩa đen), bạn có thể làm một cái gì đó như:
while True:
...
if something:
for my_element in myfunct():
dostuff(my_element)
break
else:
do_generator_empty()
Nếu bạn muốn " chỉ lấy một phần tử từ trình tạo [một lần được tạo] bất cứ khi nào tôi thích " (tôi cho rằng 50% đó là ý định ban đầu và ý định 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()
Cách này generator.next()
có thể tránh sử dụng rõ ràng và xử lý cuối đầu vào không yêu cầu StopIteration
xử lý ngoại lệ (mật mã) hoặc so sánh giá trị mặc định bổ sung.
Các else:
của for
phần tuyên bố chỉ là cần thiết nếu bạn muốn làm điều gì đó đặc biệt trong trường hợp end-of-máy phát điện.
Lưu ý vào next()
/ .next()
:
Trong Python3, .next()
phương thức được đổi tên thành .__next__()
vì lý do chính đáng: nó được coi là mức thấp (PEP 3114). Trước Python 2.6, hàm dựng sẵn next()
không tồn tại. Và nó thậm chí đã được thảo luận để chuyển next()
sang operator
mô-đun (điều này sẽ là khôn ngoan), vì nhu cầu hiếm hoi của nó và lạm phát đáng ngờ của các tên dựng sẵn.
Sử dụng next()
mà không có mặc định vẫn là một thực tiễn ở mức độ rất thấp - ném mật mã StopIteration
như một tia sáng ra khỏi màu xanh trong mã ứng dụng thông thường một cách công khai. Và việc sử dụng next()
với sentinel mặc định - tốt nhất nên là tùy chọn duy nhất cho một next()
trực tiếp trong builtins
- bị hạn chế và thường đưa ra lý do cho logic / khả năng đọc không phải là pythonic.
Dòng dưới cùng: Sử dụng next () sẽ rất hiếm - như sử dụng các chức năng của operator
mô-đun. 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 iterator liên tục là cách tự nhiên của việc sử dụng vòng lặp trên mức ứng dụng - và khá luôn càng tốt. next()
là cấp độ thấp, một khái niệm bổ sung, không khó hiểu - 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.