Python Iterators (__iter__ and __next__): Bagaimana Cara Menggunakannya dan Mengapa?

Iterator adalah objek yang dapat diiterasi. Dalam tutorial ini, Anda akan mempelajari cara kerja iterator dan bagaimana Anda dapat membuat iterator Anda sendiri menggunakan metode __iter__ dan __next__.

Video: Python Iterators

Iterator dengan Python

Iterator ada di mana-mana dengan Python. Mereka diterapkan dengan elegan dalam forloop, pemahaman, generator, dll. Tetapi tersembunyi di depan mata.

Iterator dengan Python hanyalah sebuah objek yang dapat diiterasi. Objek yang akan mengembalikan data, satu elemen pada satu waktu.

Secara teknis, objek iterator Python harus mengimplementasikan dua metode khusus, __iter__()dan __next__(), secara kolektif disebut protokol iterator .

Sebuah objek disebut iterable jika kita bisa mendapatkan iterator darinya. Kebanyakan kontainer bawaan dengan Python seperti: list, tuple, string, dll. Adalah iterable.

The iter()function (yang pada gilirannya panggilan __iter__()metode) mengembalikan sebuah iterator dari mereka.

Iterasi Melalui Iterator

Kami menggunakan next()fungsi untuk mengulang secara manual melalui semua item iterator. Ketika kita mencapai akhir dan tidak ada lagi data yang akan dikembalikan, StopIterationException akan muncul . Berikut ini contohnya.

 # define a list my_list = (4, 7, 0, 3) # get an iterator using iter() my_iter = iter(my_list) # iterate through it using next() # Output: 4 print(next(my_iter)) # Output: 7 print(next(my_iter)) # next(obj) is same as obj.__next__() # Output: 0 print(my_iter.__next__()) # Output: 3 print(my_iter.__next__()) # This will raise error, no items left next(my_iter)

Keluaran

 4 7 0 3 Traceback (panggilan terakhir terakhir): File "", baris 24, di berikutnya (my_iter) StopIteration

Cara yang lebih elegan untuk melakukan iterasi otomatis adalah dengan menggunakan for loop. Dengan menggunakan ini, kita dapat melakukan iterasi pada objek apa pun yang dapat mengembalikan iterator, misalnya daftar, string, file, dll.

 >>> for element in my_list:… print(element)… 4 7 0 3

Bekerja untuk loop untuk Iterator

Seperti yang kita lihat pada contoh di atas, forloop dapat melakukan iterasi secara otomatis melalui daftar.

Nyatanya, forloop dapat melakukan iterasi atas semua iterable. Mari kita lihat lebih dekat bagaimana forloop sebenarnya diimplementasikan dengan Python.

 for element in iterable: # do something with element

Sebenarnya diimplementasikan sebagai.

 # create an iterator object from that iterable iter_obj = iter(iterable) # infinite loop while True: try: # get the next item element = next(iter_obj) # do something with element except StopIteration: # if StopIteration is raised, break from loop break

Jadi secara internal, forloop membuat objek iterator, iter_objdengan memanggil iter()iterable.

Ironisnya, forloop ini sebenarnya adalah loop sementara yang tidak terbatas.

Di dalam loop, ia memanggil next()untuk mendapatkan elemen selanjutnya dan mengeksekusi badan forloop dengan nilai ini. Setelah semua item habis, StopIterationdiangkat yang ditangkap secara internal dan loop berakhir. Perhatikan bahwa jenis pengecualian lain apa pun akan lolos.

Membuat Iterator Kustom

Membuat iterator dari awal itu mudah dengan Python. Kami hanya perlu menerapkan __iter__()dan __next__()metode.

The __iter__()Metode mengembalikan objek iterator sendiri. Jika diperlukan, beberapa inisialisasi dapat dilakukan.

The __next__()Metode harus mengembalikan item berikutnya dalam urutan. Saat mencapai akhir, dan dalam panggilan berikutnya, itu harus dinaikkan StopIteration.

Di sini, kami menunjukkan contoh yang akan memberi kami pangkat 2 berikutnya di setiap iterasi. Eksponen daya mulai dari nol hingga nomor yang ditetapkan pengguna.

Jika Anda tidak tahu tentang pemrograman berorientasi objek, kunjungi Pemrograman Berorientasi Objek Python.

 class PowTwo: """Class to implement an iterator of powers of two""" def __init__(self, max=0): self.max = max def __iter__(self): self.n = 0 return self def __next__(self): if self.n <= self.max: result = 2 ** self.n self.n += 1 return result else: raise StopIteration # create an object numbers = PowTwo(3) # create an iterable from the object i = iter(numbers) # Using next to get to the next iterator element print(next(i)) print(next(i)) print(next(i)) print(next(i)) print(next(i))

Keluaran

 1 2 4 8 Traceback (panggilan terakhir terakhir): File "/home/bsoyuj/Desktop/Untitled-1.py", baris 32, tercetak (next (i)) File "", baris 18, di __next__ angkat StopIteration StopIteration

Kita juga dapat menggunakan forloop untuk mengulang kelas iterator kita.

 >>> for i in PowTwo(5):… print(i)… 1 2 4 8 16 32

Python Infinite Iterators

Item dalam objek iterator tidak harus habis. Mungkin ada iterator tak terbatas (yang tidak pernah berakhir). Kita harus berhati-hati saat menangani iterator semacam itu.

Berikut adalah contoh sederhana untuk mendemonstrasikan iterator tak terbatas.

The built-in function iter() function can be called with two arguments where the first argument must be a callable object (function) and second is the sentinel. The iterator calls this function until the returned value is equal to the sentinel.

 >>> int() 0 >>> inf = iter(int,1) >>> next(inf) 0 >>> next(inf) 0

We can see that the int() function always returns 0. So passing it as iter(int,1) will return an iterator that calls int() until the returned value equals 1. This never happens and we get an infinite iterator.

We can also build our own infinite iterators. The following iterator will, theoretically, return all the odd numbers.

 class InfIter: """Infinite iterator to return all odd numbers""" def __iter__(self): self.num = 1 return self def __next__(self): num = self.num self.num += 2 return num

A sample run would be as follows.

 >>> a = iter(InfIter()) >>> next(a) 1 >>> next(a) 3 >>> next(a) 5 >>> next(a) 7

And so on…

Be careful to include a terminating condition, when iterating over these types of infinite iterators.

Keuntungan menggunakan iterator adalah mereka menghemat sumber daya. Seperti yang ditunjukkan di atas, kita bisa mendapatkan semua bilangan ganjil tanpa menyimpan seluruh sistem bilangan dalam memori. Kita dapat memiliki item tak terbatas (secara teoritis) dalam memori yang terbatas.

Ada cara yang lebih mudah untuk membuat iterator dengan Python. Untuk mempelajari lebih lanjut kunjungi: generator Python menggunakan hasil.

Artikel yang menarik...