Memahami Iterator dalam Python
Bahasa pemrograman Python menyediakan berbagai fasilitas untuk mempermudah pengolahan data. Salah satu kegiatan yang sering dilakukan dalam pemrograman adalah membaca kumpulan nilai, memeriksa setiap elemen, melakukan perhitungan, dan menghasilkan keluaran berdasarkan data yang tersedia. Kegiatan tersebut dapat ditemukan dalam berbagai program, mulai dari pengolahan nilai siswa, pengelolaan daftar barang, pencatatan keuangan, hingga pengolahan data berukuran besar. Agar kegiatan tersebut dapat berlangsung secara teratur, Python menyediakan mekanisme pengulangan yang didukung oleh konsep iterable dan iterator.
Sebelum mempelajari materi tentang cara Memahami Iterator dalam Python, terlebih dahulu pelajari materi tentang: Operator Overloading dalam Python, List Comprehension dalam Python, dan Fungsi Anonim dalam Python.
Sebelum mempelajari materi tentang cara Memahami Iterator dalam Python, terlebih dahulu pelajari materi tentang: Operator Overloading dalam Python, List Comprehension dalam Python, dan Fungsi Anonim dalam Python.
Iterator merupakan salah satu konsep penting yang perlu dipahami oleh pemrogram Python, terutama ketika mulai mempelajari pengolahan data secara lebih mendalam. Konsep ini memungkinkan suatu program mengambil elemen dari sebuah urutan secara bertahap. Setiap kali diperlukan, program dapat meminta nilai berikutnya tanpa harus mengambil seluruh elemen sekaligus. Mekanisme tersebut membuat proses pengolahan data menjadi lebih teratur dan memberikan peluang untuk mengembangkan program yang lebih efisien.
Pada tahap awal pembelajaran Python, penggunaan perulangan `for` biasanya sudah cukup untuk membaca elemen dalam sebuah daftar. Namun, di balik kemudahan tersebut terdapat mekanisme yang mengatur bagaimana setiap elemen diperoleh dan kapan proses pengulangan harus dihentikan. Mekanisme inilah yang berkaitan dengan iterator.
Pemahaman mengenai iterator juga membantu menjelaskan cara kerja berbagai fasilitas Python lainnya. Beberapa fungsi bawaan dan fasilitas dalam pustaka standar memanfaatkan konsep pengambilan data secara bertahap. Oleh karena itu, mempelajari iterator tidak hanya berguna untuk menyelesaikan persoalan sederhana, tetapi juga menjadi landasan untuk memahami teknik pemrograman yang lebih lanjut.
Artikel ini membahas pengertian iterator, perbedaannya dengan iterable, fungsi `iter()` dan `next()`, cara kerja perulangan `for`, pembuatan iterator menggunakan kelas, iterator tak terbatas, serta penerapannya dalam pengolahan data. Setiap pembahasan disertai contoh program agar konsep yang dipelajari lebih mudah dipahami.
Misalnya, terdapat sebuah daftar yang berisi angka 10, 20, 30, dan 40. Ketika daftar tersebut digunakan sebagai sumber iterator, program dapat mengambil angka 10 terlebih dahulu, kemudian angka 20, dilanjutkan dengan angka 30, dan akhirnya angka 40. Proses tersebut berlangsung secara berurutan sampai seluruh elemen telah diambil.
Perhatikan contoh berikut:
angka = [10, 20, 30, 40]
pengambil = iter(angka)
print(next(pengambil))
print(next(pengambil))
print(next(pengambil))
print(next(pengambil))
Hasil program:
10
20
30
40
Variabel `angka` menyimpan empat bilangan dalam sebuah daftar. Fungsi `iter()` digunakan untuk memperoleh iterator dari daftar tersebut. Iterator kemudian disimpan dalam variabel `pengambil`.
Setiap pemanggilan fungsi `next()` meminta satu elemen berikutnya dari iterator. Pemanggilan pertama menghasilkan 10, pemanggilan kedua menghasilkan 20, pemanggilan ketiga menghasilkan 30, dan pemanggilan keempat menghasilkan 40.
Contoh tersebut memperlihatkan bahwa iterator tidak sekadar menyediakan kumpulan nilai, tetapi juga mengatur proses pengambilan nilai secara bertahap. Posisi pembacaan berubah setelah setiap permintaan berhasil dipenuhi.
Perlu dipahami bahwa iterator tidak selalu berarti data dibuat dari awal setiap kali diminta. Iterator dapat membaca elemen dari kumpulan data yang sudah tersedia, atau menghasilkan nilai baru ketika diperlukan. Perilaku tersebut bergantung pada cara iterator dibuat dan sumber data yang digunakan.
Dengan demikian, iterator dapat dipandang sebagai mekanisme untuk mengakses data secara berurutan. Konsep ini menjadi bagian penting dalam Python karena banyak struktur pengulangan dan fasilitas pengolahan data memanfaatkannya.
Iterable adalah objek yang dapat menyediakan iterator sehingga elemen-elemennya dapat dibaca secara berurutan. Contoh objek iterable meliputi daftar, tuple, teks, rentang angka yang dibuat menggunakan `range()`, dan kamus. Objek tersebut dapat digunakan dalam perulangan `for` karena mendukung mekanisme pengambilan elemen.
Iterator adalah objek yang menyediakan nilai berikutnya melalui mekanisme tertentu. Dalam penggunaan iterator, fungsi `next()` dapat dipanggil untuk memperoleh elemen berikutnya sampai tidak ada nilai yang tersisa.
Perbedaan tersebut dapat dipahami melalui contoh berikut:
buah = ["apel", "jeruk", "mangga"]
pengambil = iter(buah)
print(type(buah))
print(type(pengambil))
Hasil program:
<class 'list'>
<class 'list_iterator'>
Hasil tersebut menunjukkan bahwa variabel `buah` merupakan objek daftar, sedangkan `pengambil` merupakan objek iterator daftar. Nama jenis objek yang ditampilkan dapat membantu membedakan peran keduanya.
Daftar menyimpan kumpulan elemen yang dapat diakses berdasarkan indeks. Sementara itu, iterator daftar digunakan untuk mengambil elemen secara berurutan berdasarkan posisi pembacaan.
Perbedaan lainnya terlihat ketika sebuah objek digunakan kembali. Daftar dapat digunakan berulang kali dalam perulangan baru dari awal. Sebaliknya, iterator yang telah habis tidak otomatis kembali ke elemen pertama ketika digunakan lagi.
Contoh berikut memperlihatkan perbedaan tersebut:
angka = [1, 2, 3]
pengambil = iter(angka)
print(next(pengambil))
print(next(pengambil))
for nilai in angka:
print(nilai)
Hasil program:
1
2
1
2
3
Dua pemanggilan `next()` pertama mengambil angka 1 dan 2 dari iterator. Setelah itu, perulangan `for` dilakukan terhadap daftar `angka`, bukan terhadap iterator `pengambil`. Oleh karena itu, perulangan tersebut kembali membaca daftar dari elemen pertama.
Perbedaan ini penting ketika mengembangkan program yang memproses data secara bertahap. Jika program menggunakan iterator yang sama di beberapa bagian, posisi pembacaannya harus diperhatikan. Penggunaan iterator yang telah berjalan dapat menghasilkan keluaran berbeda dari penggunaan daftar aslinya.
Contoh penggunaan `iter()` pada daftar adalah sebagai berikut:
nilai = [75, 80, 90]
pengambil = iter(nilai)
print(next(pengambil))
Hasil program:
75
Ketika `iter(nilai)` dijalankan, Python menghasilkan iterator yang dapat digunakan untuk mengambil elemen dari daftar `nilai`. Pemanggilan `next(pengambil)` kemudian menghasilkan nilai pertama, yaitu 75.
Fungsi `iter()` tidak mengharuskan seluruh elemen dibaca sekaligus. Fungsi tersebut hanya menyediakan iterator yang nantinya dapat digunakan untuk memperoleh elemen secara bertahap.
Selain daftar, fungsi `iter()` juga dapat diterapkan pada teks.
teks = "PYTHON"
pengambil = iter(teks)
print(next(pengambil))
print(next(pengambil))
print(next(pengambil))
Hasil program:
P
Y
T
Dalam contoh tersebut, setiap huruf pada teks diperlakukan sebagai elemen yang dapat diambil secara berurutan. Pemanggilan pertama menghasilkan huruf P, pemanggilan kedua menghasilkan huruf Y, dan pemanggilan ketiga menghasilkan huruf T.
Contoh ini menunjukkan bahwa iterator tidak hanya digunakan untuk bilangan atau daftar. Teks juga dapat menjadi sumber iterator karena setiap karakternya dapat dibaca secara berurutan.
Meskipun demikian, tidak semua objek Python dapat langsung diberikan kepada fungsi `iter()`. Objek harus mendukung mekanisme iterable atau menyediakan metode yang sesuai. Jika objek tidak mendukung mekanisme tersebut, Python akan menghasilkan kesalahan.
Pemahaman tentang fungsi `iter()` menjadi dasar untuk mempelajari penggunaan `next()` dan pembuatan iterator khusus. Kedua konsep tersebut saling melengkapi dalam proses pengambilan data.
Perhatikan contoh berikut:
warna = ["merah", "kuning", "hijau"]
pengambil = iter(warna)
print(next(pengambil))
print(next(pengambil))
print(next(pengambil))
Hasil program:
merah
kuning
hijau
Pemanggilan `next()` pertama mengambil elemen merah. Pemanggilan kedua mengambil kuning, sedangkan pemanggilan ketiga mengambil hijau. Ketiga nilai tersebut diberikan sesuai urutan elemen dalam daftar.
Jika fungsi `next()` dipanggil setelah seluruh elemen habis:
angka = [5, 10]
pengambil = iter(angka)
print(next(pengambil))
print(next(pengambil))
print(next(pengambil))
Dua pemanggilan pertama menghasilkan angka 5 dan 10. Pemanggilan ketiga menimbulkan pengecualian `StopIteration` karena iterator tidak lagi memiliki elemen untuk diberikan.
Pengecualian tersebut bukan berarti iterator mengalami kerusakan. `StopIteration` merupakan penanda bahwa proses pengambilan elemen telah mencapai akhir urutan. Perulangan `for` memanfaatkan penanda ini untuk mengetahui kapan harus berhenti.
Untuk menghindari pengecualian dalam pembacaan manual, fungsi `next()` dapat diberikan nilai bawaan sebagai argumen kedua.
angka = [5, 10]
pengambil = iter(angka)
print(next(pengambil, "Selesai"))
print(next(pengambil, "Selesai"))
print(next(pengambil, "Selesai"))
Hasil program:
5
10
Selesai
Pada pemanggilan pertama dan kedua, iterator memberikan nilai yang tersedia. Pada pemanggilan ketiga, iterator telah habis sehingga fungsi `next()` mengembalikan teks `Selesai`.
Cara ini berguna ketika program memang perlu mengambil nilai secara manual dan ingin memberikan keluaran tertentu setelah iterator habis. Namun, dalam banyak kasus, perulangan `for` lebih praktis karena penanganan akhir iterator berlangsung secara otomatis.
Contoh sederhana dapat dilihat pada program berikut:
nama_siswa = ["Alya", "Bima", "Citra", "Dimas"]
for nama in nama_siswa:
print(nama)
Hasil program:
Alya
Bima
Citra
Dimas
Program tersebut membaca setiap nama dari daftar secara berurutan. Pada setiap putaran, nama yang sedang diproses disimpan dalam variabel `nama`, kemudian ditampilkan menggunakan fungsi `print()`.
Walaupun terlihat sederhana, perulangan `for` menggunakan mekanisme iterator di balik pelaksanaannya. Secara konseptual, Python memperoleh iterator dari objek iterable, mengambil nilai berikutnya, menjalankan isi perulangan, lalu melanjutkan proses tersebut sampai iterator habis.
Perulangan `for` tidak memerlukan pemanggilan `next()` secara manual. Python menangani pengambilan nilai dan penghentian perulangan ketika tidak ada elemen berikutnya.
Untuk memperjelas konsep tersebut, proses pengambilan data dapat ditulis secara manual seperti berikut:
nama_siswa = ["Alya", "Bima", "Citra"]
pengambil = iter(nama_siswa)
while True:
try:
nama = next(pengambil)
print(nama)
except StopIteration:
break
Hasil program:
Alya
Bima
Citra
Pada contoh tersebut, program terus meminta nilai melalui `next()`. Selama iterator masih menyediakan elemen, nama akan ditampilkan. Ketika iterator habis, Python menimbulkan `StopIteration`, kemudian bagian `except` menangkap pengecualian tersebut dan menghentikan perulangan.
Meskipun contoh tersebut menunjukkan mekanisme yang mendasari proses pengulangan, penulisan seperti itu tidak selalu diperlukan. Untuk membaca daftar secara biasa, penggunaan `for nama in nama_siswa` lebih ringkas dan mudah dipahami.
Pemahaman mengenai hubungan antara `for` dan iterator bermanfaat ketika mempelajari objek khusus yang tidak berbentuk daftar. Selama sebuah objek mendukung protokol iterable, objek tersebut dapat digunakan dalam perulangan `for` tanpa harus mengetahui secara terperinci bagaimana setiap nilainya diperoleh.
Daftar atau `list` merupakan struktur data yang dapat menyimpan sejumlah elemen dan memungkinkan perubahan isi. Iterator daftar digunakan untuk membaca elemen berdasarkan urutan yang tersedia.
angka = [12, 24, 36]
for nilai in angka:
print(nilai)
Hasilnya adalah 12, 24, dan 36 yang ditampilkan secara berurutan.
Tuple juga mendukung iterator. Perbedaannya, tuple umumnya digunakan untuk menyimpan kumpulan nilai yang tidak dimaksudkan untuk diubah setelah dibuat.
koordinat = (4, 8, 12)
for nilai in koordinat:
print(nilai)
Program menampilkan ketiga nilai dalam tuple sesuai urutannya.
Teks atau `str` juga merupakan objek iterable. Setiap karakter dalam teks dapat dibaca sebagai elemen tersendiri.
kata = "DATA"
for huruf in kata:
print(huruf)
Hasil program menampilkan huruf D, A, T, dan A pada baris yang berbeda.
Sementara itu, kamus atau `dict` mempunyai perilaku yang sedikit berbeda. Secara bawaan, perulangan terhadap kamus menghasilkan kunci, bukan langsung menghasilkan nilai yang terkait dengan kunci tersebut.
siswa = {
"Alya": 90,
"Bima": 85,
"Citra": 95
}
for nama in siswa:
print(nama)
Program tersebut menampilkan nama-nama yang menjadi kunci dalam kamus.
Jika program perlu memperoleh nilai, metode `values()` dapat digunakan. Jika nama dan nilai perlu diambil secara bersamaan, metode `items()` dapat digunakan.
siswa = {
"Alya": 90,
"Bima": 85,
"Citra": 95
}
for nama, nilai in siswa.items():
print(nama, nilai)
Hasil program:
Alya 90
Bima 85
Citra 95
Contoh tersebut memperlihatkan bahwa konsep iterator dapat diterapkan pada berbagai struktur data dengan cara yang relatif konsisten. Perbedaan terletak pada jenis elemen yang dihasilkan dan cara objek tersebut menyediakan datanya.
Pembuatan iterator menggunakan kelas atau `class` biasanya melibatkan dua metode khusus, yaitu `__iter__()` dan `__next__()`.
Metode `__iter__()` bertugas mengembalikan objek iterator. Metode `__next__()` bertugas memberikan nilai berikutnya. Apabila nilai sudah tidak tersedia, metode tersebut harus menimbulkan `StopIteration`.
Berikut contoh kelas yang menghasilkan bilangan dari 1 hingga batas tertentu.
class DeretAngka:
def __init__(self, batas):
self.batas = batas
self.nilai = 1
def __iter__(self):
return self
def __next__(self):
if self.nilai <= self.batas:
hasil = self.nilai
self.nilai += 1
return hasil
raise StopIteration
deret = DeretAngka(5)
for angka in deret:
print(angka)
Hasil program:
1
2
3
4
5
Kelas `DeretAngka` mempunyai dua atribut utama. Atribut `batas` menentukan nilai maksimum yang akan dihasilkan, sedangkan atribut `nilai` menyimpan bilangan yang akan diberikan berikutnya.
Ketika objek dibuat melalui `DeretAngka(5)`, nilai batas ditetapkan menjadi 5. Nilai awal penghitung adalah 1.
Metode `__iter__()` mengembalikan objek itu sendiri karena kelas tersebut dirancang sebagai iterator. Dengan demikian, objek dapat digunakan secara langsung dalam perulangan `for`.
Metode `__next__()` memeriksa apakah nilai yang tersimpan masih berada dalam batas yang ditentukan. Jika masih memenuhi kondisi, nilai tersebut disimpan sementara dalam variabel `hasil`, penghitung dinaikkan satu angka, lalu nilai sebelumnya dikembalikan.
Jika nilai sudah melebihi batas, program menjalankan `raise StopIteration`. Tindakan tersebut memberi tahu Python bahwa tidak ada lagi nilai yang dapat diambil sehingga perulangan berhenti.
Contoh tersebut memperlihatkan bahwa iterator dapat dibuat untuk menghasilkan nilai secara bertahap tanpa harus menyimpan seluruh deret dalam sebuah daftar.
Namun, iterator khusus seperti ini perlu dirancang dengan cermat. Karena objek menyimpan keadaan pembacaan melalui atribut `nilai`, objek yang sama tidak otomatis memulai ulang deret ketika digunakan kembali. Jika diperlukan pengulangan dari awal, program dapat membuat objek baru atau memisahkan objek iterable dari iterator yang dihasilkannya.
Salah satu fasilitas yang mendukung pembuatan deret tak terbatas adalah `count()` dari modul `itertools`.
from itertools import count
deret = count(1)
for angka in deret:
if angka > 5:
break
print(angka)
Hasil program:
1
2
3
4
5
Fungsi `count(1)` menghasilkan bilangan yang dimulai dari angka 1 dan bertambah satu pada setiap langkah. Karena deret tersebut tidak memiliki batas akhir bawaan, perulangan dapat terus meminta nilai jika tidak ada kondisi penghentian.
Pada contoh tersebut, pernyataan `if angka > 5` memeriksa nilai yang sedang diperoleh. Ketika nilainya lebih besar daripada 5, pernyataan `break` menghentikan perulangan. Akibatnya, angka 6 tidak ditampilkan.
Fungsi `count()` juga dapat digunakan dengan nilai awal dan langkah tertentu.
from itertools import count
for angka in count(2, 3):
if angka > 14:
break
print(angka)
Hasil program:
2
5
8
11
14
Pada contoh tersebut, deret dimulai dari angka 2 dan bertambah 3 pada setiap langkah. Perulangan berhenti ketika nilai yang diperoleh melebihi 14.
Iterator tak terbatas dapat dimanfaatkan untuk membuat penomoran berkelanjutan, menghasilkan deret angka, atau mendukung proses yang membutuhkan nilai secara terus-menerus. Namun, penggunaan iterator semacam ini harus disertai pengendalian yang tepat. Tanpa kondisi penghentian yang sesuai, program dapat menjalankan perulangan tanpa akhir.
Untuk membuat iterator menggunakan kelas, pemrogram perlu menulis metode seperti `__iter__()` dan `__next__()`. Sementara itu, generator memungkinkan proses penghasilan nilai ditulis dengan lebih sederhana.
Perhatikan contoh berikut:
def deret_angka(batas):
nilai = 1
while nilai <= batas:
yield nilai
nilai += 1
for angka in deret_angka(5):
print(angka)
Hasil program:
1
2
3
4
5
Kata kunci `yield` menghasilkan sebuah nilai dan menangguhkan sementara pelaksanaan fungsi. Ketika nilai berikutnya diminta, fungsi melanjutkan prosesnya dari posisi terakhir sampai menghasilkan nilai berikutnya atau menyelesaikan pekerjaannya.
Generator secara otomatis mengelola keadaan pelaksanaan tersebut. Oleh karena itu, pemrogram tidak perlu membuat atribut penghitung dan mengatur metode `__next__()` secara manual seperti pada contoh kelas iterator sebelumnya.
Generator sangat berguna ketika ingin menghasilkan rangkaian nilai secara bertahap dengan penulisan yang lebih ringkas. Meskipun demikian, pemilihan antara iterator berbasis kelas dan generator bergantung pada kebutuhan. Kelas dapat lebih sesuai ketika perilaku objek membutuhkan sejumlah metode atau pengelolaan keadaan yang lebih kompleks.
Kedua pendekatan tersebut membantu pemrogram mengendalikan proses pengambilan nilai dan menjadi bagian penting dari kemampuan pengolahan data dalam Python.
Manfaat berikutnya adalah mendukung pengolahan data secara bertahap. Dalam beberapa kasus, program tidak perlu menyiapkan seluruh hasil terlebih dahulu. Nilai dapat diperoleh ketika diperlukan, sehingga penggunaan memori berpotensi menjadi lebih efisien.
Sebagai contoh, sebuah program perlu membaca jutaan baris data dari suatu berkas. Jika seluruh baris dimuat sekaligus ke dalam daftar, kebutuhan memori dapat meningkat sesuai ukuran data. Sebaliknya, apabila berkas dibaca baris demi baris menggunakan mekanisme iterator, program dapat memproses setiap baris tanpa harus menyimpan semua baris dalam satu daftar.
Contoh pembacaan berkas secara bertahap adalah sebagai berikut:
with open("data.txt", "r", encoding="utf-8") as berkas:
for baris in berkas:
print(baris.strip())
Program tersebut membaca berkas teks secara berurutan. Setiap baris diberikan kepada perulangan untuk diproses, sedangkan metode `strip()` digunakan untuk menghilangkan karakter kosong di bagian awal dan akhir, termasuk karakter pergantian baris.
Pendekatan ini membantu mengurangi kebutuhan memori dibandingkan dengan membaca seluruh berkas sekaligus menggunakan metode yang mengembalikan semua baris sebagai daftar. Namun, efisiensi yang diperoleh tetap bergantung pada ukuran data, cara pemrosesan, dan apakah program menyimpan hasilnya di tempat lain.
Iterator juga memberikan fleksibilitas dalam merancang alur pengolahan data. Pemrogram dapat menentukan aturan pengambilan nilai sesuai kebutuhan. Misalnya, iterator dapat menghasilkan nomor urut, membaca catatan secara bertahap, atau menyediakan data yang dihitung ketika diminta.
Manfaat lainnya adalah kesesuaian dengan berbagai fasilitas Python. Karena perulangan `for` menggunakan mekanisme iterator, objek khusus yang mendukung protokol iterable dapat digunakan dengan pola pengulangan yang sama seperti daftar dan tuple.
Dengan demikian, iterator membantu menyederhanakan pengolahan data sekaligus memberikan ruang untuk merancang mekanisme pembacaan yang lebih sesuai dengan tujuan program.
Misalnya, terdapat daftar nilai yang akan dihitung rata-ratanya. Program berikut menggunakan perulangan `for` untuk membaca setiap nilai.
nilai_siswa = [80, 85, 90, 75, 95]
jumlah = 0
banyak_data = 0
for nilai in nilai_siswa:
jumlah += nilai
banyak_data += 1
rata_rata = jumlah / banyak_data
print("Jumlah nilai:", jumlah)
print("Banyak data:", banyak_data)
print("Rata-rata:", rata_rata)
Hasil program:
Jumlah nilai: 425
Banyak data: 5
Rata-rata: 85.0
Dalam program tersebut, perulangan `for` membaca nilai satu per satu. Setiap nilai ditambahkan ke variabel `jumlah`, sedangkan variabel `banyak_data` digunakan untuk menghitung jumlah elemen yang diproses.
Setelah seluruh nilai dibaca, program menghitung rata-rata dengan membagi jumlah nilai dengan banyaknya data. Proses ini menunjukkan bahwa iterator mendukung pengolahan data tanpa mengharuskan program mengambil setiap elemen melalui indeks.
Untuk menghindari pembagian dengan nol pada program yang menerima data dari pengguna, pemeriksaan terhadap banyaknya data perlu dilakukan sebelum menghitung rata-rata. Dalam contoh di atas, daftar berisi lima nilai sehingga pembagian dapat dilakukan.
Walaupun perhitungan tersebut dapat dilakukan dengan berbagai cara lain, contoh ini memperlihatkan bahwa mekanisme iterator menjadi bagian dari proses pengolahan data yang sering ditemukan dalam kehidupan sehari-hari.
angka = [1, 2]
pengambil = iter(angka)
print(next(pengambil))
print(next(pengambil))
Kode tersebut berjalan dengan benar dan menampilkan angka 1 serta 2. Namun, jika program menambahkan pemanggilan `next(pengambil)` sekali lagi tanpa menyediakan nilai pengganti atau menangani pengecualian, Python akan menimbulkan `StopIteration`.
Kesalahan lain adalah menganggap iterator dapat selalu digunakan kembali dari awal. Padahal, iterator yang telah mencapai akhir tidak otomatis kembali ke elemen pertama.
angka = [10, 20, 30]
pengambil = iter(angka)
for nilai in pengambil:
print(nilai)
for nilai in pengambil:
print(nilai)
Pada program tersebut, perulangan pertama menghabiskan seluruh elemen iterator. Oleh karena itu, perulangan kedua tidak menghasilkan keluaran karena iterator sudah mencapai akhir.
Jika program perlu membaca data dari awal, iterator baru dapat dibuat dari daftar yang sama.
angka = [10, 20, 30]
pengambil = iter(angka)
for nilai in pengambil:
print(nilai)
pengambil = iter(angka)
for nilai in pengambil:
print(nilai)
Dalam contoh tersebut, pemanggilan `iter(angka)` yang kedua menghasilkan iterator baru sehingga elemen dapat dibaca kembali dari awal.
Kesalahan lainnya adalah menggunakan iterator tak terbatas tanpa kondisi penghentian. Iterator seperti `count()` dapat terus menghasilkan nilai sehingga perulangan yang tidak dikendalikan berpotensi berjalan tanpa akhir.
Selain itu, pemrogram perlu membedakan iterator dengan objek iterable yang menjadi sumbernya. Mengubah daftar sumber ketika iterator sedang digunakan dapat menghasilkan perilaku yang tidak diharapkan, terutama jika elemen ditambah atau dihapus selama proses pengulangan.
Dengan memahami batasan tersebut, penggunaan iterator dapat dilakukan secara lebih tepat. Program akan lebih mudah dipelihara apabila alur pengambilan data, kondisi penghentian, dan kemungkinan perubahan sumber data telah dipertimbangkan sejak awal.
Pertama, gunakan perulangan `for` apabila tujuan program hanya membaca elemen secara berurutan. Perulangan ini lebih ringkas daripada pemanggilan `next()` secara manual dan secara otomatis menangani akhir iterator.
Kedua, gunakan `iter()` dan `next()` secara langsung ketika memang diperlukan pengendalian terhadap proses pengambilan nilai. Misalnya, ketika program perlu membaca satu elemen pada waktu tertentu atau menguji perilaku sebuah iterator.
Ketiga, pastikan bahwa iterator yang digunakan sesuai dengan kebutuhan. Jika data perlu dibaca berulang kali dari awal, pertimbangkan untuk menyimpan sumber data yang dapat diulang atau membuat iterator baru setiap kali diperlukan.
Keempat, pertimbangkan generator ketika perlu membuat urutan nilai secara bertahap. Generator sering memberikan cara penulisan yang lebih sederhana dibandingkan dengan kelas iterator khusus.
Kelima, kendalikan penggunaan iterator tak terbatas. Gunakan kondisi penghentian yang jelas atau fasilitas pembatasan seperti `islice()` dari modul `itertools` ketika hanya sebagian nilai yang dibutuhkan.
Keenam, perhatikan sumber data yang digunakan. Iterator dari daftar yang sudah tersedia berbeda dalam kebutuhan memori dengan iterator yang membaca berkas atau menghasilkan nilai berdasarkan perhitungan. Memahami karakteristik sumber data membantu menentukan pendekatan yang tepat.
Ketujuh, lakukan pengujian terhadap kondisi ketika iterator habis. Pengujian tersebut penting, terutama jika iterator digunakan untuk membaca data dari sumber yang jumlah elemennya tidak diketahui sebelumnya.
Penerapan tips tersebut dapat membantu menghasilkan program yang lebih terstruktur dan mengurangi kesalahan dalam pengolahan data.
Perbedaan antara iterable dan iterator menjadi dasar untuk memahami konsep tersebut. Iterable merupakan objek yang dapat menyediakan iterator, sedangkan iterator merupakan objek yang memberikan nilai berikutnya melalui mekanisme tertentu. Fungsi `iter()` digunakan untuk memperoleh iterator, sementara fungsi `next()` digunakan untuk mengambil elemen berikutnya.
Perulangan `for` memanfaatkan mekanisme iterator sehingga pengambilan data dan penghentian pengulangan dapat dilakukan secara otomatis. Selain menggunakan iterator bawaan, pemrogram dapat membuat iterator sendiri melalui kelas dengan menerapkan metode `__iter__()` dan `__next__()`. Generator juga menjadi pilihan yang praktis untuk menghasilkan nilai secara bertahap menggunakan kata kunci `yield`.
Iterator tak terbatas, seperti yang dibuat melalui fungsi `count()` dalam modul `itertools`, menunjukkan bahwa pengambilan nilai dapat berlangsung terus-menerus selama masih diminta. Namun, penggunaan mekanisme tersebut perlu disertai pengendalian yang tepat agar program tidak berjalan tanpa akhir.
Dalam penerapannya, iterator berguna untuk membaca daftar, mengolah nilai siswa, memproses isi berkas, dan menangani berbagai sumber data secara bertahap. Keuntungan yang diperoleh bergantung pada rancangan program, karakteristik data, dan cara pengolahan yang diterapkan.
Penguasaan iterator memberikan dasar yang kuat untuk memahami mekanisme pengulangan dan pengolahan data dalam Python. Dengan mempelajari konsep ini melalui contoh sederhana hingga penerapan yang lebih kompleks, pemrogram dapat membangun program yang lebih terstruktur, fleksibel, dan efisien sesuai dengan kebutuhan.
Pada tahap awal pembelajaran Python, penggunaan perulangan `for` biasanya sudah cukup untuk membaca elemen dalam sebuah daftar. Namun, di balik kemudahan tersebut terdapat mekanisme yang mengatur bagaimana setiap elemen diperoleh dan kapan proses pengulangan harus dihentikan. Mekanisme inilah yang berkaitan dengan iterator.
Pemahaman mengenai iterator juga membantu menjelaskan cara kerja berbagai fasilitas Python lainnya. Beberapa fungsi bawaan dan fasilitas dalam pustaka standar memanfaatkan konsep pengambilan data secara bertahap. Oleh karena itu, mempelajari iterator tidak hanya berguna untuk menyelesaikan persoalan sederhana, tetapi juga menjadi landasan untuk memahami teknik pemrograman yang lebih lanjut.
Artikel ini membahas pengertian iterator, perbedaannya dengan iterable, fungsi `iter()` dan `next()`, cara kerja perulangan `for`, pembuatan iterator menggunakan kelas, iterator tak terbatas, serta penerapannya dalam pengolahan data. Setiap pembahasan disertai contoh program agar konsep yang dipelajari lebih mudah dipahami.
Pengertian Iterator dalam Python
Iterator adalah objek yang memungkinkan program mengambil elemen berikutnya dari suatu urutan data. Pengambilan elemen dilakukan secara bertahap berdasarkan posisi pembacaan yang sedang berlangsung. Setelah sebuah nilai diberikan, iterator melanjutkan prosesnya sehingga permintaan berikutnya menghasilkan nilai selanjutnya, apabila masih tersedia.Misalnya, terdapat sebuah daftar yang berisi angka 10, 20, 30, dan 40. Ketika daftar tersebut digunakan sebagai sumber iterator, program dapat mengambil angka 10 terlebih dahulu, kemudian angka 20, dilanjutkan dengan angka 30, dan akhirnya angka 40. Proses tersebut berlangsung secara berurutan sampai seluruh elemen telah diambil.
Perhatikan contoh berikut:
angka = [10, 20, 30, 40]
pengambil = iter(angka)
print(next(pengambil))
print(next(pengambil))
print(next(pengambil))
print(next(pengambil))
Hasil program:
10
20
30
40
Variabel `angka` menyimpan empat bilangan dalam sebuah daftar. Fungsi `iter()` digunakan untuk memperoleh iterator dari daftar tersebut. Iterator kemudian disimpan dalam variabel `pengambil`.
Setiap pemanggilan fungsi `next()` meminta satu elemen berikutnya dari iterator. Pemanggilan pertama menghasilkan 10, pemanggilan kedua menghasilkan 20, pemanggilan ketiga menghasilkan 30, dan pemanggilan keempat menghasilkan 40.
Contoh tersebut memperlihatkan bahwa iterator tidak sekadar menyediakan kumpulan nilai, tetapi juga mengatur proses pengambilan nilai secara bertahap. Posisi pembacaan berubah setelah setiap permintaan berhasil dipenuhi.
Perlu dipahami bahwa iterator tidak selalu berarti data dibuat dari awal setiap kali diminta. Iterator dapat membaca elemen dari kumpulan data yang sudah tersedia, atau menghasilkan nilai baru ketika diperlukan. Perilaku tersebut bergantung pada cara iterator dibuat dan sumber data yang digunakan.
Dengan demikian, iterator dapat dipandang sebagai mekanisme untuk mengakses data secara berurutan. Konsep ini menjadi bagian penting dalam Python karena banyak struktur pengulangan dan fasilitas pengolahan data memanfaatkannya.
Memahami Perbedaan Iterable dan Iterator
Dalam Python, istilah iterable dan iterator sering digunakan secara bersamaan. Meskipun berkaitan erat, keduanya mempunyai pengertian yang berbeda.Iterable adalah objek yang dapat menyediakan iterator sehingga elemen-elemennya dapat dibaca secara berurutan. Contoh objek iterable meliputi daftar, tuple, teks, rentang angka yang dibuat menggunakan `range()`, dan kamus. Objek tersebut dapat digunakan dalam perulangan `for` karena mendukung mekanisme pengambilan elemen.
Iterator adalah objek yang menyediakan nilai berikutnya melalui mekanisme tertentu. Dalam penggunaan iterator, fungsi `next()` dapat dipanggil untuk memperoleh elemen berikutnya sampai tidak ada nilai yang tersisa.
Perbedaan tersebut dapat dipahami melalui contoh berikut:
buah = ["apel", "jeruk", "mangga"]
pengambil = iter(buah)
print(type(buah))
print(type(pengambil))
Hasil program:
<class 'list'>
<class 'list_iterator'>
Hasil tersebut menunjukkan bahwa variabel `buah` merupakan objek daftar, sedangkan `pengambil` merupakan objek iterator daftar. Nama jenis objek yang ditampilkan dapat membantu membedakan peran keduanya.
Daftar menyimpan kumpulan elemen yang dapat diakses berdasarkan indeks. Sementara itu, iterator daftar digunakan untuk mengambil elemen secara berurutan berdasarkan posisi pembacaan.
Perbedaan lainnya terlihat ketika sebuah objek digunakan kembali. Daftar dapat digunakan berulang kali dalam perulangan baru dari awal. Sebaliknya, iterator yang telah habis tidak otomatis kembali ke elemen pertama ketika digunakan lagi.
Contoh berikut memperlihatkan perbedaan tersebut:
angka = [1, 2, 3]
pengambil = iter(angka)
print(next(pengambil))
print(next(pengambil))
for nilai in angka:
print(nilai)
Hasil program:
1
2
1
2
3
Dua pemanggilan `next()` pertama mengambil angka 1 dan 2 dari iterator. Setelah itu, perulangan `for` dilakukan terhadap daftar `angka`, bukan terhadap iterator `pengambil`. Oleh karena itu, perulangan tersebut kembali membaca daftar dari elemen pertama.
Perbedaan ini penting ketika mengembangkan program yang memproses data secara bertahap. Jika program menggunakan iterator yang sama di beberapa bagian, posisi pembacaannya harus diperhatikan. Penggunaan iterator yang telah berjalan dapat menghasilkan keluaran berbeda dari penggunaan daftar aslinya.
Mengenal Fungsi iter()
Fungsi `iter()` merupakan fungsi bawaan Python yang digunakan untuk memperoleh iterator dari objek yang mendukung mekanisme tersebut. Fungsi ini dapat digunakan pada berbagai objek iterable, seperti daftar, tuple, teks, dan objek lain yang sesuai.Contoh penggunaan `iter()` pada daftar adalah sebagai berikut:
nilai = [75, 80, 90]
pengambil = iter(nilai)
print(next(pengambil))
Hasil program:
75
Ketika `iter(nilai)` dijalankan, Python menghasilkan iterator yang dapat digunakan untuk mengambil elemen dari daftar `nilai`. Pemanggilan `next(pengambil)` kemudian menghasilkan nilai pertama, yaitu 75.
Fungsi `iter()` tidak mengharuskan seluruh elemen dibaca sekaligus. Fungsi tersebut hanya menyediakan iterator yang nantinya dapat digunakan untuk memperoleh elemen secara bertahap.
Selain daftar, fungsi `iter()` juga dapat diterapkan pada teks.
teks = "PYTHON"
pengambil = iter(teks)
print(next(pengambil))
print(next(pengambil))
print(next(pengambil))
Hasil program:
P
Y
T
Dalam contoh tersebut, setiap huruf pada teks diperlakukan sebagai elemen yang dapat diambil secara berurutan. Pemanggilan pertama menghasilkan huruf P, pemanggilan kedua menghasilkan huruf Y, dan pemanggilan ketiga menghasilkan huruf T.
Contoh ini menunjukkan bahwa iterator tidak hanya digunakan untuk bilangan atau daftar. Teks juga dapat menjadi sumber iterator karena setiap karakternya dapat dibaca secara berurutan.
Meskipun demikian, tidak semua objek Python dapat langsung diberikan kepada fungsi `iter()`. Objek harus mendukung mekanisme iterable atau menyediakan metode yang sesuai. Jika objek tidak mendukung mekanisme tersebut, Python akan menghasilkan kesalahan.
Pemahaman tentang fungsi `iter()` menjadi dasar untuk mempelajari penggunaan `next()` dan pembuatan iterator khusus. Kedua konsep tersebut saling melengkapi dalam proses pengambilan data.
Fungsi next() dan Proses Pengambilan Elemen
Fungsi `next()` digunakan untuk meminta nilai berikutnya dari sebuah iterator. Setiap pemanggilan akan melanjutkan posisi pembacaan jika iterator masih memiliki elemen yang dapat diberikan.Perhatikan contoh berikut:
warna = ["merah", "kuning", "hijau"]
pengambil = iter(warna)
print(next(pengambil))
print(next(pengambil))
print(next(pengambil))
Hasil program:
merah
kuning
hijau
Pemanggilan `next()` pertama mengambil elemen merah. Pemanggilan kedua mengambil kuning, sedangkan pemanggilan ketiga mengambil hijau. Ketiga nilai tersebut diberikan sesuai urutan elemen dalam daftar.
Jika fungsi `next()` dipanggil setelah seluruh elemen habis:
angka = [5, 10]
pengambil = iter(angka)
print(next(pengambil))
print(next(pengambil))
print(next(pengambil))
Dua pemanggilan pertama menghasilkan angka 5 dan 10. Pemanggilan ketiga menimbulkan pengecualian `StopIteration` karena iterator tidak lagi memiliki elemen untuk diberikan.
Pengecualian tersebut bukan berarti iterator mengalami kerusakan. `StopIteration` merupakan penanda bahwa proses pengambilan elemen telah mencapai akhir urutan. Perulangan `for` memanfaatkan penanda ini untuk mengetahui kapan harus berhenti.
Untuk menghindari pengecualian dalam pembacaan manual, fungsi `next()` dapat diberikan nilai bawaan sebagai argumen kedua.
angka = [5, 10]
pengambil = iter(angka)
print(next(pengambil, "Selesai"))
print(next(pengambil, "Selesai"))
print(next(pengambil, "Selesai"))
Hasil program:
5
10
Selesai
Pada pemanggilan pertama dan kedua, iterator memberikan nilai yang tersedia. Pada pemanggilan ketiga, iterator telah habis sehingga fungsi `next()` mengembalikan teks `Selesai`.
Cara ini berguna ketika program memang perlu mengambil nilai secara manual dan ingin memberikan keluaran tertentu setelah iterator habis. Namun, dalam banyak kasus, perulangan `for` lebih praktis karena penanganan akhir iterator berlangsung secara otomatis.
Cara Kerja Iterator di Balik Perulangan for
Perulangan `for` merupakan salah satu bentuk pengulangan yang paling sering digunakan dalam Python. Perulangan ini memungkinkan program menjalankan perintah untuk setiap elemen dalam sebuah objek iterable.Contoh sederhana dapat dilihat pada program berikut:
nama_siswa = ["Alya", "Bima", "Citra", "Dimas"]
for nama in nama_siswa:
print(nama)
Hasil program:
Alya
Bima
Citra
Dimas
Program tersebut membaca setiap nama dari daftar secara berurutan. Pada setiap putaran, nama yang sedang diproses disimpan dalam variabel `nama`, kemudian ditampilkan menggunakan fungsi `print()`.
Walaupun terlihat sederhana, perulangan `for` menggunakan mekanisme iterator di balik pelaksanaannya. Secara konseptual, Python memperoleh iterator dari objek iterable, mengambil nilai berikutnya, menjalankan isi perulangan, lalu melanjutkan proses tersebut sampai iterator habis.
Perulangan `for` tidak memerlukan pemanggilan `next()` secara manual. Python menangani pengambilan nilai dan penghentian perulangan ketika tidak ada elemen berikutnya.
Untuk memperjelas konsep tersebut, proses pengambilan data dapat ditulis secara manual seperti berikut:
nama_siswa = ["Alya", "Bima", "Citra"]
pengambil = iter(nama_siswa)
while True:
try:
nama = next(pengambil)
print(nama)
except StopIteration:
break
Hasil program:
Alya
Bima
Citra
Pada contoh tersebut, program terus meminta nilai melalui `next()`. Selama iterator masih menyediakan elemen, nama akan ditampilkan. Ketika iterator habis, Python menimbulkan `StopIteration`, kemudian bagian `except` menangkap pengecualian tersebut dan menghentikan perulangan.
Meskipun contoh tersebut menunjukkan mekanisme yang mendasari proses pengulangan, penulisan seperti itu tidak selalu diperlukan. Untuk membaca daftar secara biasa, penggunaan `for nama in nama_siswa` lebih ringkas dan mudah dipahami.
Pemahaman mengenai hubungan antara `for` dan iterator bermanfaat ketika mempelajari objek khusus yang tidak berbentuk daftar. Selama sebuah objek mendukung protokol iterable, objek tersebut dapat digunakan dalam perulangan `for` tanpa harus mengetahui secara terperinci bagaimana setiap nilainya diperoleh.
Iterator pada Daftar, Tuple, Teks, dan Kamus
Iterator dapat digunakan pada berbagai jenis objek iterable dalam Python. Setiap jenis objek memiliki karakteristik yang berbeda, tetapi semuanya dapat mendukung proses pembacaan elemen secara berurutan.Daftar atau `list` merupakan struktur data yang dapat menyimpan sejumlah elemen dan memungkinkan perubahan isi. Iterator daftar digunakan untuk membaca elemen berdasarkan urutan yang tersedia.
angka = [12, 24, 36]
for nilai in angka:
print(nilai)
Hasilnya adalah 12, 24, dan 36 yang ditampilkan secara berurutan.
Tuple juga mendukung iterator. Perbedaannya, tuple umumnya digunakan untuk menyimpan kumpulan nilai yang tidak dimaksudkan untuk diubah setelah dibuat.
koordinat = (4, 8, 12)
for nilai in koordinat:
print(nilai)
Program menampilkan ketiga nilai dalam tuple sesuai urutannya.
Teks atau `str` juga merupakan objek iterable. Setiap karakter dalam teks dapat dibaca sebagai elemen tersendiri.
kata = "DATA"
for huruf in kata:
print(huruf)
Hasil program menampilkan huruf D, A, T, dan A pada baris yang berbeda.
Sementara itu, kamus atau `dict` mempunyai perilaku yang sedikit berbeda. Secara bawaan, perulangan terhadap kamus menghasilkan kunci, bukan langsung menghasilkan nilai yang terkait dengan kunci tersebut.
siswa = {
"Alya": 90,
"Bima": 85,
"Citra": 95
}
for nama in siswa:
print(nama)
Program tersebut menampilkan nama-nama yang menjadi kunci dalam kamus.
Jika program perlu memperoleh nilai, metode `values()` dapat digunakan. Jika nama dan nilai perlu diambil secara bersamaan, metode `items()` dapat digunakan.
siswa = {
"Alya": 90,
"Bima": 85,
"Citra": 95
}
for nama, nilai in siswa.items():
print(nama, nilai)
Hasil program:
Alya 90
Bima 85
Citra 95
Contoh tersebut memperlihatkan bahwa konsep iterator dapat diterapkan pada berbagai struktur data dengan cara yang relatif konsisten. Perbedaan terletak pada jenis elemen yang dihasilkan dan cara objek tersebut menyediakan datanya.
Membuat Iterator Sendiri Menggunakan Class
Selain menggunakan iterator bawaan, Python memungkinkan pemrogram membuat iterator sesuai kebutuhan. Iterator khusus dapat berguna ketika data harus dihasilkan berdasarkan aturan tertentu, bukan sekadar dibaca dari daftar yang sudah tersedia.Pembuatan iterator menggunakan kelas atau `class` biasanya melibatkan dua metode khusus, yaitu `__iter__()` dan `__next__()`.
Metode `__iter__()` bertugas mengembalikan objek iterator. Metode `__next__()` bertugas memberikan nilai berikutnya. Apabila nilai sudah tidak tersedia, metode tersebut harus menimbulkan `StopIteration`.
Berikut contoh kelas yang menghasilkan bilangan dari 1 hingga batas tertentu.
class DeretAngka:
def __init__(self, batas):
self.batas = batas
self.nilai = 1
def __iter__(self):
return self
def __next__(self):
if self.nilai <= self.batas:
hasil = self.nilai
self.nilai += 1
return hasil
raise StopIteration
deret = DeretAngka(5)
for angka in deret:
print(angka)
Hasil program:
1
2
3
4
5
Kelas `DeretAngka` mempunyai dua atribut utama. Atribut `batas` menentukan nilai maksimum yang akan dihasilkan, sedangkan atribut `nilai` menyimpan bilangan yang akan diberikan berikutnya.
Ketika objek dibuat melalui `DeretAngka(5)`, nilai batas ditetapkan menjadi 5. Nilai awal penghitung adalah 1.
Metode `__iter__()` mengembalikan objek itu sendiri karena kelas tersebut dirancang sebagai iterator. Dengan demikian, objek dapat digunakan secara langsung dalam perulangan `for`.
Metode `__next__()` memeriksa apakah nilai yang tersimpan masih berada dalam batas yang ditentukan. Jika masih memenuhi kondisi, nilai tersebut disimpan sementara dalam variabel `hasil`, penghitung dinaikkan satu angka, lalu nilai sebelumnya dikembalikan.
Jika nilai sudah melebihi batas, program menjalankan `raise StopIteration`. Tindakan tersebut memberi tahu Python bahwa tidak ada lagi nilai yang dapat diambil sehingga perulangan berhenti.
Contoh tersebut memperlihatkan bahwa iterator dapat dibuat untuk menghasilkan nilai secara bertahap tanpa harus menyimpan seluruh deret dalam sebuah daftar.
Namun, iterator khusus seperti ini perlu dirancang dengan cermat. Karena objek menyimpan keadaan pembacaan melalui atribut `nilai`, objek yang sama tidak otomatis memulai ulang deret ketika digunakan kembali. Jika diperlukan pengulangan dari awal, program dapat membuat objek baru atau memisahkan objek iterable dari iterator yang dihasilkannya.
Iterator Tak Terbatas dan Penggunaannya
Iterator tidak selalu harus mempunyai akhir yang telah ditentukan. Dalam Python, iterator dapat dirancang untuk terus menghasilkan nilai selama masih diminta. Iterator seperti ini dikenal sebagai iterator tak terbatas.Salah satu fasilitas yang mendukung pembuatan deret tak terbatas adalah `count()` dari modul `itertools`.
from itertools import count
deret = count(1)
for angka in deret:
if angka > 5:
break
print(angka)
Hasil program:
1
2
3
4
5
Fungsi `count(1)` menghasilkan bilangan yang dimulai dari angka 1 dan bertambah satu pada setiap langkah. Karena deret tersebut tidak memiliki batas akhir bawaan, perulangan dapat terus meminta nilai jika tidak ada kondisi penghentian.
Pada contoh tersebut, pernyataan `if angka > 5` memeriksa nilai yang sedang diperoleh. Ketika nilainya lebih besar daripada 5, pernyataan `break` menghentikan perulangan. Akibatnya, angka 6 tidak ditampilkan.
Fungsi `count()` juga dapat digunakan dengan nilai awal dan langkah tertentu.
from itertools import count
for angka in count(2, 3):
if angka > 14:
break
print(angka)
Hasil program:
2
5
8
11
14
Pada contoh tersebut, deret dimulai dari angka 2 dan bertambah 3 pada setiap langkah. Perulangan berhenti ketika nilai yang diperoleh melebihi 14.
Iterator tak terbatas dapat dimanfaatkan untuk membuat penomoran berkelanjutan, menghasilkan deret angka, atau mendukung proses yang membutuhkan nilai secara terus-menerus. Namun, penggunaan iterator semacam ini harus disertai pengendalian yang tepat. Tanpa kondisi penghentian yang sesuai, program dapat menjalankan perulangan tanpa akhir.
Perbedaan Iterator dan Generator
Iterator dan generator merupakan dua konsep yang berkaitan dalam Python, tetapi keduanya tidak sepenuhnya sama. Iterator adalah objek yang mengikuti protokol pengambilan nilai berikutnya. Generator merupakan salah satu cara praktis untuk membuat iterator menggunakan fungsi yang memanfaatkan kata kunci `yield`.Untuk membuat iterator menggunakan kelas, pemrogram perlu menulis metode seperti `__iter__()` dan `__next__()`. Sementara itu, generator memungkinkan proses penghasilan nilai ditulis dengan lebih sederhana.
Perhatikan contoh berikut:
def deret_angka(batas):
nilai = 1
while nilai <= batas:
yield nilai
nilai += 1
for angka in deret_angka(5):
print(angka)
Hasil program:
1
2
3
4
5
Kata kunci `yield` menghasilkan sebuah nilai dan menangguhkan sementara pelaksanaan fungsi. Ketika nilai berikutnya diminta, fungsi melanjutkan prosesnya dari posisi terakhir sampai menghasilkan nilai berikutnya atau menyelesaikan pekerjaannya.
Generator secara otomatis mengelola keadaan pelaksanaan tersebut. Oleh karena itu, pemrogram tidak perlu membuat atribut penghitung dan mengatur metode `__next__()` secara manual seperti pada contoh kelas iterator sebelumnya.
Generator sangat berguna ketika ingin menghasilkan rangkaian nilai secara bertahap dengan penulisan yang lebih ringkas. Meskipun demikian, pemilihan antara iterator berbasis kelas dan generator bergantung pada kebutuhan. Kelas dapat lebih sesuai ketika perilaku objek membutuhkan sejumlah metode atau pengelolaan keadaan yang lebih kompleks.
Kedua pendekatan tersebut membantu pemrogram mengendalikan proses pengambilan nilai dan menjadi bagian penting dari kemampuan pengolahan data dalam Python.
Manfaat Iterator dalam Pengolahan Data
Iterator memberikan beberapa manfaat dalam pengembangan program. Salah satu manfaat utamanya adalah mempermudah pembacaan elemen secara berurutan. Pemrogram tidak perlu selalu mengakses elemen berdasarkan indeks atau membuat mekanisme pengambilan nilai secara manual.Manfaat berikutnya adalah mendukung pengolahan data secara bertahap. Dalam beberapa kasus, program tidak perlu menyiapkan seluruh hasil terlebih dahulu. Nilai dapat diperoleh ketika diperlukan, sehingga penggunaan memori berpotensi menjadi lebih efisien.
Sebagai contoh, sebuah program perlu membaca jutaan baris data dari suatu berkas. Jika seluruh baris dimuat sekaligus ke dalam daftar, kebutuhan memori dapat meningkat sesuai ukuran data. Sebaliknya, apabila berkas dibaca baris demi baris menggunakan mekanisme iterator, program dapat memproses setiap baris tanpa harus menyimpan semua baris dalam satu daftar.
Contoh pembacaan berkas secara bertahap adalah sebagai berikut:
with open("data.txt", "r", encoding="utf-8") as berkas:
for baris in berkas:
print(baris.strip())
Program tersebut membaca berkas teks secara berurutan. Setiap baris diberikan kepada perulangan untuk diproses, sedangkan metode `strip()` digunakan untuk menghilangkan karakter kosong di bagian awal dan akhir, termasuk karakter pergantian baris.
Pendekatan ini membantu mengurangi kebutuhan memori dibandingkan dengan membaca seluruh berkas sekaligus menggunakan metode yang mengembalikan semua baris sebagai daftar. Namun, efisiensi yang diperoleh tetap bergantung pada ukuran data, cara pemrosesan, dan apakah program menyimpan hasilnya di tempat lain.
Iterator juga memberikan fleksibilitas dalam merancang alur pengolahan data. Pemrogram dapat menentukan aturan pengambilan nilai sesuai kebutuhan. Misalnya, iterator dapat menghasilkan nomor urut, membaca catatan secara bertahap, atau menyediakan data yang dihitung ketika diminta.
Manfaat lainnya adalah kesesuaian dengan berbagai fasilitas Python. Karena perulangan `for` menggunakan mekanisme iterator, objek khusus yang mendukung protokol iterable dapat digunakan dengan pola pengulangan yang sama seperti daftar dan tuple.
Dengan demikian, iterator membantu menyederhanakan pengolahan data sekaligus memberikan ruang untuk merancang mekanisme pembacaan yang lebih sesuai dengan tujuan program.
Penerapan Iterator dalam Pengolahan Nilai Siswa
Salah satu contoh penerapan iterator yang mudah dipahami adalah pengolahan nilai siswa. Dalam kegiatan pendidikan, data nilai dapat digunakan untuk menghitung jumlah nilai, menentukan rata-rata, atau mengidentifikasi nilai yang memenuhi kriteria tertentu.Misalnya, terdapat daftar nilai yang akan dihitung rata-ratanya. Program berikut menggunakan perulangan `for` untuk membaca setiap nilai.
nilai_siswa = [80, 85, 90, 75, 95]
jumlah = 0
banyak_data = 0
for nilai in nilai_siswa:
jumlah += nilai
banyak_data += 1
rata_rata = jumlah / banyak_data
print("Jumlah nilai:", jumlah)
print("Banyak data:", banyak_data)
print("Rata-rata:", rata_rata)
Hasil program:
Jumlah nilai: 425
Banyak data: 5
Rata-rata: 85.0
Dalam program tersebut, perulangan `for` membaca nilai satu per satu. Setiap nilai ditambahkan ke variabel `jumlah`, sedangkan variabel `banyak_data` digunakan untuk menghitung jumlah elemen yang diproses.
Setelah seluruh nilai dibaca, program menghitung rata-rata dengan membagi jumlah nilai dengan banyaknya data. Proses ini menunjukkan bahwa iterator mendukung pengolahan data tanpa mengharuskan program mengambil setiap elemen melalui indeks.
Untuk menghindari pembagian dengan nol pada program yang menerima data dari pengguna, pemeriksaan terhadap banyaknya data perlu dilakukan sebelum menghitung rata-rata. Dalam contoh di atas, daftar berisi lima nilai sehingga pembagian dapat dilakukan.
Walaupun perhitungan tersebut dapat dilakukan dengan berbagai cara lain, contoh ini memperlihatkan bahwa mekanisme iterator menjadi bagian dari proses pengolahan data yang sering ditemukan dalam kehidupan sehari-hari.
Kesalahan yang Sering Terjadi Ketika Menggunakan Iterator
Pemahaman terhadap iterator juga perlu disertai pengetahuan mengenai kesalahan yang mungkin muncul. Salah satu kesalahan yang sering terjadi adalah memanggil `next()` terlalu banyak sehingga iterator telah habis.angka = [1, 2]
pengambil = iter(angka)
print(next(pengambil))
print(next(pengambil))
Kode tersebut berjalan dengan benar dan menampilkan angka 1 serta 2. Namun, jika program menambahkan pemanggilan `next(pengambil)` sekali lagi tanpa menyediakan nilai pengganti atau menangani pengecualian, Python akan menimbulkan `StopIteration`.
Kesalahan lain adalah menganggap iterator dapat selalu digunakan kembali dari awal. Padahal, iterator yang telah mencapai akhir tidak otomatis kembali ke elemen pertama.
angka = [10, 20, 30]
pengambil = iter(angka)
for nilai in pengambil:
print(nilai)
for nilai in pengambil:
print(nilai)
Pada program tersebut, perulangan pertama menghabiskan seluruh elemen iterator. Oleh karena itu, perulangan kedua tidak menghasilkan keluaran karena iterator sudah mencapai akhir.
Jika program perlu membaca data dari awal, iterator baru dapat dibuat dari daftar yang sama.
angka = [10, 20, 30]
pengambil = iter(angka)
for nilai in pengambil:
print(nilai)
pengambil = iter(angka)
for nilai in pengambil:
print(nilai)
Dalam contoh tersebut, pemanggilan `iter(angka)` yang kedua menghasilkan iterator baru sehingga elemen dapat dibaca kembali dari awal.
Kesalahan lainnya adalah menggunakan iterator tak terbatas tanpa kondisi penghentian. Iterator seperti `count()` dapat terus menghasilkan nilai sehingga perulangan yang tidak dikendalikan berpotensi berjalan tanpa akhir.
Selain itu, pemrogram perlu membedakan iterator dengan objek iterable yang menjadi sumbernya. Mengubah daftar sumber ketika iterator sedang digunakan dapat menghasilkan perilaku yang tidak diharapkan, terutama jika elemen ditambah atau dihapus selama proses pengulangan.
Dengan memahami batasan tersebut, penggunaan iterator dapat dilakukan secara lebih tepat. Program akan lebih mudah dipelihara apabila alur pengambilan data, kondisi penghentian, dan kemungkinan perubahan sumber data telah dipertimbangkan sejak awal.
Tips Menggunakan Iterator secara Efektif
Agar penggunaan iterator memberikan manfaat yang optimal, terdapat beberapa hal yang perlu diperhatikan ketika menyusun program Python.Pertama, gunakan perulangan `for` apabila tujuan program hanya membaca elemen secara berurutan. Perulangan ini lebih ringkas daripada pemanggilan `next()` secara manual dan secara otomatis menangani akhir iterator.
Kedua, gunakan `iter()` dan `next()` secara langsung ketika memang diperlukan pengendalian terhadap proses pengambilan nilai. Misalnya, ketika program perlu membaca satu elemen pada waktu tertentu atau menguji perilaku sebuah iterator.
Ketiga, pastikan bahwa iterator yang digunakan sesuai dengan kebutuhan. Jika data perlu dibaca berulang kali dari awal, pertimbangkan untuk menyimpan sumber data yang dapat diulang atau membuat iterator baru setiap kali diperlukan.
Keempat, pertimbangkan generator ketika perlu membuat urutan nilai secara bertahap. Generator sering memberikan cara penulisan yang lebih sederhana dibandingkan dengan kelas iterator khusus.
Kelima, kendalikan penggunaan iterator tak terbatas. Gunakan kondisi penghentian yang jelas atau fasilitas pembatasan seperti `islice()` dari modul `itertools` ketika hanya sebagian nilai yang dibutuhkan.
Keenam, perhatikan sumber data yang digunakan. Iterator dari daftar yang sudah tersedia berbeda dalam kebutuhan memori dengan iterator yang membaca berkas atau menghasilkan nilai berdasarkan perhitungan. Memahami karakteristik sumber data membantu menentukan pendekatan yang tepat.
Ketujuh, lakukan pengujian terhadap kondisi ketika iterator habis. Pengujian tersebut penting, terutama jika iterator digunakan untuk membaca data dari sumber yang jumlah elemennya tidak diketahui sebelumnya.
Penerapan tips tersebut dapat membantu menghasilkan program yang lebih terstruktur dan mengurangi kesalahan dalam pengolahan data.
Kesimpulan
Iterator merupakan konsep penting dalam Python yang memungkinkan pengambilan elemen secara berurutan. Melalui mekanisme ini, program dapat membaca data satu per satu, mengatur proses pengulangan, dan mengembangkan cara pengolahan data yang sesuai dengan kebutuhan.Perbedaan antara iterable dan iterator menjadi dasar untuk memahami konsep tersebut. Iterable merupakan objek yang dapat menyediakan iterator, sedangkan iterator merupakan objek yang memberikan nilai berikutnya melalui mekanisme tertentu. Fungsi `iter()` digunakan untuk memperoleh iterator, sementara fungsi `next()` digunakan untuk mengambil elemen berikutnya.
Perulangan `for` memanfaatkan mekanisme iterator sehingga pengambilan data dan penghentian pengulangan dapat dilakukan secara otomatis. Selain menggunakan iterator bawaan, pemrogram dapat membuat iterator sendiri melalui kelas dengan menerapkan metode `__iter__()` dan `__next__()`. Generator juga menjadi pilihan yang praktis untuk menghasilkan nilai secara bertahap menggunakan kata kunci `yield`.
Iterator tak terbatas, seperti yang dibuat melalui fungsi `count()` dalam modul `itertools`, menunjukkan bahwa pengambilan nilai dapat berlangsung terus-menerus selama masih diminta. Namun, penggunaan mekanisme tersebut perlu disertai pengendalian yang tepat agar program tidak berjalan tanpa akhir.
Dalam penerapannya, iterator berguna untuk membaca daftar, mengolah nilai siswa, memproses isi berkas, dan menangani berbagai sumber data secara bertahap. Keuntungan yang diperoleh bergantung pada rancangan program, karakteristik data, dan cara pengolahan yang diterapkan.
Penguasaan iterator memberikan dasar yang kuat untuk memahami mekanisme pengulangan dan pengolahan data dalam Python. Dengan mempelajari konsep ini melalui contoh sederhana hingga penerapan yang lebih kompleks, pemrogram dapat membangun program yang lebih terstruktur, fleksibel, dan efisien sesuai dengan kebutuhan.
Artikel ini akan dibaca oleh: Farah Husna Pramesti, Farid Putra Setiawan, Farra Audia Sholeha, Fatma Dian Ferrari, dan Febrian Restu Andhika.
10 komentar untuk "Memahami Iterator dalam Python"
Hubungi admin melalui Wa : +62-896-2414-6106
Respon komentar 7 x 24 jam, mohon bersabar jika komentar tidak langsung dipublikasi atau mendapatkan balasan secara langsung.
Bantu admin meningkatkan kualitas blog dengan melaporkan berbagai permasalahan seperti typo, link bermasalah, dan lain sebagainya melalui kolom komentar.
- Ikatlah Ilmu dengan Memostingkannya -
Bagusnya pake teknik cut loss yang otomatis atau yang manual ya?
BalasHapusKlo menurut saya itu bergantung si trader nya sendiri, ada waktu ga ngamati pasar atau sedang sibuk atau kegiatan lain, klo ada waktu enaknya manual aja, tapi klo sibuk atau lebih suka santuy dibikin otomatis juga ga masalah.
HapusKlo menurutku bergantung tingkat risikonya, klo uang investasi yang ditanamkan jumlahnya besar, paling aman cut loss nya dibuat otomatis aja, takutnya malah teledor trus boncos.
HapusKamu itu tipenya anak yang tabah atau ga sabaran, klo ga sabaran mending serahkan kepada mesin aja, daripada nanti tambah emosi :D, malah cut lossnya gagal
HapusMenurutku yang paling penting itu estimasi waktu pengamatannya sih, klo lama mending dibuat otomatis aja cut lossnya daripada lupa trus kelewat, tapi klo jangka pendek atau emang suka mantengi layar mending dibikin manual gapapa.
HapusKemaren pengen beli saham GOTO, soalnya lagi hangat-hangat nya, trus pas dananya udah kekumpul malah merah semua, gimana ini pak ustad, lanjut beli ga ini
BalasHapusKlo saya sih tetap beli, alasannya ga ada sih hehe...
HapusSoalnya suka aja pake produknya gojek, udah dari jaman kuliah dulu, sekadar bentuk dukungan aja sih.
Klo untuk sekarang, GOTO skip dulu deh nunggu angin segar dulu, soalnya akukan tujuan investasinya cari untuk bukan sedekah bantu orang hahaha
HapusUdah ga usah sok idealis bantu-bantu orang, jelas2 itu duitnya banyak koq, boncos malah nangis
HapusBismillah, tahun ini jadi investor saham semoga berhasil semua yaa,
BalasHapus