Seluruh contoh sejauh ini memproses segelintir nilai. Data nyata tidak sebaik itu: satu pekan penjualan berarti ratusan transaksi, satu bulan catatan sensor berarti ribuan baris, dan menganalisisnya berarti mengulang pekerjaan yang sama untuk setiap nilai. Perulangan mengotomatiskan pengulangan tersebut — for menelusuri sekumpulan nilai, while berjalan selama sebuah kondisi terpenuhi, dan pola akumulator mengumpulkan total, rata-rata, serta nilai terbesar sepanjang penelusuran. Chapter ini menutup rangkaian dasar Python kita dengan pola-pola yang dipakai setiap hari di pengolahan data.

for untuk Menelusuri Sekumpulan Nilai #

Perulangan for mengambil satu per satu nilai dari sebuah kumpulan — untuk sekarang, kumpulan berupa list — lalu menjalankan blok terindentasi untuk tiap nilainya. Variabel di depan for (di bawah ini bernama suhu) menjadi wadah nilai yang sedang ditelusuri:

python
suhu_bandung = [24.5, 26.0, 27.5, 25.0, 28.5]

for suhu in suhu_bandung:
    print(f"Suhu tercatat: {suhu} derajat Celsius")

Output yang Dihasilkan:

text
Suhu tercatat: 24.5 derajat Celsius
Suhu tercatat: 26.0 derajat Celsius
Suhu tercatat: 27.5 derajat Celsius
Suhu tercatat: 25.0 derajat Celsius
Suhu tercatat: 28.5 derajat Celsius

Lima nilai pada list menghasilkan lima baris keluaran — satu baris untuk setiap kali blok dijalankan. Pada pengolahan data, pola ini adalah kereta pengangkut semua pekerjaan lain: penyaringan pada chapter sebelumnya, penghitungan di bawah, hingga penulisan laporan. Seluruh isi list bisa berapa pun banyaknya; bloknya tetap satu.

Akumulator: Total, Rata-rata, dan Nilai Terbesar #

Pola paling penting di dalam perulangan adalah akumulator: sebuah variabel yang disiapkan sebelum perulangan, diperbarui pada tiap putaran, dan dibaca hasilnya setelah perulangan selesai. Untuk total dan rata-rata nilai transaksi, bentuknya seperti berikut:

python
transaksi_harian = [42, 18, 65, 30, 25]

total = 0
for nilai in transaksi_harian:
    total = total + nilai

rata_rata = total / len(transaksi_harian)
print("Total transaksi :", total)
print("Rata-rata       :", rata_rata)

Output yang Dihasilkan:

text
Total transaksi : 180
Rata-rata       : 36.0

Dua baris kuncinya: total = 0 menyiapkan wadah di nilai netral, lalu total = total + nilai membaca nilai lama, menambah nilai transaksi berjalan, dan menyimpannya kembali. Setelah lima putaran, total berisi jumlah seluruh transaksi; membaginya dengan len(transaksi_harian) menghasilkan rata-rata 36.0.

Pola yang sama bisa dipakai untuk mencari nilai terbesar. Kali ini akumulatornya diisi nilai pertama sebagai pembanding awal, lalu diganti setiap kali ditemukan nilai yang lebih besar:

python
transaksi_harian = [42, 18, 65, 30, 25]

terbesar = transaksi_harian[0]
for nilai in transaksi_harian:
    if nilai > terbesar:
        terbesar = nilai

print("Nilai terbesar (manual)  :", terbesar)
print("Nilai terbesar (max())   :", max(transaksi_harian))

Output yang Dihasilkan:

text
Nilai terbesar (manual)  : 65
Nilai terbesar (max())   : 65

Penelusurannya berjalan demikian: terbesar berangkat dari 42, naik menjadi 65 saat bertemu transaksi ketiga, lalu tidak berubah lagi hingga selesai. Python juga menyediakan jalan pintasnya — sum(), max(), dan min() — serta modul statistics dengan statistics.mean(); hasilnya sama persis, seperti keluaran max() di atas. Membangun akumulator secara manual tetap penting karena pola yang sama kelak menghitung hal-hal yang tidak punya fungsi siap pakai: jumlah transaksi bermasalah, rata-rata bergerak, atau skor gabungan.

range: Menelusuri Berdasarkan Posisi #

Kadang kita tidak menelusuri nilainya, melainkan posisinya — misalnya memberi nomor urut hari. Fungsi range() menghasilkan deretan bilangan untuk keperluan itu. range(7) berarti 0 sampai 6, sedangkan range(1, 8) berarti mulai 1 hingga sebelum 8:

python
penjualan_mingguan = [120, 135, 150, 128, 142, 160, 155]

for indeks in range(7):
    hari_ke = indeks + 1
    print(f"Hari ke-{hari_ke}: {penjualan_mingguan[indeks]} cangkir terjual")

Output yang Dihasilkan:

text
Hari ke-1: 120 cangkir terjual
Hari ke-2: 135 cangkir terjual
Hari ke-3: 150 cangkir terjual
Hari ke-4: 128 cangkir terjual
Hari ke-5: 142 cangkir terjual
Hari ke-6: 160 cangkir terjual
Hari ke-7: 155 cangkir terjual

Di sini range(7) menghasilkan posisi 0-6, yang kita ubah menjadi nomor hari 1-7 dan dipakai untuk mengambil nilai dari list lewat penjualan_mingguan[indeks]. Pola “range + indeks” seperti ini sah dan sering ditemui, tetapi perhatikan bahwa ia membebankan pembaca untuk melacak hubungan antara indeks dan data. Python punya cara yang lebih langsung untuk kasus ini — enumerate(), yang kita bahas tiga bagian di bawah.

while: Berjalan Selama Kondisi Terpenuhi #

Perulangan for cocok saat kumpulan nilainya sudah ada. Perulangan while cocok saat yang kita tahu adalah kondisi berhentinya, bukan jumlah putarannya. Katakanlah kafe kita melayani antrean 63 orang dengan meja berkapasitas 12 orang per giliran — jumlah giliran tidak diketahui di depan, tetapi aturan berhentinya jelas: antrean habis:

python
antrean_pelanggan = 63
kapasitas_meja = 12
giliran = 0

while antrean_pelanggan > 0:
    dilayani = min(antrean_pelanggan, kapasitas_meja)
    giliran = giliran + 1
    print(f"Giliran ke-{giliran}: {dilayani} orang dilayani")
    antrean_pelanggan = antrean_pelanggan - dilayani

print("Sisa antrean:", antrean_pelanggan)

Output yang Dihasilkan:

text
Giliran ke-1: 12 orang dilayani
Giliran ke-2: 12 orang dilayani
Giliran ke-3: 12 orang dilayani
Giliran ke-4: 12 orang dilayani
Giliran ke-5: 12 orang dilayani
Giliran ke-6: 3 orang dilayani
Sisa antrean: 0

Selama antrean_pelanggan > 0 bernilai True, blok dijalankan lagi: min() mengambil yang lebih kecil antara sisa antrean dan kapasitas meja, sehingga giliran terakhir hanya melayani 3 orang. Begitu antrean mencapai 0, kondisi menjadi False dan perulangan berhenti.

break dan continue #

Dua kata kunci mengendalikan putaran dari dalam: break menghentikan seluruh perulangan seketika, sedangkan continue melewati sisa putaran berjalan dan lanjut ke nilai berikutnya. Keduanya lazim dipakai membersihkan data sensor yang mengandung nilai penanda galat:

python
suhu_sensor = [26.5, 27.0, -999, 28.5, 9999, 27.5]

for suhu in suhu_sensor:
    if suhu == -999:
        print("Data tidak valid, dilewati:", suhu)
        continue
    if suhu == 9999:
        print("Sensor bermasalah, pembacaan dihentikan.")
        break
    print("Suhu valid:", suhu)

Output yang Dihasilkan:

text
Suhu valid: 26.5
Suhu valid: 27.0
Data tidak valid, dilewati: -999
Suhu valid: 28.5
Sensor bermasalah, pembacaan dihentikan.

Alurnya: nilai -999 adalah penanda “sensor gagal membaca” sehingga continue melewatkannya tanpa menghitung; nilai 9999 menandai kerusakan parah sehingga break menghentikan seluruh pembacaan — nilai 27.5 di belakangnya tidak pernah diproses, dan memang seharusnya begitu karena data setelah sensor rusak tidak bisa dipercaya.

enumerate dan zip untuk Data Berpasangan #

Data nyata hampir selalu berpasangan: nama kota dengan suhunya, nama produk dengan harganya. Fungsi enumerate() melengkapi penelusuran dengan nomor urut, sedangkan zip() memasangkan dua list atau lebih yang sejajar:

python
kota = ["Bandung", "Surabaya", "Medan"]
suhu = [23.5, 31.0, 27.5]

for urutan, nama_kota in enumerate(kota, start=1):
    print(f"Kota ke-{urutan}: {nama_kota}")

for nama_kota, suhu_kota in zip(kota, suhu):
    print(f"Suhu {nama_kota}: {suhu_kota} derajat Celsius")

Output yang Dihasilkan:

text
Kota ke-1: Bandung
Kota ke-2: Surabaya
Kota ke-3: Medan
Suhu Bandung: 23.5 derajat Celsius
Suhu Surabaya: 31.0 derajat Celsius
Suhu Medan: 27.5 derajat Celsius

Perulangan pertama menggantikan pola “range + indeks” dari tadi dengan lebih jelas: enumerate() menyerahkan nomor urut (mulai dari 1 karena start=1) dan nilainya sekaligus. Perulangan kedua memasangkan posisi ke-i dari kota dengan posisi ke-i dari suhu — Bandung dengan 23.5, Surabaya dengan 31.0 — persis cara kita membaca dua kolom pada satu tabel.

Perulangan Bersarang untuk Tabel Kecil #

Data bertabel adalah list di dalam list: tiap baris satu list, dan keseluruhan tabel satu list of lists. Mengolahnya memakai perulangan bersarang — perulangan luar menelusuri baris, perulangan dalam menelusuri isi tiap baris:

python
produk = ["Kopi Susu", "Teh Tawar", "Matcha Latte"]
penjualan = [
    [120, 135, 150],
    [80, 95, 88],
    [60, 72, 66],
]

for nama_produk, baris in zip(produk, penjualan):
    total = 0
    for nilai in baris:
        total = total + nilai
    print(f"{nama_produk}: total {total} cangkir")

Output yang Dihasilkan:

text
Kopi Susu: total 405 cangkir
Teh Tawar: total 263 cangkir
Matcha Latte: total 198 cangkir

Perulangan luar mengambil satu produk beserta baris penjualannya (misalnya [120, 135, 150] untuk Kopi Susu), lalu perulangan dalam menambahkan tiap nilai pada baris tersebut ke akumulator total. Setelah baris selesai, total dicetak dan akumulator disiapkan ulang (total = 0) untuk produk berikutnya. Pola “akumulator per baris” seperti inilah cikal bakal operasi sum() per kolom dan per baris di NumPy serta pandas.

Referensi Resmi #

Rangkuman #

  • for menelusuri satu per satu nilai dari sebuah kumpulan; while berjalan selama kondisinya True dan berhenti begitu kondisi menjadi False.
  • Pola akumulator — siapkan variabel sebelum perulangan, perbarui di dalamnya, baca setelahnya — menghasilkan total, rata-rata, dan nilai terbesar; sum(), max(), serta statistics.mean() adalah jalan pintasnya.
  • range() menelusuri berdasarkan posisi; enumerate() memberi nomor urut; zip() memasangkan beberapa list yang sejajar.
  • break menghentikan seluruh perulangan, continue melewati satu putaran — keduanya berguna menangani data bermasalah.
  • Data tabel berupa list of lists diolah dengan perulangan bersarang: luar untuk baris, dalam untuk isi baris.

Nilai, tipe, operator, percabangan, dan kini perulangan — fondasi Python untuk data kita sudah lengkap. Satu hal belum kita bedah: wadah-wadah yang selama ini ditelusuri. List, tuple, dictionary, dan set memiliki kekuatan yang berbeda untuk kebutuhan data yang berbeda, dan memilih wadah yang tepat adalah materi chapter Struktur Data Python .