BAB 11: Perulangan dengan for dan range
Ulangi blok kode secara otomatis menggunakan for loop dan range() untuk mengevaluasi semua peserta kuis sekaligus.
Di akhir bab sebelumnya, kuis.py kita sudah bisa menentukan kategori nilai dan memberikan rekomendasi untuk satu peserta. Tapi kita punya skor_peserta = [85, 72, 91, 68] — empat peserta yang perlu dievaluasi. Menyalin blok if-elif-else empat kali bukan solusi — itu cara yang rapuh, boros, dan akan menjadi mimpi buruk ketika pesertanya bertambah jadi 100 orang.
Solusinya adalah perulangan: mekanisme yang memungkinkan Python menjalankan blok kode yang sama berulang kali, satu per satu, untuk setiap item dalam kumpulan data.
Anatomi for Loop
Python menggunakan kata kunci for dikombinasikan dengan in untuk melakukan iterasi. Polanya selalu konsisten:
for variabel in iterable:
# blok kode yang diulang
variabel di sini adalah nama sementara yang menampung satu nilai dari iterable di setiap putaran. iterable bisa berupa list, string, tuple, atau objek apapun yang bisa diiterasi. Blok kode di dalamnya harus diindentasi 4 spasi, persis seperti blok if.
Coba dengan list yang sederhana dulu:
# kuis.py — iterasi sederhana
daftar_peserta = ["Rina", "Budi", "Sari", "Andi"]
for nama in daftar_peserta:
print(f"Peserta: {nama}")
Peserta: Rina
Peserta: Budi
Peserta: Sari
Peserta: Andi
Setiap putaran, nama secara otomatis berisi nilai berikutnya dari daftar_peserta. Python mengurus semua penghitungan posisi — kita cukup menyebutkan “untuk setiap nama di daftar, lakukan ini.”
Fungsi range()
Seringkali kita tidak perlu iterasi di atas kumpulan data yang sudah ada — kita hanya perlu mengulangi sesuatu sejumlah n kali, atau menghasilkan urutan angka. Di sinilah range() masuk.
range() menghasilkan urutan angka secara efisien tanpa menyimpan seluruh daftarnya di memori. Ada tiga cara memanggilnya:
| Bentuk | Hasil | Keterangan |
|---|---|---|
range(n) | 0, 1, 2, ..., n-1 | Mulai dari 0, sebanyak n angka |
range(mulai, stop) | mulai, ..., stop-1 | Dari mulai hingga sebelum stop |
range(mulai, stop, langkah) | Urutan dengan kenaikan langkah | Bisa mundur jika langkah negatif |
range() tidak menghasilkan list — ia menghasilkan objek range yang lebih hemat memori. Untuk melihat isinya sebagai list, bungkus dengan list(range(...)).
Contoh konkret untuk kuis.py:
# kuis.py — menomori soal kuis
JUMLAH_SOAL = 20
print("Daftar nomor soal:")
for nomor in range(1, JUMLAH_SOAL + 1):
print(f" Soal {nomor}")
Daftar nomor soal:
Soal 1
Soal 2
...
Soal 20
Perhatikan range(1, JUMLAH_SOAL + 1): kita mulai dari 1 (bukan 0) karena nomor soal dimulai dari 1, dan batas atas harus ditambah 1 karena range tidak menyertakan nilai stop.
Melangkah Mundur
range() juga bisa berjalan mundur dengan langkah negatif. Ini berguna untuk countdown atau iterasi terbalik:
# kuis.py — countdown sebelum kuis dimulai
for hitung_mundur in range(5, 0, -1):
print(f"Kuis dimulai dalam {hitung_mundur}...")
print("Mulai!")
Kuis dimulai dalam 5...
Kuis dimulai dalam 4...
Kuis dimulai dalam 3...
Kuis dimulai dalam 2...
Kuis dimulai dalam 1...
Mulai!
Evaluasi Semua Peserta Sekaligus
Sekarang kita bisa menyelesaikan masalah yang kita tinggalkan di bab sebelumnya. Kita punya list nilai dan perlu mengevaluasi setiap peserta menggunakan kondisi dari Bab 10:
# kuis.py — evaluasi semua peserta
from typing import Final
SKOR_MAKSIMAL: Final[int] = 100
JUMLAH_SOAL: Final[int] = 20
NILAI_LULUS: Final[float] = 70.0
daftar_peserta = ["Rina", "Budi", "Sari", "Andi"]
nilai_peserta = [85.0, 72.0, 91.0, 68.0]
for i in range(len(daftar_peserta)):
nama = daftar_peserta[i]
nilai = nilai_peserta[i]
# blok if-elif-else dari Bab 10
if nilai >= 90:
kategori = "Sempurna"
elif nilai >= 80:
kategori = "Sangat Baik"
elif nilai >= NILAI_LULUS:
kategori = "Lulus"
else:
kategori = "Belum Lulus"
print(f"{nama}: {nilai} — {kategori}")
Rina: 85.0 — Sangat Baik
Budi: 72.0 — Lulus
Sari: 91.0 — Sempurna
Andi: 68.0 — Belum Lulus
Dengan satu for loop, empat peserta terevaluasi otomatis. Kalau pesertanya bertambah jadi 400, kodenya tetap sama — hanya datanya yang bertambah.
range(len(daftar)) adalah pola yang umum untuk mengakses dua list secara bersamaan menggunakan indeks. Namun di Python ada cara yang lebih idiomatis menggunakan zip() dan enumerate() — kita akan mempelajarinya di bab-bab berikutnya.
Iterasi String Karakter per Karakter
for tidak terbatas pada list dan range — ia bekerja dengan semua tipe yang bisa diiterasi, termasuk string. Saat mengiterasi string, setiap putaran menghasilkan satu karakter:
# kuis.py — memvalidasi format nama peserta
nama_input = "Rina123"
ada_angka = False
for karakter in nama_input:
if karakter.isdigit():
ada_angka = True
if ada_angka:
print(f"Nama '{nama_input}' mengandung angka — tidak valid.")
else:
print(f"Nama '{nama_input}' valid.")
Nama 'Rina123' mengandung angka — tidak valid.
Iterasi karakter per karakter seperti ini berguna untuk validasi input, pencarian pola sederhana, atau transformasi teks.
Nested Loop
for loop bisa bersarang di dalam for loop lain. Loop bagian dalam akan berjalan penuh untuk setiap satu putaran loop luar:
# kuis.py — matriks skor per sesi
daftar_peserta = ["Rina", "Budi", "Sari"]
sesi = ["Sesi A", "Sesi B"]
print("Rekap skor (contoh):")
for nama in daftar_peserta:
for nama_sesi in sesi:
print(f" {nama} — {nama_sesi}")
Rekap skor (contoh):
Rina — Sesi A
Rina — Sesi B
Budi — Sesi A
Budi — Sesi B
Sari — Sesi A
Sari — Sesi B
Nested loop yang terlalu dalam (3 level ke atas) biasanya pertanda bahwa logika perlu dipecah ke fungsi terpisah. Dua level umumnya masih mudah dibaca; lebih dari itu mulai membingungkan.
break dan continue
Dua kata kunci ini memberi kontrol lebih terhadap alur loop.
break menghentikan loop sepenuhnya begitu kondisi tertentu terpenuhi. continue melewati sisa blok kode di putaran saat ini dan langsung lanjut ke putaran berikutnya.
# kuis.py — mencari peserta pertama yang lulus sempurna
nilai_peserta = [85.0, 72.0, 91.0, 68.0, 95.0]
daftar_peserta = ["Rina", "Budi", "Sari", "Andi", "Dewi"]
peserta_sempurna = None
for i in range(len(daftar_peserta)):
if nilai_peserta[i] >= 90:
peserta_sempurna = daftar_peserta[i]
break # berhenti begitu ketemu yang pertama
if peserta_sempurna:
print(f"Peserta pertama dengan nilai sempurna: {peserta_sempurna}")
Peserta pertama dengan nilai sempurna: Sari
Sekarang continue — misalnya kita hanya ingin mencetak peserta yang lulus, melewati yang belum:
# kuis.py — cetak hanya peserta yang lulus
for i in range(len(daftar_peserta)):
if nilai_peserta[i] < NILAI_LULUS:
continue # lewati peserta yang belum lulus
nama = daftar_peserta[i]
nilai = nilai_peserta[i]
print(f"{nama}: {nilai} — Lulus")
Rina: 85.0 — Lulus
Budi: 72.0 — Lulus
Sari: 91.0 — Lulus
Dewi: 95.0 — Lulus
Latihan
Tiga tantangan berikut mengombinasikan for dengan konsep dari bab-bab sebelumnya:
-
Gunakan
fordanrange()untuk menghitung total nilai semua peserta darinilai_peserta, lalu cetak rata-ratanya. Tambahkan kondisi dari Bab 10 untuk menentukan apakah rata-rata tersebut termasuk “Lulus” atau “Belum Lulus”. -
Dari
daftar_pesertadannilai_peserta, gunakanfordenganbreakuntuk mencari dan mencetak tiga peserta pertama yang nilainya di bawahNILAI_LULUS. Jika tidak ada tiga peserta yang belum lulus, cetak pesan “Semua peserta lulus!” di akhir. -
Buat countdown dari 10 ke 1 menggunakan
range()dengan langkah negatif. Di setiap angka, cetak “Genap” jika angkanya genap, “Ganjil” jika ganjil. Gunakan operator modulo%dari Bab 9 untuk mengecek paritas.
Kuis kita sekarang bisa mengevaluasi banyak peserta sekaligus. Tapi ada satu batasan yang mungkin sudah kamu rasakan: kita masih mengakses dua list terpisah menggunakan indeks, yang terasa agak tidak natural. Python punya struktur data yang lebih cocok untuk menyimpan data berpasangan — dan itu yang akan kita jelajahi selanjutnya.