Perulangan

Perulangan for dengan range, while, dan iterasi langsung atas string dan list.

Daftar isi

Perulangan menjalankan sekumpulan pernyataan berulang kali tanpa menyalin kodenya. Topik ini membahas pernyataan for untuk iterasi langsung atas urutan seperti list dan string, fungsi range() untuk perulangan berhitung, serta pernyataan while yang berjalan selama kondisinya benar. Setelah membacanya, bentuk perulangan yang tepat dapat dipilih untuk setiap kasus, dan pola akumulator sederhana seperti penjumlahan serta pencarian nilai tertinggi dapat ditulis dengan benar.

Perulangan for atas urutan#

Pernyataan for mengiterasi item dari sebuah urutan satu per satu. Variabel yang ditulis setelah kata kunci for menampung nilai item berjalan, blok yang menjorok dijalankan untuk setiap item, dan perulangan berakhir setelah item terakhir selesai diproses. Python tidak memerlukan indeks untuk mengunjungi seluruh item, sehingga iterasi atas list maupun string ditulis dengan bentuk yang sama. String diperlakukan sebagai urutan karakter, sehingga perulangan atasnya menghasilkan satu huruf per iterasi.

python Contoh: iterasi atas list dan string
nilai_ujian = [82, 75, 91, 64]
for nilai in nilai_ujian:
    print("nilai:", nilai)

for huruf in "Ayo":
    print(huruf)
text Keluaran
nilai: 82
nilai: 75
nilai: 91
nilai: 64
A
y
o

Variabel nilai berulang kali menampung angka satu per satu, sedangkan huruf menampung karakter demi karakter dari string "Ayo". Nama variabel perulangan bebas ditentukan, tetapi nama yang menggambarkan satu item, seperti nilai atau huruf, membuat isi blok lebih mudah dibaca. Setelah perulangan selesai, variabel perulangan tetap ada dan menampung nilai terakhirnya, sehingga huruf bernilai o pada contoh di atas. Perilaku ini berbeda dari sebagian bahasa yang menghapus variabel perulangannya, sehingga hindari menggunakan kembali nama yang sama untuk maksud yang berbeda di bawah perulangan.

range untuk perulangan berhitung#

Fungsi range() menghasilkan deretan bilangan bulat berurutan untuk kebutuhan perulangan berhitung. Bentuk range(n) menghasilkan bilangan dari 0 sampai n-1, bentuk range(a, b) menghasilkan bilangan dari a sampai b-1, dan bentuk ketiga range(a, b, langkah) menambahkan jarak antarbilangan. Batas atas tidak pernah diikutkan, sehingga range(4) menghasilkan empat bilangan, yaitu 0 sampai 3. Nilai langkah boleh negatif untuk menghitung menurun.

Objek range() tidak menghitung seluruh bilangannya di awal, melainkan menghasilkan satu bilangan setiap kali perulangan memintanya, sehingga rentang yang besar tetap hemat memori. Perilaku ini disebut lazy, yakni penundaan pembuatan nilai sampai nilai itu benar-benar dibutuhkan. Untuk mengamati isi rentang sebagai urutan biasa, bungkus dengan list() seperti pada contoh pemeriksaan batas di bagian kesalahan umum.

python Contoh: tiga bentuk range()
for i in range(4):
    print(i, end=" ")
print()

for i in range(1, 5):
    print(i, end=" ")
print()

for i in range(10, 0, -2):
    print(i, end=" ")
print()
text Keluaran
0 1 2 3
1 2 3 4
10 8 6 4 2

Indeks posisi dibutuhkan apabila item perlu diakses lewat posisinya. Kombinasi range(len(...)) menyediakan indeks tersebut tanpa mengubah isi listnya.

python Contoh: mengakses item lewat indeks
daftar = [12, 7, 25, 9]
for i in range(len(daftar)):
    print(f"indeks {i} bernilai {daftar[i]}")
text Keluaran
indeks 0 bernilai 12
indeks 1 bernilai 7
indeks 2 bernilai 25
indeks 3 bernilai 9

Perulangan while#

Pernyataan while mengulang bloknya selama kondisinya bernilai benar. Kondisi diperiksa kembali di awal setiap putaran, sehingga blok yang dijalankan wajib memuat langkah yang mengarah pada penghentian, misalnya pengurangan penghitung atau pengosongan wadah. Penilaian kondisinya memanfaatkan truthiness yang sama dengan percabangan, sehingga list yang masih berisi data dinilai benar dan list yang kosong dinilai salah. Bentuk while dipilih apabila jumlah putaran belum diketahui di awal, misalnya memproses antrean yang panjangnya berubah-ubah, sedangkan jumlah putaran yang sudah pasti lebih cocok ditangani for karena batasnya tertulis pada satu tempat.

Karena pemeriksaan dilakukan di awal setiap putaran, blok while dapat tidak berjalan sama sekali. Kondisi yang sudah salah sebelum putaran pertama, misalnya penghitung yang langsung bernilai nol, membuat seluruh blok dilewati begitu saja. Dalam keadaan itu, eksekusi berlanjut ke baris setelah perulangan tanpa menjalankan isi bloknya sekali pun.

python Contoh: while dengan penghitung mundur
sisa_coba = 3
while sisa_coba > 0:
    print("percobaan tersisa:", sisa_coba)
    sisa_coba -= 1
text Keluaran
percobaan tersisa: 3
percobaan tersisa: 2
percobaan tersisa: 1

Contoh berikut memanfaatkan truthiness dari list untuk memproses antrean loket sampai kosong. Metode pop(0) mengambil sekaligus menghapus item pertama, sehingga panjang antrean berkurang setiap putaran dan kondisi while akhirnya bernilai salah.

python Contoh: while sampai antrean kosong
antrean = ["Ali", "Budi", "Citra"]
while antrean:
    berikutnya = antrean.pop(0)
    print("melayani", berikutnya)
print("antrean selesai")
text Keluaran
melayani Ali
melayani Budi
melayani Citra
antrean selesai

Pola akumulator dan contoh program utuh#

Banyak perhitungan atas kumpulan data mengikuti pola akumulator (accumulator), yaitu variabel yang dibuat sebelum perulangan lalu diperbarui pada setiap iterasi. Penjumlahan mengumpulkan total, sedangkan pencarian nilai tertinggi membandingkan setiap item dengan pemegang rekor yang berjalan. Program berikut menerapkan kedua pola itu pada satu kumpulan nilai ujian.

python rekap-nilai.py
nilai_ujian = [82, 75, 91, 64]

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

tertinggi = nilai_ujian[0]
for nilai in nilai_ujian:
    if nilai > tertinggi:
        tertinggi = nilai

rata_rata = total / len(nilai_ujian)
print(f"total     : {total}")
print(f"tertinggi : {tertinggi}")
print(f"rata-rata : {rata_rata}")
text Keluaran
total     : 312
tertinggi : 91
rata-rata : 78.0

Total dimulai dari 0 dan bertambah dengan setiap nilai, sehingga hasilnya 312. Pemegang rekor tertinggi dimulai dari item pertama, dan hanya nilai yang lebih besar yang menggantikannya, sehingga hasilnya 91. Rata-rata diperoleh dengan membagi total oleh banyaknya item. Pola akumulator juga menjadi dasar bagi perhitungan sederhana lainnya, seperti pencarian nilai terendah dengan perbandingan terbalik atau penghitung item yang memenuhi syarat. Untuk kasus yang sama, fungsi bawaan sum() dan max() menghasilkan angka yang identik tanpa perulangan yang ditulis sendiri.

python Contoh: fungsi bawaan sum() dan max()
nilai_ujian = [82, 75, 91, 64]
print(sum(nilai_ujian), max(nilai_ujian), sum(nilai_ujian) / len(nilai_ujian))
text Keluaran
312 91 78.0

Variabel penghitung adalah bentuk akumulator kedua yang sering digunakan. Nilai awalnya nol, dan blok perulangan menambahkannya satu demi satu setiap kali sebuah syarat terpenuhi.

python Contoh: menghitung item yang memenuhi syarat
nilai_ujian = [82, 75, 91, 64]
di_atas_batas = 0
for nilai in nilai_ujian:
    if nilai >= 75:
        di_atas_batas += 1
print("banyak nilai minimal 75:", di_atas_batas)
text Keluaran
banyak nilai minimal 75: 3

Tiga nilai memenuhi syarat, yaitu 82, 75, dan 91, sedangkan 64 tidak menambah penghitung. Pola semacam ini menjadi dasar perhitungan banyaknya item yang lolos kriteria. Item tidak perlu disimpan satu per satu, karena hanya jumlahnya yang ditampung.

Simpan berkas program di atas di direktori kerja, lalu jalankan dengan perintah berikut.

bash
# menjalankan program rekap nilai
python3 rekap-nilai.py
text Keluaran
total     : 312
tertinggi : 91
rata-rata : 78.0

Kesalahan umum#

Kesalahan pertama adalah perulangan while yang kondisinya tidak pernah berubah. Apabila bloknya tidak memuat langkah yang mengarah pada penghentian, kondisi tetap benar selamanya dan program tidak pernah selesai, sehingga sistem memaksa penghentiannya. Pastikan setiap while memiliki variabel yang diperbarui di dalam bloknya dan kondisi yang dapat menjadi salah.

Kesalahan kedua adalah menganggap batas atas range() ikut diikutkan. Nilai yang diberikan sebagai batas atas hanya menjadi tanda pemberhentian, sehingga range(1, 5) menghasilkan empat bilangan, bukan lima. Selisih semacam ini dikenal sebagai kesalahan off-by-one dan sering lolos sampai program dijalankan.

python Contoh: batas atas range() tidak diikutkan
print(list(range(1, 5)))
text Keluaran
[1, 2, 3, 4]

Apabila lima bilangan 1 sampai 5 memang diperlukan, tulis batas atasnya sebagai 6, sehingga rentangnya menjadi range(1, 6). Kebiasaan mencetak list(range(...)) saat mengembangkan kode membantu memastikan rentang yang dihasilkan sudah sesuai. Pemeriksaan semurah ini jauh lebih ringan daripada menelusuri kesalahan di bagian program yang lain.

Ringkasan#

  • Pernyataan for mengiterasi item urutan secara langsung, sedangkan range() menghasilkan bilangan berhitung dengan batas atas yang tidak pernah diikutkan.
  • Pernyataan while berjalan selama kondisinya benar dan wajib memiliki langkah yang mengarah pada penghentian.
  • Pola akumulator menampung hasil tiap iterasi pada satu variabel, misalnya total penjumlahan dan pemegang rekor nilai tertinggi.
  • Fungsi bawaan sum() dan max() menggantikan perulangan akumulator yang paling umum.

Referensi#