Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Industrial programming >> Python

Python Iterator

Iterator Python

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

Video:Python Iterator

Iterator dengan Python

Iterator ada di mana-mana dengan Python. Mereka diimplementasikan secara elegan dalam for loop, pemahaman, generator, dll. tetapi tersembunyi di depan mata.

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

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

Sebuah objek disebut dapat diubah jika kita bisa mendapatkan iterator darinya. Sebagian besar container bawaan dalam Python seperti:list, tuple, string, dll. dapat diubah.

iter() fungsi (yang pada gilirannya memanggil __iter__() metode) mengembalikan iterator dari mereka.


Mengulang Melalui Iterator

Kami menggunakan next() berfungsi untuk melakukan iterasi secara manual melalui semua item dari iterator. Ketika kita mencapai akhir dan tidak ada lagi data yang dikembalikan, itu akan memunculkan StopIteration Pengecualian. 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 (most recent call last):
  File "<string>", line 24, in <module>
    next(my_iter)
StopIteration

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

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

Bekerja dari for loop untuk Iterator

Seperti yang kita lihat pada contoh di atas, for loop dapat mengulang secara otomatis melalui daftar.

Sebenarnya for loop dapat mengulangi semua iterable. Mari kita lihat lebih dekat bagaimana for loop 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, for loop membuat objek iterator, iter_obj dengan menelepon iter() di iterable.

Ironisnya, for . ini loop sebenarnya adalah loop while tak terbatas.

Di dalam loop, ia memanggil next() untuk mendapatkan elemen berikutnya dan mengeksekusi isi for lingkaran dengan nilai ini. Setelah semua item habis, StopIteration dinaikkan yang ditangkap secara internal dan loop berakhir. Perhatikan bahwa segala jenis pengecualian lainnya akan lolos.


Membangun Iterator Kustom

Membangun iterator dari awal itu mudah dengan Python. Kita hanya perlu mengimplementasikan __iter__() dan __next__() metode.

__iter__() metode mengembalikan objek iterator itu sendiri. Jika diperlukan, beberapa inisialisasi dapat dilakukan.

__next__() metode harus mengembalikan item berikutnya dalam urutan. Saat mencapai akhir, dan dalam panggilan berikutnya, itu harus menaikkan StopIteration .

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

Jika Anda tidak tahu apa-apa 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 (most recent call last):
  File "/home/bsoyuj/Desktop/Untitled-1.py", line 32, in <module>
    print(next(i))
  File "<string>", line 18, in __next__
    raise StopIteration
StopIteration

Kami juga dapat menggunakan for loop untuk mengulangi kelas iterator kita.

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

Python Infinite Iterator

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

Berikut adalah contoh sederhana untuk mendemonstrasikan iterator tak terbatas.

Fungsi bawaan iter() dapat dipanggil dengan dua argumen di mana argumen pertama harus berupa objek (fungsi) yang dapat dipanggil dan yang kedua adalah sentinel. Iterator memanggil fungsi ini hingga nilai yang dikembalikan sama dengan sentinel.

>>> int()
0

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

Kita dapat melihat bahwa int() fungsi selalu mengembalikan 0. Jadi meneruskannya sebagai iter(int,1) akan mengembalikan iterator yang memanggil int() sampai nilai yang dikembalikan sama dengan 1. Ini tidak pernah terjadi dan kita mendapatkan iterator tak terbatas.

Kita juga dapat membangun iterator tak terbatas kita sendiri. Iterator berikut, secara teoritis, akan mengembalikan semua angka ganjil.

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

Contoh run adalah sebagai berikut.

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

Dan seterusnya...

Berhati-hatilah untuk menyertakan kondisi penghentian, saat melakukan iterasi pada jenis iterator tak terbatas ini.

Keuntungan menggunakan iterator adalah mereka menghemat sumber daya. Seperti yang ditunjukkan di atas, kita bisa mendapatkan semua bilangan ganjil tanpa menyimpan seluruh sistem bilangan di 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.


Python

  1. Tipe Data Python
  2. Operator Python
  3. Pernyataan lulus python
  4. Argumen Fungsi Python
  5. Kamus Python
  6. Penutupan Python
  7. Tanggal waktu Python
  8. Python tidur()
  9. Python - Ikhtisar
  10. Python - Angka