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

Iterator adalah objek yang boleh diulang. Dalam tutorial ini, anda akan belajar bagaimana iterator berfungsi dan bagaimana anda boleh membina iterator anda sendiri menggunakan kaedah __iter__ dan __next__.

Video: Python Iterators

Pengulangan di Python

Iterator ada di mana-mana di Python. Mereka dilaksanakan dengan elegan dalam forgelung, pemahaman, penjana dll. Tetapi tersembunyi dalam pandangan yang jelas.

Iterator di Python hanyalah objek yang boleh diulang. Objek yang akan mengembalikan data, satu elemen pada satu masa.

Secara teknikal, objek iterator Python mesti melaksanakan dua kaedah khas, __iter__()dan __next__(), secara kolektif disebut protokol iterator .

Objek dipanggil berulang jika kita dapat mendapatkan iterator darinya. Sebilangan besar kontena terbina dalam Python seperti: list, tuple, string dll boleh digunakan.

Yang iter()fungsi (yang seterusnya memanggil __iter__()kaedah) mengembalikan iterator daripada mereka.

Pengulangan Melalui Iterator

Kami menggunakan next()fungsi untuk melakukan lelaran secara manual melalui semua item iterator. Apabila kita sampai di penghujung dan tidak ada lagi data yang akan dikembalikan, ia akan meningkatkan StopIterationPengecualian. Berikut adalah contoh.

 # 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)

Pengeluaran

 4 7 0 3 Jejak Balik (panggilan terakhir terakhir): Fail "", baris 24, di (my_iter) StopIteration seterusnya

Cara yang lebih elegan untuk melakukan lelaran secara automatik adalah dengan menggunakan gelung untuk. Dengan menggunakan ini, kita dapat melakukan iterasi pada objek yang dapat mengembalikan iterator, misalnya senarai, rentetan, fail dll.

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

Bekerja untuk gelung untuk Iterator

Seperti yang kita lihat dalam contoh di atas, forgelung dapat melakukan lelaran secara automatik melalui senarai.

Sebenarnya forgelung boleh berulang berbanding yang berulang. Mari kita perhatikan lebih dekat bagaimana forgelung ini sebenarnya dilaksanakan di Python.

 for element in iterable: # do something with element

Sebenarnya dilaksanakan 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 dalaman, forgelung membuat objek iterator, iter_objdengan memanggil iter()berulang.

Ironinya, forgelung ini sebenarnya adalah gelung sementara yang tidak terbatas.

Di dalam gelung, ia memanggil next()untuk mendapatkan elemen seterusnya dan melaksanakan badan forgelung dengan nilai ini. Setelah semua barang habis, StopIterationdinaikkan yang tertangkap secara dalaman dan gelungnya berakhir. Perhatikan bahawa pengecualian lain akan dilalui.

Membina Iterator Custom

Membangun iterator dari awal adalah mudah di Python. Kita hanya perlu melaksanakan __iter__()dan __next__()kaedahnya.

The __iter__()Cara mengembalikan objek iterator itu sendiri. Sekiranya diperlukan, beberapa inisialisasi dapat dilakukan.

The __next__()kaedah mesti kembali item seterusnya dalam urutan itu. Apabila sampai ke penghujung, dan dalam panggilan berikutnya, ia mesti meningkat StopIteration.

Di sini, kami menunjukkan contoh yang akan memberi kami kekuatan 2 seterusnya dalam setiap lelaran. Eksponen kuasa bermula dari sifar hingga nombor set pengguna.

Sekiranya anda tidak mempunyai idea mengenai pengaturcaraan berorientasikan objek, kunjungi Python Object-Oriented Programming.

 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))

Pengeluaran

 1 2 4 8 Jejak Balik (panggilan terakhir terakhir): Fail "/home/bsoyuj/Desktop/Untitled-1.py", baris 32, dicetak (seterusnya (i)) Fail "", baris 18, dalam __next__ menaikkan StopIteration StopIterasi

Kami juga boleh menggunakan forgelung untuk melakukan lelaran ke atas kelas iterator kami.

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

Python Infinite Iterators

Tidak semestinya item dalam objek iterator harus habis. Mungkin ada iterator yang tidak terbatas (yang tidak pernah berakhir). Kita mesti berhati-hati semasa mengendalikan iterator seperti itu.

Berikut adalah contoh mudah untuk menunjukkan iterator yang tidak terhingga.

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.

Kelebihan menggunakan iterator ialah mereka menjimatkan sumber. Seperti gambar di atas, kita dapat memperoleh semua nombor ganjil tanpa menyimpan keseluruhan sistem nombor dalam memori. Kita boleh mempunyai item yang tidak terhingga (secara teorinya) dalam ingatan terhingga.

Terdapat kaedah yang lebih mudah untuk membuat iterator di Python. Untuk mengetahui lebih lanjut, lawati: Generator Python menggunakan hasil.

Artikel menarik...