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


  • Iterasi Menggunakan Iterator di Python


  • Bagaimana Loop Bekerja?


  • Membangun Iterator Sendiri


  • Iterator Tak Berhingga (Infinite Iterator)


  •  







    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.



    Popular posts from this blog

    Subitems Listview Berwarna Selang Seling

    Source Code Aplikasi Tagihan Internet Memakai Php