Trong Python 2.6 hoặc mới hơn:
Nếu bạn muốn StopIteration
được nâng lên nếu không tìm thấy yếu tố phù hợp:
next(x for x in the_iterable if x > 3)
Nếu bạn muốn default_value
(ví dụ None
) được trả lại thay thế:
next((x for x in the_iterable if x > 3), default_value)
Lưu ý rằng bạn cần thêm một cặp dấu ngoặc đơn xung quanh biểu thức trình tạo trong trường hợp này - chúng cần thiết bất cứ khi nào biểu thức trình tạo không phải là đối số duy nhất.
Tôi thấy hầu hết các câu trả lời đều kiên quyết bỏ qua phần tích next
hợp sẵn và vì vậy tôi cho rằng vì một số lý do bí ẩn, họ tập trung 100% vào các phiên bản 2.5 trở lên - mà không đề cập đến vấn đề phiên bản Python (nhưng sau đó tôi không thấy đề cập đến trong câu trả lời đó làm đề cập đến next
built-in, đó là lý do tại sao tôi nghĩ rằng nó cần thiết để cung cấp một câu trả lời bản thân mình - ít nhất là "đúng phiên bản" vấn đề được ghi nhận theo cách này ;-).
Trong 2.5, .next()
phương thức của trình vòng lặp ngay lập tức tăng lên StopIteration
nếu trình vòng lặp ngay lập tức kết thúc - tức là, đối với trường hợp sử dụng của bạn, nếu không có mục nào trong vòng lặp thỏa mãn điều kiện. Nếu bạn không quan tâm (nghĩa là, bạn biết rằng phải có ít nhất một mục thỏa đáng) thì chỉ cần sử dụng .next()
(tốt nhất là trên genEx, dòng dành cho next
Python 2.6 tích hợp và tốt hơn).
Nếu bạn làm cẩn thận, gói thứ trong một chức năng như bạn đã đầu tiên đã nêu trong Q của bạn có vẻ tốt nhất, và trong khi thực hiện chức năng bạn được đề nghị là tốt, bạn có cách khác có thể sử dụng itertools
, một for...: break
vòng lặp, hoặc một genexp, hoặc try/except StopIteration
là thân của hàm , như nhiều câu trả lời khác nhau được đề xuất. Không có nhiều giá trị gia tăng trong bất kỳ giải pháp thay thế nào trong số này, vì vậy tôi sẽ chọn phiên bản đơn giản hoàn toàn mà bạn đề xuất đầu tiên.