Untuk memilih hanya satu elemen penggunaan generator break
dalam for
pernyataan, ataulist(itertools.islice(gen, 1))
Menurut contoh Anda (secara harfiah) Anda dapat melakukan sesuatu seperti:
while True:
...
if something:
for my_element in myfunct():
dostuff(my_element)
break
else:
do_generator_empty()
Jika Anda ingin " dapatkan hanya satu elemen dari generator [yang pernah dihasilkan] kapan pun saya suka " (saya kira 50% itulah niat asli, dan niat paling umum) maka:
gen = myfunct()
while True:
...
if something:
for my_element in gen:
dostuff(my_element)
break
else:
do_generator_empty()
Dengan cara ini penggunaan eksplisit generator.next()
dapat dihindari, dan penanganan akhir input tidak memerlukan penanganan (samar) StopIteration
pengecualian atau perbandingan nilai standar ekstra.
The else:
dari for
bagian pernyataan hanya diperlukan jika Anda ingin melakukan sesuatu yang istimewa dalam kasus akhir-of-generator.
Catatan pada next()
/ .next()
:
Dalam Python3 .next()
metode ini berganti nama menjadi .__next__()
untuk alasan yang baik: itu dianggap tingkat rendah (PEP 3114). Sebelum Python 2.6, fungsi bawaan next()
tidak ada. Dan itu bahkan dibahas untuk pindah next()
ke operator
modul (yang seharusnya bijaksana), karena kebutuhannya yang langka dan inflasi yang meragukan dari nama-nama asli.
Menggunakan next()
tanpa default masih merupakan praktik tingkat sangat rendah - melempar crypticStopIteration
seperti baut keluar dari biru dalam kode aplikasi normal secara terbuka. Dan menggunakan next()
dengan sentinel default - yang terbaik harus menjadi satu-satunya pilihan untuk next()
langsung masuk builtins
- terbatas dan sering memberikan alasan untuk logika / keterbacaan non-pythonic.
Intinya: Menggunakan next () harus sangat jarang - seperti menggunakan fungsi operator
modul. Menggunakan for x in iterator
, islice
, list(iterator)
dan fungsi lainnya menerima iterator mulus adalah cara alami menggunakan iterator pada level aplikasi - dan cukup selalu mungkin. next()
adalah level rendah, konsep tambahan, tidak terlihat - seperti yang diperlihatkan oleh pertanyaan dari utas ini. Sedangkan misalnya menggunakan break
dalam for
adalah konvensional.