Iterator
Iterator yakni objek yang padanya mampu dilakukan iterasi. Di tutorial ini, kita akan mempelajari bagaimana cara kerja iterator dan cara Membuat iterator kita sendiri menggunakan metode __iter__
dan __next__
.
Tabel Konten:
Pengertian Iterator
Iterator di Python ada di mana – mana. Iterator ini bekerjsama sudah diterapkan di dalam looping for
, list comprehension, generator, dan lain – lain, hanya saja tidak tampak secara langsung.
Iterator di Python sederhananya hanyalah suatu objek yang padanya mampu dilakukan iterasi atau looping. Objek akan mengembalikan data, satu data per satu waktu.
Secara teknis, Objek iterator di Python harus menerapkan dua metode, ialah __iter__()
dan __next__()
, yang disebut dengan protokol iterator.
Suatu objek dikatakan iterable bila dari objek tersebut mampu kita buat iterator. Sebagian besar objek di Python menyerupai list, tuple, string, dan lain-lain yakni iterable.
Fungsi iter()
(fungsi yang memanggil metode __iter__()
) akan mengembalikan iterator dari iterable yang menjadi argumennya.
Iterasi Menggunakan Iterator di Python
Kita menggunakan fungsi next()
untuk melakukan iterasi pada semua item di iterator. Pada dikala iterasi mencapai item terakhir dan tidak ada lagi data untuk dikembalikan, maka fungsi ini akan memunculkan StopIteration
. Berikut yakni contohnya.
# mendefinisikan list
my_list = [4, 7, 0, 3]
# Membuat iterator dengan iter()
my_iter = iter(my_list)
# iterasi pada my_iter menggunakan next()
# print 4
print(next(my_iter))
# print 7
print(next(my_iter))
# next(obj) sama dengan obj.__next__()
# print 0
print(my_iter.__next__())
# print 3
print(my_iter.__next__())
# Berikut ini akan memunculkan error karena item sudah habis
next(my_iter)
Cara yang lebih anggun untuk melakukan iterasi pada iterator yakni dengan menggunakan loop for
. Misalnya yakni menyerupai berikut:
>>> for item in my_list
print(item)
4
7
0
3
Bagaimana Loop Bekerja?
Seperti kita lihat pada pola diatas, loop for
mampu melakukan iterasi otomatis pada list.
Seperti kita ketahui, loop for
mampu melakukan iterasi pada iterable. Mari kita lihat lebih dekat bagaimana loop for
diimplementasikan pada Python.
for item in iterable:
# proses item
Di belakang layar, implementasi dari for
di atas yakni sebagai berikut:
# Membuat iterator dari iterable
iter_obj = iter(iterable)
# loop infinite
while True:
try:
# memanggil item selanjutnya
item = next(iter_obj)
# lakukan sesuatu pada item
except StopIteration:
# bila muncul StopIteration, keluar dari loop
break
Jadi, secara internal, loop for
Membuat objek iterator, iter_obj
dengan memanggil fungsi iter()
.
Loop for
ini bekerjsama yakni sebuah loop while
infinite (tak berhingga).
Di dalam loop, fungsi next()
akan dipanggil untuk menerima item berikutnya dan body dari loop for
akan dieksekusi menggunakan nilai item bersangkutan. Setelah semua item habis, StopIteration
akan dimunculkan dan ini menandai final dari loop.
Membangun Iterator Sendiri
Membangun iterator dari dasar yakni hal yang mudah. Kita hanya perlu menerapkan metode __iter__()
dan __next__()
.
Metode __iter__()
akan mengembalikan objek iterator. Bila diperlukan, beberapa pengaturan awal mampu dilakukan.
Metode __next__()
akan mengembalikan item selanjutnya yang ada di dalam sequence. Saat sudah mencapai item terakhir, maka pemanggilan berikutnya akan menghasilkan StopIteration
.
Berikut pola aktivitas yang menampilkan pangkat 2 dari bilangan setiap kali iterasi. Eksponennya mulai dari nol sampai bilangan yang diset oleh user.
class PowTwo:
"""Kelas yang mengimplementasikan iterator pangkat dua"""
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
Selanjutnya kita mampu Membuat iterator dan melakukan iterasi menyerupai berikut
>>> a = PowTwo(4)
>>> i = iter(a)
>>> next(i)
1
>>> next(i)
2
>>> next(i)
4
>>> next(i)
8
>>> next(i)
16
>>> next(i)
Traceback (most recent call last):
...
StopIteration
Kita juga mampu melakukan iterasi menggunakan loop for pada iterator yang sudah kita buat.
>>> for i in PowTwo(5):
print(i)
1
2
4
8
16
32
Iterator Tak Berhingga (Infinite Iterator)
Kadangkala kita memerlukan iterator yang itemnya tidak akan habis. Tapi kita harus hati – hati untuk menangani iterator menyerupai ini.
Berikut ini akan ditunjukkan pola dari iterator tak berhingga.
Fungsi built-in iter()
mampu dipanggil menggunakan dua argumen, di mana argumen pertama yakni objek callable (sebuah fungsi) dan yang kedua yakni sentinel/penentu. Iterator memanggil fungsi ini sampai nilai yang dikembalikan sama dengan nilai sentinel.
>>> int()
0
>>> inf = iter(int, 1)
>>> next(inf)
0
>>> next(inf)
0
Kita mampu lihat bahwa fungsi int()
tanpa argumen akan selalu mengembalikan nilai 0. Oleh karena itu, dikala fungsi int()
dilewatkan ke iter(int, 1)
, akan dikembalikan iterator yang memanggil fungsi int()
terus menerus sampai nilainya sama dengan sentinel 1. Dan hal ini,nilai 1 tidak akan pernah terjadi, sehingga yang didapat yakni iterator tak berhingga.
Kita juga mampu Membuat iterator tak berhingga kita sendiri. Secara teori, iterator berikut ini akan mengembalikan semua bilangan ganjil.
class InfIter:
"""Infinite iterator yang mengembalikan semua bilangan ganjil"""
def __iter__(self):
self.num = 1
return self
def __next__(self):
num = self.num
self.num += 2
return num
Contoh penggunaannya yakni menyerupai berikut:
>>> a = iter(InfIter())
>>> next(a)
1
>>> next(a)
3
>>> next(a)
5
>>> next(a)
7
dan begitu selanjutnya…
Kita perlu hati – hati untuk memasukkan kondisi terminasi untuk menghentikan iterasi pada iterator tak berhingga ini. Hal ini menyerupai dengan loop menggunakan while
.
Keuntungan dari penggunaan iterator yakni mampu menghemat penggunaan memori. Seperti pada pola di atas, kita mampu menerima semua bilangan ganjil tanpa harus menyimpan semua bilangan di dalam memori. Secara teori, kita mampu menyimpan item tak berhingga pada memori yang terbatas.
Selain itu, iterator Membuat kode terlihat lebih rapi dan bagus.
Ada cara lain yang lebih simpel untuk Membuat iterator di Python, ialah dengan generator menggunakan yield.