Saya telah menulis objek kontainer khusus.
Menurut halaman ini , saya perlu menerapkan metode ini pada objek saya:
__iter__(self)
Namun, setelah menindaklanjuti tautan ke Jenis Iterator di manual referensi Python, tidak ada contoh yang diberikan tentang cara mengimplementasikan milik Anda sendiri.
Dapatkah seseorang memposting cuplikan (atau menautkan ke sumber daya), yang menunjukkan cara melakukan ini?
Wadah yang saya tulis, adalah peta (yaitu, menyimpan nilai dengan kunci unik). penis bisa diulang seperti ini:
for k, v in mydict.items()
Dalam hal ini saya harus bisa mengembalikan dua elemen (tuple?) Di iterator. Masih belum jelas bagaimana menerapkan iterator semacam itu (terlepas dari beberapa jawaban yang telah diberikan dengan baik hati). Bisakah seseorang menjelaskan lebih lanjut tentang cara menerapkan iterator untuk objek kontainer seperti peta? (yaitu kelas khusus yang bertindak seperti dikt)?
some_list
telah dihasilkan.some_list
habis.StopIteration
secara otomatis dimunculkan oleh Python saat fungsi generator kembali, baik oleh Anda secara eksplisit memanggilreturn
atau dengan mencapai akhir fungsi (yang seperti semua fungsi memiliki implisitreturn None
di bagian akhir). Secara eksplisit meningkatkanStopIteration
tidak diperlukan dan sebagai Python 3.5 akan benar-benar tidak bekerja (lihat PEP 479 ): seperti generator berubahreturn
menjadiStopIteration
, mereka berpaling eksplisitraise StopIteration
menjadiRuntimeError
.Opsi lainnya adalah mewarisi dari kelas dasar abstrak yang sesuai dari modul `koleksi seperti yang didokumentasikan di sini .
Jika penampung adalah iteratornya sendiri, Anda dapat mewarisi dari
collections.Iterator
. Anda hanya perlu mengimplementasikannext
metode itu.Contohnya adalah:
Saat Anda melihat
collections
modul, pertimbangkan untuk mewarisi dariSequence
,Mapping
atau kelas dasar abstrak lainnya jika itu lebih sesuai. Berikut adalah contoh untukSequence
subclass:NB : Terima kasih kepada Glenn Maynard karena telah menarik perhatian saya pada kebutuhan untuk mengklarifikasi perbedaan antara iterator di satu sisi dan container yang iterable daripada iterator di sisi lain.
sumber
biasanya
__iter__()
hanya mengembalikan diri jika Anda sudah mendefinisikan metode next () (objek generator):berikut adalah contoh Dummy generator:
tetapi
__iter__()
juga dapat digunakan seperti ini: http://mail.python.org/pipermail/tutor/2006-January/044455.htmlsumber
Jika objek Anda berisi sekumpulan data yang ingin Anda kaitkan dengan iter objek, Anda dapat menipu dan melakukan ini:
sumber
hasattr
, gunakantry/except AttributeError
The "iterable interface" di python terdiri dari dua metode
__next__()
dan__iter__()
. The__next__
fungsi yang paling penting, karena mendefinisikan perilaku iterator - yaitu, fungsi menentukan nilai apa yang harus dikembalikan berikutnya. The__iter__()
metode yang digunakan untuk me-reset titik awal dari iterasi. Seringkali, Anda akan menemukan bahwa__iter__()
dapat kembali ke diri sendiri ketika__init__()
digunakan untuk menetapkan titik awal.Lihat kode berikut untuk menentukan Pembalikan Kelas yang mengimplementasikan "antarmuka iterable" dan mendefinisikan iterator pada setiap instance dari kelas urutan apa pun. The
__next__()
Metode dimulai pada akhir urutan dan kembali nilai-nilai dalam urutan terbalik dari urutan. Perhatikan bahwa instance dari kelas yang menerapkan "antarmuka urutan" harus menentukan__len__()
dan__getitem__()
metode.sumber
Untuk menjawab pertanyaan tentang pemetaan : yang Anda berikan
__iter__
harus mengulangi kunci pemetaan. Berikut ini adalah contoh sederhana yang membuat pemetaanx -> x * x
dan bekerja pada Python3 yang memperluas pemetaan ABC.sumber
Jika Anda tidak ingin mewarisi
dict
seperti yang disarankan orang lain, berikut adalah jawaban langsung untuk pertanyaan tentang bagaimana menerapkan__iter__
untuk contoh kasar dari custom dict:Itu menggunakan generator, yang dijelaskan dengan baik di sini .
Karena kita mewarisi dari
Mapping
, Anda juga perlu menerapkan__getitem__
dan__len__
:sumber
Salah satu opsi yang mungkin berhasil untuk beberapa kasus adalah membuat kelas kustom Anda diturunkan dari
dict
. Ini sepertinya pilihan yang logis jika bertindak seperti dikt; mungkin itu harus menjadi sebuah dikt. Dengan cara ini, Anda mendapatkan iterasi seperti dikt secara gratis.Keluaran:
sumber
contoh untuk mewarisi dari dict, modifikasi
iter
, misalnya, lewati kunci2
saat di for loopsumber