Bab 8 — Perulangan: Menyuruh Program Mengerjakan Hal yang Sama Berkali-kali
Seri B2 — Fondasi Bahasa Python
Semua skrip bab ini ada di folder kode/bab08/. Di versi web, Anda juga bisa mengunduh semuanya sekaligus (zip).
Bayangkan memeriksa 40 kolam ikan. Menulis print 40 kali jelas melelahkan, dan kalau jumlah kolamnya bertambah menjadi 41, Anda harus mengubah kode lagi. Di sinilah perulangan (loop) menyelamatkan Anda. Ini bahan ketiga dari Bab 2.
for: untuk setiap isi daftar
01_for_dasar.py
# Bab 8 - for: mengulang untuk setiap isi daftar
daftar_kolam = ["A", "B", "C"]
for kolam in daftar_kolam:
print(f"Memeriksa Kolam {kolam}")
print("Semua kolam sudah diperiksa")Memeriksa Kolam A
Memeriksa Kolam B
Memeriksa Kolam C
Semua kolam sudah diperiksa
Baca seperti kalimat: “untuk setiap kolam di dalam daftar_kolam, kerjakan yang menjorok.” Pada putaran pertama kolam berisi "A", putaran kedua "B", dan seterusnya. Baris terakhir tidak menjorok, jadi hanya dikerjakan sekali, setelah semua putaran selesai.
Aturan indentasi dari Bab 7 berlaku juga di sini: baris yang menjorok adalah isi perulangan yang diulang; baris yang tidak menjorok dikerjakan sesudah perulangan selesai.
range: deretan angka
Kalau Anda tidak punya daftar tetapi ingin mengulang sekian kali, pakai range():
02_range.py
# Bab 8 - range(): membuat deretan angka
for hari in range(1, 6): # 1, 2, 3, 4, 5 (angka 6 tidak ikut)
print(f"Hari ke-{hari}")
print(list(range(5))) # mulai dari 0
print(list(range(0, 10, 3))) # loncat 3 angkaHari ke-1
Hari ke-2
Hari ke-3
Hari ke-4
Hari ke-5
[0, 1, 2, 3, 4]
[0, 3, 6, 9]

range(1, 6) berhenti sebelum 6, jadi menghasilkan 1, 2, 3, 4, 5.range(5)menghasilkan 0, 1, 2, 3, 4: mulai dari 0 dan berhenti sebelum 5.range(1, 6)menghasilkan 1 sampai 5: angka akhir tidak ikut.range(0, 10, 3)meloncat 3 angka sekali.list(...)mengubah deretan itu menjadi daftar supaya bisa dicetak.
Angka akhir di range() tidak ikut. Ini jebakan klasik: range(1, 6) hanya sampai 5, bukan 6. Kalau butuh sampai 6, tulis range(1, 7).
Pola penampung: menjumlahkan lewat perulangan
Salah satu pola paling berguna: siapkan variabel awal bernilai 0, lalu tambahkan isi daftar satu per satu.
03_penjumlahan.py
# Bab 8 - Menjumlahkan lewat perulangan (pola "penampung")
panen_harian_kg = [120.5, 98.25, 143.0]
total_kg = 0
for panen in panen_harian_kg:
total_kg = total_kg + panen
jumlah_hari = len(panen_harian_kg) # len() = banyaknya isi daftar
print(f"Total panen: {total_kg} kg dalam {jumlah_hari} hari")
print(f"Rata-rata: {total_kg / jumlah_hari:.2f} kg per hari")Total panen: 361.75 kg dalam 3 hari
Rata-rata: 120.58 kg per hari
Telusuri total_kg: mulai 0, jadi 120.5, lalu 218.75, lalu 361.75. len(daftar) memberi banyaknya isi daftar, di sini 3.
Python sebenarnya punya sum(panen_harian_kg) yang menjumlahkan dalam satu langkah (Bab 9). Tetapi pola penampung dengan perulangan penting dipahami, karena kerangka yang sama dipakai untuk menghitung, mencari yang terbesar, dan menyaring data.
while: ulangi selama syaratnya benar
for cocok bila Anda tahu berapa kali atau daftarnya. while cocok bila Anda hanya tahu kapan harus berhenti. Ingat diagram alur memberi pakan di Bab 2? Berikut versi programnya:
04_while.py
# Bab 8 - while: mengulang selama syarat masih benar
# (mengikuti diagram alur memberi pakan di Bab 2)
pakan_g = 2000
print(f"Tebar pakan awal: {pakan_g} g")
while pakan_g < 2400: # ikan masih berebut
pakan_g = pakan_g + 200
print(f"Tambah 200 g, total {pakan_g} g")
print("Ikan sudah tenang, selesai")Tebar pakan awal: 2000 g
Tambah 200 g, total 2200 g
Tambah 200 g, total 2400 g
Ikan sudah tenang, selesai
Putaran pertama: 2000 < 2400, jadi tambah 200 menjadi 2200. Putaran kedua: 2200 < 2400, tambah lagi menjadi 2400. Sekarang 2400 < 2400 salah, perulangan berhenti.
Perulangan tanpa akhir. Kalau Anda lupa mengubah variabel yang diperiksa (misalnya tidak ada baris pakan_g = pakan_g + 200), syaratnya tidak pernah menjadi salah dan program berputar selamanya. Jangan panik: tekan Ctrl + C di terminal (Bab 3) untuk membatalkannya.
break dan continue
Dua kata penolong untuk mengatur putaran:
continue: lewati sisa putaran ini, langsung ke putaran berikutnya.break: berhenti total, keluar dari perulangan.
05_break_continue.py
# Bab 8 - continue (lewati) dan break (berhenti)
bobot_timbangan_g = [480, 0, 510, 530]
for bobot in bobot_timbangan_g:
if bobot == 0:
print("Timbangan error, dilewati")
continue
print(f"Menimbang {bobot} g")
if bobot >= 500:
print("Ketemu ikan siap panen, berhenti")
breakMenimbang 480 g
Timbangan error, dilewati
Menimbang 510 g
Ketemu ikan siap panen, berhenti
Timbangan membaca 0 (error), jadi continue melewatinya. Begitu ketemu ikan 510 g yang memenuhi syarat, break menghentikan perulangan: angka 530 tidak pernah diperiksa.
Perulangan di dalam perulangan
06_perulangan_bersarang.py
# Bab 8 - Perulangan di dalam perulangan
for blok in ["A", "B"]:
for baris in range(1, 3):
print(f"Blok {blok}, baris {baris}")Blok A, baris 1
Blok A, baris 2
Blok B, baris 1
Blok B, baris 2
Untuk setiap blok, perulangan dalam berjalan penuh. Pola ini berguna untuk data berbentuk tabel: blok dan baris, kolam dan hari, petak dan bulan.
Jebakan: range tidak mau desimal
07_range_desimal_salah.py
# Bab 8 - Salah: range() hanya menerima bilangan bulat
for i in range(2.5):
print(i)Traceback (most recent call last):
File "07_range_desimal_salah.py", line 2, in <module>
for i in range(2.5):
~~~~~^^^^^
TypeError: 'float' object cannot be interpreted as an integer
TypeError berarti tipe datanya tidak cocok: range() hanya mau bilangan bulat. Bila Anda butuh langkah desimal, pakai while.
Proyek Bersambung B2: rekap panen kebun
Sekarang kita gabungkan perulangan, penampung, dan keputusan (Bab 7) untuk merekap panen empat blok kebun:
08_proyek_rekap_panen.py
# Bab 8 - Proyek bersambung B2: rekap panen kebun per blok
nama_blok = ["A", "B", "C", "D"]
panen_kg = [245.5, 310.0, 198.5, 276.0]
total_kg = 0
blok_terbaik = nama_blok[0]
panen_terbaik = panen_kg[0]
for i in range(len(nama_blok)):
print(f"Blok {nama_blok[i]}: {panen_kg[i]} kg")
total_kg = total_kg + panen_kg[i]
if panen_kg[i] > panen_terbaik:
panen_terbaik = panen_kg[i]
blok_terbaik = nama_blok[i]
print(f"Total: {total_kg} kg")
print(f"Rata-rata: {total_kg / len(nama_blok)} kg per blok")
print(f"Blok terbaik: {blok_terbaik} ({panen_terbaik} kg)")Blok A: 245.5 kg
Blok B: 310.0 kg
Blok C: 198.5 kg
Blok D: 276.0 kg
Total: 1030.0 kg
Rata-rata: 257.5 kg per blok
Blok terbaik: B (310.0 kg)
Tiga hal terjadi dalam satu perulangan: mencetak tiap blok, menambah total_kg, dan memperbarui “juara” lewat if. Setelah perulangan selesai, program mencetak total, rata-rata (1030,0 ÷ 4 = 257,5), dan blok terbaik.
Latihan
- Cetak tabel perkalian 7 (7 × 1 sampai 7 × 10) dengan
fordanrange(). - Diberikan bobot sapi
[350, 412.5, 389.0, 401.5], hitung total dan rata-ratanya dengan pola penampung. - Ubah
04_while.pysupaya menambah 150 g tiap putaran, mulai dari 1800 g, berhenti saat mencapai atau melewati 2400 g. Berapa kali ia menambah, dan berapa total akhirnya? - Tantangan: dari daftar
[480, 0, 510, 530, 0, 495], hitung jumlah timbangan yang valid (bukan 0) dan rata-rata bobot yang valid, memakaicontinue.
Ringkasan Bab
for x in daftar:mengulang untuk setiap isi;range(a, b)membuat deretan angka dan berhenti sebelumb.while syarat:mengulang selama syarat benar; pastikan ada yang membuatnya akhirnya salah.continuemelewati satu putaran;breakmenghentikan seluruh perulangan.- Pola penampung: mulai dari 0, lalu tambahkan di dalam perulangan.
- Baris yang menjorok adalah isi perulangan.
- Bingung dengan perulangan tanpa akhir? Ctrl + C.
Selanjutnya, di Bab 9: kita sudah memakai daftar [...] tanpa banyak penjelasan. Sekarang kita kenali keluarga lengkapnya: list, tuple, dict, dan set, yaitu wadah untuk data pohon, ikan, dan ternak.