Menyimpan data di dalam koleksi hanya setengah pekerjaan; setengah sisanya adalah memproses setiap elemennya: mencetak daftar tugas, menjumlahkan transaksi, atau mencari siswa dengan nilai tertinggi. Di Python, iterasi tidak memerlukan penghitung manual — perulangan for milik Python langsung berjalan di atas elemen, dan tiap struktur data punya cara iterasi yang paling natural untuk dirinya sendiri.
Iterasi for pada Setiap Struktur #
Loop for mengambil elemen satu per satu sampai habis. List dan tuple diiterasi dalam urutan posisinya, dictionary diiterasi berdasarkan key, dan sebaiknya diiterasi dalam bentuk terurut karena set tidak menjaga urutan.
buah = ["apel", "jeruk", "mangga"]
for item in buah:
print(item)
angka = {5, 3, 8}
for item in sorted(angka):
print(item)
harga = {"apel": 5000, "jeruk": 3000}
for kunci in harga:
print(kunci)
for nilai in harga.values():
print(nilai)
for nama, harga_satuan in harga.items():
print(f"{nama}: {harga_satuan}")Output yang Dihasilkan:
apel
jeruk
mangga
3
5
8
apel
jeruk
5000
3000
apel: 5000
jeruk: 3000Tiga bentuk terakhir menunjukkan pilihan saat mengiterasi dictionary: for kunci in harga (key saja, bentuk default), .values() (nilai saja), dan .items() (key dan nilai sekaligus lewat unpacking tuple).
Tuple diiterasi dengan pola yang persis sama seperti list karena keduanya adalah sequence; satu-satunya perbedaan adalah isi tuple tidak bisa diubah selama maupun setelah iterasi. Kendali loop dari Section Control Flow — break, continue, hingga else — juga berlaku seragam pada semua koleksi di atas.
enumerate() untuk Posisi dan Nilai #
Saat posisi elemen juga dibutuhkan, fungsi enumerate() memasangkan setiap elemen dengan nomor urutnya. Hasilnya kode yang lebih bersih dibanding mengelola penghitung manual dengan range().
buah = ["apel", "jeruk", "mangga"]
for index, item in enumerate(buah):
print(index, item)
print("---")
for nomor, item in enumerate(buah, start=1):
print(nomor, item)Output yang Dihasilkan:
0 apel
1 jeruk
2 mangga
---
1 apel
2 jeruk
3 manggaArgumen start menggeser nomor awal, cocok untuk penomoran yang dibaca manusia seperti peringkat atau nomor urut formulir.
Iterasi dalam Urutan Tertentu #
Terkadang urutan bawaan koleksi belum sesuai kebutuhan. Fungsi sorted() membuat salinan terurut yang aman diiterasi, dan reversed() membaca koleksi dari belakang — keduanya tidak pernah mengubah koleksi aslinya.
skor = {"budi": 80, "siti": 95, "agus": 70}
for nama in sorted(skor):
print(nama)
print("---")
buah = ["mangga", "apel", "jeruk"]
for item in sorted(buah):
print(item)
print("---")
for item in reversed(buah):
print(item)Output yang Dihasilkan:
agus
budi
siti
---
apel
jeruk
mangga
---
jeruk
apel
manggaPerhatikan bahwa setelah kedua loop berjalan, isi buah tetap ["mangga", "apel", "jeruk"] — urutan aslinya utuh karena yang diiterasi adalah salinan hasil sorted() dan reversed().
Jebakan: Mengubah Koleksi Saat Iterasi #
Menghapus elemen dari list yang sedang diiterasi menghasilkan perilaku yang tampak acak: sebagian elemen lolos tanpa diperiksa. Perhatikan niat menghapus semua angka 2 dari list berikut:
angka = [1, 2, 2, 3, 4]
for item in angka:
if item == 2:
angka.remove(item)
print("hasil:", angka)Output yang Dihasilkan:
hasil: [1, 2, 3, 4]Satu angka 2 masih tertinggal padahal loop sudah selesai. Penyebabnya adalah mekanisme loop for yang berjalan menggunakan indeks internal:
- Iterasi ke-2: loop membaca elemen indeks
1(nilai2), laluremove()menghapusnya. List berubah menjadi[1, 2, 3, 4]. - Elemen bergeser: angka
2yang kedua turun ke posisi indeks1, dan indeks internal loop maju menjadi2— angka2yang baru bergeser tidak pernah diperiksa. - Iterasi berikutnya: loop melanjutkan dari indeks
2(nilai3) hingga selesai, meninggalkan satu2terlewat.
Dua perbaikan yang benar: bangun list baru dari elemen yang ingin dipertahankan, atau iterasi salinan sambil mengubah list aslinya.
# Cara 1: bangun list baru
angka = [1, 2, 2, 3, 4]
bersih = []
for item in angka:
if item != 2:
bersih.append(item)
print("cara 1:", bersih)
# Cara 2: iterasi salinan, ubah yang asli
angka = [1, 2, 2, 3, 4]
for item in angka[:]:
if item == 2:
angka.remove(item)
print("cara 2:", angka)Output yang Dihasilkan:
cara 1: [1, 3, 4]
cara 2: [1, 3, 4]Ekspresi angka[:] membuat salinan penuh terlebih dahulu, sehingga loop berjalan di atas salinan yang tidak berubah sementara remove() menghantam list aslinya dengan aman. Di kemudian hari, Section Comprehensions dan Iterators memperkenalkan bentuk yang lebih ringkas untuk pola saring seperti ini.