Dalam Python 2.6 atau yang lebih baru:
Jika Anda ingin StopIteration
dinaikkan jika tidak ada elemen yang cocok ditemukan:
next(x for x in the_iterable if x > 3)
Jika Anda ingin default_value
(misalnya None
) dikembalikan:
next((x for x in the_iterable if x > 3), default_value)
Perhatikan bahwa Anda memerlukan sepasang tanda kurung tambahan di sekitar ekspresi generator dalam kasus ini - mereka diperlukan setiap kali ekspresi generator bukan satu-satunya argumen.
Saya melihat sebagian besar jawaban dengan tegas mengabaikan next
built-in dan jadi saya berasumsi bahwa untuk beberapa alasan misterius mereka 100% fokus pada versi 2.5 dan yang lebih tua - tanpa menyebutkan masalah versi Python (tapi kemudian saya tidak melihat bahwa menyebutkan dalam jawaban yang melakukan menyebutkan next
built-in, yang mengapa saya pikir itu diperlukan untuk memberikan jawaban sendiri - setidaknya "versi yang benar" masalah mendapat catatan cara ini ;-).
Dalam 2.5, .next()
metode iterator segera naik StopIteration
jika iterator segera selesai - yaitu, untuk kasus penggunaan Anda, jika tidak ada item di iterable yang memenuhi syarat. Jika Anda tidak peduli (yaitu, Anda tahu harus ada setidaknya satu item yang memuaskan) maka gunakan saja .next()
(terbaik pada genexp, baris untuk next
built-in di Python 2.6 dan lebih baik).
Jika Anda benar- benar peduli, membungkus hal-hal dalam suatu fungsi seperti yang pertama kali Anda tunjukkan dalam Q Anda tampaknya terbaik, dan sementara implementasi fungsi yang Anda usulkan baik-baik saja, Anda bisa menggunakan itertools
, for...: break
loop, atau genexp, atau try/except StopIteration
sebagai tubuh fungsi sebagai alternatif . , seperti yang disarankan berbagai jawaban. Tidak ada banyak nilai tambah di salah satu alternatif ini jadi saya akan pergi untuk versi sederhana-sederhana yang pertama kali Anda usulkan.