Perulangan dan Fungsi
for, while, range, plus def untuk membungkus logika jadi fungsi yang bisa dipakai ulang.
Loop dan fungsi: dua senjata melawan pengulangan
Bayangkan kamu kasir warung yang harus menghitung total untuk 200 struk belanja. Kamu tidak akan menulis rumus yang sama 200 kali di kertas, kamu akan memakai mesin kasir: masukkan daftar harga, tekan tombol, semua dihitung. Perulangan (loop) dan fungsi adalah "mesin kasir" di dalam kode: loop menjalankan instruksi yang sama untuk banyak data, sedangkan fungsi membungkus instruksi jadi "tombol" yang bisa ditekan kapan saja.
Kenapa dua konsep ini ada? Jawabannya satu kata: pengulangan. Manusia buruk dalam pekerjaan berulang (cepat bosan, gampang salah ketik), komputer justru hebat dalam hal itu. Hampir semua analisis data intinya adalah "lakukan hal yang sama ke tiap baris data", mustahil ditulis per baris untuk 10.000 baris. Fungsi lahir dari masalah kedua: tanpa fungsi, logika yang dipakai di lima tempat disalin lima kali, dan satu perbaikan berarti mengedit lima tempat (dijamin ada yang lupa).
Contoh 1: for yang sederhana
for i in range(5):
print(i) # 0, 1, 2, 3, 4for artinya "untuk setiap item dalam kumpulan ini, lakukan ini". range(n) menghasilkan angka 0 sampai n-1. Variasi yang sering dipakai:
for i in range(1, 6): # mulai dari 1 sampai 5
print(i)
for i in range(0, 10, 2): # 0, 2, 4, 6, 8 (loncat 2)
print(i)Dan loop paling natural di Python: jalan langsung di atas list, tanpa perlu indeks.
buah = ["apel", "mangga", "jeruk"]
for b in buah:
print("Saya suka", b)Contoh 2: loop di atas data penjualan (lebih nyata)
Inilah loop dalam wujud aslinya: operasi yang sama diterapkan ke banyak baris data.
# Data penjualan hari ini: (nama produk, harga, jumlah terjual)
penjualan = [
("Kopi Tubruk", 15000, 24),
("Teh Manis", 8000, 31),
("Indomie", 12000, 18),
]
omzet = 0
for nama, harga, terjual in penjualan:
subtotal = harga * terjual
omzet += subtotal
print(f"{nama}: {terjual} x Rp{harga:,} = Rp{subtotal:,}")
print("Total omzet: Rp", f"{omzet:,}")Pola dasarnya: siapkan omzet = 0 sebelum loop (accumulator), tiap putaran menambah subtotal. Pola "siapkan penampung, loop, pakai hasil" ini muncul di hampir semua agregasi data.
while: ulangi selama kondisi masih benar
Kalau for dipakai saat jumlah putaran sudah jelas, while dipakai saat putarannya belum tahu: "ulangi terus sampai sesuatu berubah". Analoginya seperti mengisi ember: kamu tidak tahu persis berapa gayung yang dibutuhkan, kamu berhenti saat ember penuh.
saldo = 100000
while saldo > 0:
print("Sisa saldo:", saldo)
saldo -= 30000 # tiap putaran kondisi bergerak mendekati False
print("Saldo habis.")Syarat mutlak while: kondisi harus bisa menjadi False, kalau tidak program terjebak selamanya (infinite loop). Setiap loop while wajib punya baris yang mengubah kondisi ke arah berhenti.
Catatan teknis:
breakmenghentikan loop secara paksa,continuemelompat ke putaran berikutnya. Keduanya berguna, tapi loop yang berhenti "dengan sendirinya" lewat kondisi jauh lebih mudah dipahami.
Fungsi: resep masakan yang bisa dipakai ulang
Kalau loop menjawab "bagaimana mengulang", fungsi menjawab "bagaimana tidak menulis ulang". Analoginya resep masakan: tulis sekali, pakai berkali-kali dengan bahan berbeda. Parameter adalah bahan yang bisa diganti, return adalah hidangan hasilnya.
def sapa(nama):
return "Halo, " + nama + "!"
print(sapa("Dina")) # Halo, Dina!
print(sapa("Bima")) # Halo, Bima!Bedanya: print hanya menampilkan (hasilnya hilang), return mengembalikan nilai untuk dipakai lanjut. Fungsi boleh punya nilai default dan mengembalikan lebih dari satu nilai:
def hitung_diskon(harga, persen=10):
potongan = harga * persen / 100
return harga - potongan, potongan
akhir, hemat = hitung_diskon(200000)
print(akhir, hemat) # 180000.0 20000.0
print(hitung_diskon(200000, 20)) # persen bisa digantiContoh 2: fungsi dipakai di dalam loop (pola data analyst)
Kombinasi loop dan fungsi adalah pola kerja sehari-hari analyst: fungsi berisi aturan, loop menerapkannya ke tiap baris data.
def kategori_pelanggan(total):
"""Beri label segmen berdasarkan total belanja."""
if total >= 1000000:
return "Platinum"
elif total >= 500000:
return "Gold"
return "Silver"
pelanggan = [("Andi", 1250000), ("Budi", 750000), ("Cici", 200000)]
for nama, total in pelanggan:
segmen = kategori_pelanggan(total)
print(f"{nama}: Rp{total:,} -> {segmen}")Aturan segmentasi tertulis sekali di fungsi, loop hanya memanggilnya. Kalau aturan berubah, kamu mengedit satu tempat saja.
Catatan teknis:
"""teks"""tepat di bawahdefdisebut docstring: dokumentasi resmi fungsi. Menuliskannya bikin fungsi mudah dipakai orang lain (dan dirimu sendiri enam bulan dari sekarang).
Kesalahan umum pemula
SALAH: Loop while yang kondisinya tidak pernah berubah (infinite loop).
saldo = 100000
while saldo > 0:
print(saldo) # saldo tidak pernah berkurang: jalan selamanya!BENAR: Selalu ada baris yang mengubah kondisi ke arah berhenti:
saldo = 100000
while saldo > 0:
print(saldo)
saldo -= 30000SALAH: Mengira range(5) menghasilkan 1 sampai 5.
for i in range(5):
print(i) # 0, 1, 2, 3, 4 (bukan 1-5!)BENAR: range(n) selalu mulai dari 0. Mau 1 sampai 5? Tulis batasnya:
for i in range(1, 6):
print(i) # 1, 2, 3, 4, 5SALAH: Memakai print padahal butuh return, lalu hasilnya tidak bisa dipakai.
def tambah(a, b):
print(a + b)
hasil = tambah(2, 3) # hasil = None, angkanya hilang!BENAR:
def tambah(a, b):
return a + b
hasil = tambah(2, 3) # hasil = 5, bisa dipakai lanjutSALAH: Mereset akumulator di dalam loop, bukan sebelum loop.
for harga in [10000, 20000]:
omzet = 0 # direset tiap putaran: hasil akhir cuma putaran terakhir!
omzet += hargaBENAR: Siapkan penampung sebelum loop dimulai:
omzet = 0
for harga in [10000, 20000]:
omzet += harga
print(omzet) # 30000Tantangan
Tabel perkalian fungsi
Buat fungsi tabel_kali(n) yang mencetak tabel perkalian 1 sampai 10 untuk angka n memakai loop for. Panggil untuk n=7 dan n=9.