Sejak Section Control Flow, kita menjalankan for di atas list, string, dictionary, dan range tanpa pernah bertanya bagaimana caranya loop mengetahui elemen mana yang harus diambil berikutnya. Jawabannya ada pada sebuah kontrak internal bernama iterator protocol — kesepakatan dua peran antara iterable dan iterator yang menjadi mesin setiap perulangan di Python. Memahami protokol ini menjelaskan banyak hal yang selama ini kita terima begitu saja.

Dua Peran dalam Protokol #

Peran pertama adalah iterable: objek yang isinya bisa diulang — list, string, tuple, dictionary, set, dan range. Peran kedua adalah iterator: objek kursor yang sedang berjalan menelusuri isi sebuah iterable, selalu tahu posisi baca saat ini, dan mampu mengambil elemen berikutnya.

AspekIterableIterator
Peransumber data yang bisa diulangkursor yang sedang berjalan
Method kunci__iter____next__ (dan __iter__)
Contohlist, str, tuple, dict, setlist_iterator, tuple_iterator
Diiterasi berkali-kali?ya — setiap for membuat kursor barutidak — habis sekali jalan

Fungsi iter() menjembatani kedua peran: diberi iterable, fungsi iter() mengembalikan iterator segar. Fungsi type() memperlihatkan bahwa keduanya memang objek yang berbeda:

python
angka = [10, 20, 30]
koordinat = (3, 5)

print(type(angka).__name__)
print(type(iter(angka)).__name__)
print(type(koordinat).__name__)
print(type(iter(koordinat)).__name__)

Output yang Dihasilkan:

text
list
list_iterator
tuple
tuple_iterator

List angka adalah iterable, tetapi bukan iterator — list tidak punya penanda posisi baca. Setiap panggilan iter(angka) memproduksi list_iterator baru, dan kursor inilah yang benar-benar berjalan menelusuri elemen.

Bagaimana for Loop Bekerja #

Di balik layar, interpreter Python menulis ulang setiap for item in buah: menjadi urutan panggilan protokol: buat iterator dengan iter(), ambil elemen dengan next(), dan berhenti saat exception StopIteration terangkat. Perbandingan berikut menuliskan kedua bentuk tersebut secara berdampingan:

python
buah = ["apel", "jeruk", "mangga"]

# Bentuk yang biasa kita tulis
for item in buah:
    print(item)

print("---")

# Bentuk yang sebenarnya dijalankan interpreter
iterator = iter(buah)
while True:
    try:
        item = next(iterator)
    except StopIteration:
        break
    print(item)

Output yang Dihasilkan:

text
apel
jeruk
mangga
---
apel
jeruk
mangga

Kedua bagian menghasilkan output identik. Bedah versi yang diperluas:

  1. Baris 10 (iterator = iter(buah)): interpreter membuat kursor list_iterator yang siap membaca dari awal list.
  2. Baris 13 (item = next(iterator)): next() meminta elemen pada posisi baca saat ini, lalu memajukan kursor satu langkah.
  3. Baris 14-15 (except StopIteration: break): saat kursor melewati elemen terakhir, next() tidak mengembalikan None — kursor justru mengangkat exception StopIteration sebagai tanda resmi “data habis”, dan loop pun berhenti.
  4. Kesetaraan penuh: break, continue, hingga else pada for bekerja sama persis pada kedua bentuk.

Iterator Habis Sekali Jalan #

Kursor tidak punya tombol rewind. Setelah StopIteration terjadi, iterator tetap kosong selamanya — mengulang loop yang sama di atas iterator yang sama tidak menghasilkan apa-apa:

python
angka = [10, 20, 30]
iterator = iter(angka)

print("iterasi pertama:")
for item in iterator:
    print(item)

print("iterasi kedua:")
for item in iterator:
    print(item)

print("list aslinya masih utuh:")
for item in angka:
    print(item)

Output yang Dihasilkan:

text
iterasi pertama:
10
20
30
iterasi kedua:
list aslinya masih utuh:
10
20
30

Iterasi kedua langsung dilewati tanpa satu baris pun tercetak, karena kursor iterator sudah berada di ujung sejak loop pertama selesai. Lalu mengapa iterasi ketiga di atas angka tetap berjalan penuh? Karena loop for selalu memanggil iter() lebih dulu — dan iter(angka) menghadirkan kursor baru yang mulai lagi dari elemen pertama.

Dua fungsi yang tadi bekerja di belakang layar — iter() dan next() — sengaja diekspos sebagai fungsi bawaan. Chapter berikutnya menggunakannya secara manual untuk kendali penuh atas proses iterasi.