Mewujudkan Iterator Custom di Python melibatkan menentukan kelas yang melaksanakan dua kaedah khas: __iter__
dan __next__
. Berikut adalah panduan langkah demi langkah untuk mencipta penyokong adat:
Melaksanakan kaedah __iter__
: Kaedah ini harus mengembalikan objek iterator itu sendiri. Ia biasanya dilaksanakan untuk hanya mengembalikan self
.
<code class="python">def __iter__(self): return self</code>
Melaksanakan kaedah __next__
: Kaedah ini harus mengembalikan item seterusnya dalam urutan. Apabila tidak ada lagi item untuk kembali, ia harus meningkatkan pengecualian StopIteration
untuk memberi isyarat bahawa lelaran selesai.
<code class="python">def __next__(self): if condition_to_continue: # Logic to determine if there are more items return next_item # Return the next item in the sequence else: raise StopIteration # Signal that iteration is complete</code>
Berikut adalah contoh praktikal penyokong adat yang melelehkan angka walaupun sehingga had yang ditentukan:
<code class="python">class EvenNumbers: def __init__(self, limit): self.limit = limit self.current = 0 def __iter__(self): return self def __next__(self): if self.current </code>
Komponen utama yang diperlukan untuk melaksanakan Iterator tersuai di Python adalah:
__iter__
Kaedah : Kaedah ini mesti mengembalikan objek iterator dan digunakan untuk memulakan pemilihan. Ia adalah bahagian penting dalam menjadikan kelas itu sebagai objek yang boleh dimakan.__next__
Kaedah : Kaedah ini bertanggungjawab untuk mengembalikan item seterusnya dalam urutan. Ia harus meningkatkan pengecualian StopIteration
apabila tidak ada lagi item yang tersisa. Dengan menggabungkan komponen ini, anda boleh membuat objek yang boleh digunakan dalam pembentukan lelaran Python seperti for
gelung.
Menggunakan Iterator tersuai dapat meningkatkan kecekapan kod python anda dalam beberapa cara:
Kecekapan memori : Iterator tersuai menjana item secara on-the-fly dan bukannya menyimpan semua item dalam memori sekaligus. Ini amat bermanfaat apabila berurusan dengan dataset besar atau urutan tak terhingga.
Sebagai contoh, jika anda berurusan dengan fail yang besar, anda boleh menggunakan Iterator tersuai untuk membaca dan memproses baris fail mengikut baris, yang lebih cekap memori daripada membaca keseluruhan fail ke dalam ingatan.
__next__
, anda boleh menyesuaikan proses lelaran kepada keperluan khusus anda, yang membolehkan pengendalian struktur data kompleks yang lebih cekap atau kes penggunaan tertentu.Contohnya, jika anda bekerja dengan dataset besar rekod pengguna dan perlu menapisnya berdasarkan kriteria tertentu, pengalihan tersuai dapat memproses dan menghasilkan hanya rekod yang relevan:
<code class="python">class FilteredUsers: def __init__(self, users): self.users = users self.index = 0 def __iter__(self): return self def __next__(self): while self.index 18 and user['active']: return user raise StopIteration # Usage users = [{'name': 'Alice', 'age': 25, 'active': True}, {'name': 'Bob', 'age': 17, 'active': False}, ...] filtered_users = FilteredUsers(users) for user in filtered_users: print(user['name']) # Efficiently processes and prints active adult users</code>
Apabila membuat pengarah tersuai di Python, berhati -hati dengan perangkap biasa berikut:
Gelung Infinite : Gagal menguruskan keadaan lelaran dengan betul boleh mengakibatkan gelung tak terhingga. Sentiasa pastikan kaedah __next__
akhirnya menimbulkan pengecualian StopIteration
.
<code class="python">def __next__(self): # Incorrect: This will cause an infinite loop return some_value</code>
Pengurusan Negeri yang salah : Jika keadaan tidak dikemas kini dengan betul selepas setiap panggilan __next__
, anda mungkin akan mengembalikan nilai yang sama berulang kali atau melangkau nilai.
<code class="python">def __next__(self): # Incorrect: The state (self.current) is not updated return self.current</code>
__iter__
: lupa untuk melaksanakan kaedah __iter__
akan menghasilkan objek yang tidak boleh digunakan dalam for
atau pembentukan lelaran lain. Meningkatkan StopIteration
Prematurely : Meningkatkan StopIteration
Terlalu Awal akan menyebabkan Iterator berakhir dengan awal, yang berpotensi hilang item yang sah.
<code class="python">def __next__(self): if self.current > self.limit: # Incorrect: This condition is too strict raise StopIteration return self.current</code>
__next__
boleh menyebabkan kesilapan runtime yang sukar untuk debug.__del__
atau menggunakan pengurus konteks.Dengan mengelakkan perangkap ini, anda boleh mencipta pengetua adat yang mantap dan cekap yang meningkatkan fungsi dan prestasi kod Python anda.
Atas ialah kandungan terperinci Bagaimana anda membuat iterator tersuai di Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!