Cara menggunakan php generator vs iterator

Content dated before 2011-04-08 (UTC) is licensed under CC BY-SA 2.5. Content dated from 2011-04-08 up to but not including 2018-05-02 (UTC) is licensed under CC BY-SA 3.0. Content dated on or after 2018-05-02 (UTC) is licensed under CC BY-SA 4.0. | Privacy

Content dated before 2011-04-08 (UTC) is licensed under CC BY-SA 2.5. Content dated from 2011-04-08 up to but not including 2018-05-02 (UTC) is licensed under CC BY-SA 3.0. Content dated on or after 2018-05-02 (UTC) is licensed under CC BY-SA 4.0. | Privacy

Indonesian (Bahasa Indonesia) translation by Aditia Dwiperdana (you can also view the original English article)

Generator memudahkan kita membuat iterasi dalam Python dan menghasilkan kode lebih sedikit. Tutorial ini akan mengenalkan kamu pada Python Generator, keuntungannya, dan bagaimana mereka bekerja.

Dasar

Sebuah generator adalah fungsi yang mengembalikan objek generator yang bisa kita panggil method next(), sedemikian rupa sehingga setiap pemanggilan mengembalikan nilai berikutnya. Fungsi normal pada Python menggunakan keyword return untuk mengembalikan suatu nilai, tapi generator menggunakan keyword yield untuk mengembalikan nilai. Ini berarti setiap fungsi Python yang berisi yield adalah fungsi generator.

Statement yield biasanya menghentikan fungsi dan menyimpan state lokal agar bisa dilanjutkan tepat seperti saat dihentikan. Fungsi generator bisa memiliki satu atau lebih statement yield.

Sebuah generator juga merupakan sebuah iterator, tapi apa itu iterator? Sebelum kita membahas detail generator, saya rasa penting untuk mengetahui apa itu iterator karena merupakakn bagian penting dari diskusi ini.

Iterator Python

Sebuah iterator Python adalah kelas yang mendefinisikan sebuah fungsi __iter__(). Sebagian besar objek Python bersifat iterable, artinya kamu bisa melakukan loop terhadap setiap elemen dalam objek tersebut. Contoh iterable pada Python misalnya string, list, tuple, dictionary, dan range.

Kita lihat contoh di bawah, kita melakukan loop terhadap daftar warna:

colors= [“red”,”blue”,”yellow”]

def my_funct():
    for color in colors:
        print color

Di balik layar, statement for akan memanggil iter() pada objek list. Lalu fungsi akan mengembalikan objek iterator yang memiliki fungsi __next__(), yang akan mengakses masing-masing warna, satu per satu. Saat tidak ada warna tersisa, __next__ akan melempar exception stopIteration, yang akan menginformasikan loop for untuk berhenti.

Mengiterasi sebuah Dictionary

d = {'x': 10, 'y': 20, 'z': 30}
for k,v in d.items():
    print k, v

#result
# y 20
# x 10
# z 30

Mengiterasi Baris dalam file CSV

import csv

with open('file.csv', newline='') as File:  
    reader = csv.reader(File)
    for row in reader:
        yield row

Mengiterasi String

my_string = 'Generators'
for string in my_string:
    print (string)
    
#result

# G
# e
# n
# e
# r
# a
# t
# o
# r
# s

Keuntungan Menggunakan Generator

Mari kita bahas beberapa keuntungan menggunakan generator dibanding iterator:

Mudah untuk diimplementasi

Membuat iterator pada Python memerlukan kamu untuk mengimplementasi kelas dengan fungsi __iter__() dan __next__() dan menangani semua error stopIteration yang mungkin muncul.

class Reverse:
    """Iterator for looping over a sequence backwards."""
    def __init__(self, data):
        self.data = data
        self.index = len(data)

    def __iter__(self):
        return self

    def __next__(self):
        if self.index == 0:
            raise StopIteration
        self.index = self.index - 1
        return self.data[self.index]

Seperti yang kamu lihat di atas, implementasinya sangat panjang. Semua beban ini secara otomatis ditangani oleh generator.

Penggunaan Memory Lebih Sedikit

Generator membantu meminimalkan penggunaan memory, terutama saat berurusan dengan set data yang besar, karena generator hanya akan mengembalikan objek satu per satu.

Performa dan Optimasi yang Lebih Baik

Generator pada dasarnya pemalas. Ini artinya mereka hanya menghasilkan nilai saat dibutuhkan saja. Tidak seperti iterator biasa, di mana semua nilai dihasilkan tidak peduli apakah mereka akan digunakan atau tidak, generator hanya menghasilkan nilai yang dibutuhkan. Inilah yang mendorong program untuk bekerja lebih cepat.

Bagaimana membuat Generator pada Python

Membuat generator sangat mudah. Yang perlu kamu lakukan hanyalah menulis fungsi biasa, tapi dengan statement yield, bukan return, seperti pada contoh di bawah.

def gen_function():
    yield "python"

Statement return menghentikan fungsi sepenuhnya, sedangkan yield hanya menghentikan fungsi sampai dipanggil kembali oleh fungsi next().

Contohnya, program di bawah menggunakan statement yield dan next().

def myGenerator(l):  
     total = 1
     for n in l:
       yield total
       total += n
     
newGenerator = myGenerator([10,3])

print(next(newGenerator))  
print(next(newGenerator))  

  

Bagaimana Generator Python Bekerja

Kita lihat bagaimana generator bekerja. Lihat contoh di bawah.

# generator_example.py

def myGenerator(l):  
     total = 0
     for n in l:
       total += n
       yield total
      
     
newGenerator = myGenerator([10,20,30])

print(next(newGenerator))  
print(next(newGenerator))  
print(next(newGenerator))  
  

Pada fungsi di atas, kita mendefinisikan generator bernama myGenerator, yang menerima argumen l berupa list. Lalu kita definisikan variabel total dan mengatur nilainya menjadi nol. Selain itu, kita melakukan loop ke setiap elemen pada list dan menambahkannya ke variabel total.

Lalu kita buat instance newGenerator dan panggil fungsi next(). Ini akan menjalankan kode sampai berhenti pada nilai pertama dari total, yang saat ini bernilai 0. Fungsi akan menyimpan nilai variabel total sampai berikutnya fungsi dipanggil. Tidak seperti statement return biasa, yang akan mengembalikan semua nilai sekaligus, generator akan melanjutkan dari yang terakhir diproses.

Di bawah ini adalah nilai-nilai berikutnya.

# generator_example.py

def myGenerator(l):  
     total = 0
     for n in l:
       yield total
       total += n
      
     
newGenerator = myGenerator([10,20,30])

print(next(newGenerator))  
print(next(newGenerator))  
print(next(newGenerator))  
  
# result

# 0
# 10
# 30

Jika kamu coba panggil fungsi setelah loop selesai, kamu akan mendapatkan error StopIteration.

StopIteration dilempar oleh fungsi next() untuk menandai bahwa tidak ada objek yang dihasilkan oleh iterator.

0
10
30

Traceback (most recent call last):
  File "python", line 15, in <module>
StopIterationNormal function

Contoh 2

Pada contoh ini, kita akan lihat bagaimana cara menggunakan beberapa statement yield dalam sebuah fungsi.

# colors.py

def colors():
  yield "red"
  yield "blue"
  yield "green"
  
next_color =colors()
   
print(next(next_color))
print(next(next_color))
print(next(next_color))

# result

# red
# blue
# green

Fungsi normal mengambalikan semua nilai saat fungsi tersebut dipanggil, sedangkan generator menunggu sampai fungsi next() dipanggil kembali. Begitu next() dipanggil, fungsi warna melanjutkan dari titik terakhir fungsi tersebut berhenti.

Kesimpulan

Generator sangat efisien dalam menggunakank memory, terutama saat berkerja dengan daftar atau objek yang sangat besar. Ini karena kamu bisa menggunakan yield untuk mengerjakan bagian lebih kecil dibanding menyimpan semua data dalam memory sekaligus.

Jangan lupa untuk melihat apa yang dijual dan bisa dipelajari pada Envato Market, dan jangan sungkan bertanya dan memberi kamu masukan dengan fitur komentar di bawah.

Selain itu, jika kamu merasa kesulitan, ada kursus tentang Python generator pada bagian course.