Berikut sintaks untuk iterator di Jawa (sintaksis yang agak mirip di C #):
Iterator it = sequence.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
Itu masuk akal. Berikut sintaks yang setara dalam Python:
it = iter(sequence)
while True:
try:
value = it.next()
except StopIteration:
break
print(value)
Saya pikir Pengecualian seharusnya hanya digunakan dalam, yah, keadaan luar biasa.
Mengapa Python menggunakan pengecualian untuk menghentikan iterasi?
python
language-design
exceptions
iterator
NullUserException
sumber
sumber
Jawaban:
Ada cara yang sangat Pythonic untuk menulis ekspresi itu tanpa secara eksplisit menulis blok coba-kecuali untuk
StopIteration
:Anda dapat membaca PEPs 234 255 yang relevan jika Anda ingin tahu lebih banyak di balik mengapa
StopIteration
diperkenalkan dan logika di balik iterator.Prinsip umum dalam python adalah memiliki satu cara untuk melakukan sesuatu (lihat
import this
), dan lebih disukai yang indah, eksplisit, mudah dibaca, dan sederhana, yang memenuhi metode pythonic. Kode setara Anda hanya diperlukan karena python tidak memberikanhasNext
fungsi anggota kepada iterator ; lebih suka orang untuk hanya mengulangi iterator secara langsung (dan jika Anda perlu melakukan sesuatu yang lain untuk hanya mencoba membacanya dan menangkap pengecualian).Penangkapan otomatis
StopIteration
pengecualian di akhir iterator ini masuk akal dan merupakan analog dari yangEOFError
dibangkitkan jika Anda membaca melewati akhir file.sumber
list
kelistiterator
tidak ada gunanya. Aku terus baris pertama hanya untuk mengikuti titik NullUserException ini mulai, untuk menjelaskan bagaimana Anda harus loop melalui iterator, yang merupakan cara yang sama Anda harus loop atas setiap iterable (list
,set
,str
,tuple
,dict
,file
,generator
, dll). Saya bisa melakukan sesuatu sepertiit = itertools.combinations("ABCDE", 2)
untuk mendapatkan contoh yang lebih baik dari iterator yang berarti.it = iter(sequence)
tidak dibutuhkan.iterators
) dan Anda memang perluiter
secara eksplisit menghasilkaniterator
(cobatype([])
(list
) vstype(iter([]))
(listiterator
)).Alasan mengapa python menggunakan Exception untuk menghentikan iterasi didokumentasikan dalam PEP 234 :
Catatan: cara python idiomatik untuk mengulang urutan adalah seperti ini:
sumber
Ini perbedaan filosofi. Filosofi desain Pythonic adalah EAFP :
sumber
Hanya saja implementasi Java memiliki
hasNext()
metode sehingga Anda dapat memeriksa iterator kosong sebelum Anda melakukan anext()
. Ketika Anda memanggilnext()
iterator Java tanpa elemen yang tersisa, aNoSuchElementException
dilemparkan .Jadi secara efektif, Anda dapat melakukan try..catch di Jawa seperti try..except dengan Python. Dan ya, sesuai jawaban sebelumnya, filsafat sangat penting di dunia Pythonic.
sumber