BAB 6: Persimpangan dan Putaran: Keputusan dan Perulangan
Studi kasus: "Hanya petak yang besar" #
Kepala Seksi bertanya: "Dari semua petak, mana yang lebih dari lima hektare?" Anda punya daftar luas. Memeriksanya satu per satu dengan mata memang bisa, tetapi lambat dan rawan salah. Python punya dua kemampuan yang menjawab ini: mengambil keputusan dan mengulang pekerjaan.
Konsep: keputusan dan perulangan dalam tiga kalimat #
Keputusan (if) adalah persimpangan jalan: bila syaratnya terpenuhi, Python belok kanan, bila tidak, ia lanjut lurus. Perulangan (for) adalah petugas yang mengambil satu berkas dari tumpukan, mengerjakannya, lalu mengambil berkas berikutnya sampai tumpukan habis. Keduanya sering dipakai bersama: ambil satu petak, periksa syaratnya, lalu lanjut ke petak berikutnya.

Istilah baru di bagian ini:
- Syarat: pertanyaan yang jawabannya hanya "benar" atau "salah", misalnya
luas > 5. - Blok: kelompok baris yang menjorok ke dalam. Baris yang menjorok adalah isi dari
ifataufordi atasnya. - Indentasi: jarak menjorok itu. Python memakai empat spasi.
Keputusan: if, elif, else #
luas_ha = 8.0
if luas_ha > 5:
print("petak besar")
elif luas_ha > 2:
print("petak sedang")
else:
print("petak kecil")Penjelasannya:
if luas_ha > 5:bertanya: apakah luas lebih dari 5? Tanda titik dua di ujung wajib ada.elif(singkatan "else if") hanya diperiksa bila pertanyaan di atasnya salah.elsemenampung semua yang tidak cocok dengan pertanyaan di atasnya.- Python berhenti di pilihan pertama yang benar dan melewati sisanya.
petak besarTanda perbandingan yang sering dipakai: > lebih dari, < kurang dari, >= lebih dari atau sama dengan, == sama dengan, != tidak sama dengan. Perhatikan: dua tanda sama (==) untuk bertanya, satu tanda sama (=) untuk mengisi kotak.
Perulangan: for #
luas = {"KPH Alpha": 4.0, "KPH Beta": 4.0, "KPH Gamma": 8.0}
total = 0
for nama, ha in luas.items():
total = total + ha
if ha > 5:
print(nama, "termasuk petak besar")
print("Total:", total, "ha")Penjelasannya:
total = 0menyiapkan kotak penampung jumlah, mulai dari nol.for nama, ha in luas.items():mengulang satu putaran untuk tiap pasangan di kamus. Di tiap putaran, kotaknamadanhaberisi pasangan yang sedang dibaca.total = total + hamenambahkan luas petak ke penampung. Baca: "isi kotak total dengan isi total yang lama ditambah ha".if ha > 5:berada di dalam perulangan, karena menjorok dua tingkat. Ia diperiksa tiap putaran.print("Total:" ...)tidak menjorok. Ia berjalan sekali, setelah perulangan selesai.
KPH Gamma termasuk petak besar
Total: 16.0 haAlat bantu perulangan: enumerate, break, range #
range(n)menghasilkan angka 0 sampai n dikurangi 1. Cocok untuk mengulang sejumlah tertentu.enumeratemenambahkan nomor urut (mulai 0) pada tiap putaran.breakmenghentikan perulangan lebih awal.
petak = ["P-01", "P-02", "P-03", "P-04", "P-05"]
for i, kode in enumerate(petak):
print(i, kode)
if i == 2:
break
print("selesai")
for n in range(3):
print("putaran", n)0 P-01
1 P-02
2 P-03
selesai
putaran 0
putaran 1
putaran 2Pola enumerate dengan break persis dipakai di skrip Buku B2 untuk menampilkan hanya tiga baris pertama tabel. Angka 2 di sana berarti "berhenti setelah nomor urut 2", yaitu baris ketiga.
Comprehension: perulangan satu baris #
Kadang Anda hanya ingin mengumpulkan hasil ke dalam daftar baru. Comprehension menulisnya dalam satu baris.
luas = [4.0, 4.0, 8.0, 2.5]
besar = [ha for ha in luas if ha > 3]
print(besar)
dobel = [ha * 2 for ha in luas]
print(dobel)
jenis = ["Jati", "Mahoni", "Jati"]
print(sorted({j for j in jenis}))Cara membacanya: "buat daftar berisi ha, untuk setiap ha di luas, bila ha > 3". Tanda kurung kurawal tanpa titik dua membuat set comprehension.
[4.0, 4.0, 8.0]
[8.0, 8.0, 16.0, 5.0]
['Jati', 'Mahoni']Skrip yang dibedah: perulangan di b1_00 #
Tujuan. Menjumlahkan luas tiga petak, dan menandai petak yang lebih dari lima hektare.
Bahan. Tidak ada. Skrip ini tidak memakai QGIS.
Skrip (bagian keempat):
luas = {"KPH Alpha": 4.0, "KPH Beta": 4.0, "KPH Gamma": 8.0}
# 4. Perulangan for dan percabangan if. Baris yang menjorok ke dalam ikut dalam blok.
total = 0
for nama, ha in luas.items():
total = total + ha
if ha > 5:
print(nama, "termasuk petak besar")
print("Total:", total, "ha")Baris pertama (luas = ...) berasal dari bagian ketiga skrip aslinya. Saya sertakan supaya potongan ini bisa Anda jalankan sendiri.
Penjelasan baris demi baris. Nomor baris dihitung dari potongan di atas.
| Baris | Tulisan | Artinya |
|---|---|---|
| 1 | luas = {...} | Kamus luas tiga petak (dari bagian ketiga). |
| 3 | # 4. Perulangan ... | Komentar yang mengingatkan arti menjorok. |
| 4 | total = 0 | Siapkan penampung jumlah, mulai dari nol. |
| 5 | for nama, ha in luas.items(): | Mulai perulangan: satu putaran untuk tiap pasangan nama dan luas. |
| 6 | total = total + ha | Tambahkan luas petak ke penampung. |
| 7 | if ha > 5: | Periksa: apakah luas petak ini lebih dari 5? |
| 8 | print(nama, "termasuk petak besar") | Bila ya, tampilkan nama petak. Menjorok dua tingkat: ia bagian dari if. |
| 9 | print("Total:", total, "ha") | Tampilkan jumlah. Tidak menjorok, jadi berjalan sekali setelah perulangan. |
Hasil.
KPH Gamma termasuk petak besar
Total: 16.0 haBagian yang boleh diubah.
- Angka 5 (baris 7): ganti dengan batas lain, misalnya
3. Petak yang tercetak ikut berubah. - Isi kamus (baris 1): tambah petak. Total dan daftar petak besar menyesuaikan sendiri.
- Isi blok
if(baris 8): gantiprintdengan perintah lain, misalnya menyimpan nama ke daftar.
Jebakan.
- Salah menjorok. Bila baris 8 sejajar dengan
if, Python menolak denganIndentationError: expected an indented block after 'if' statement. Bila jarak menjorok tidak sama, pesannyaIndentationError: unindent does not match any outer indentation level. - Lupa titik dua. Menulis
for nama, ha in luas.items()tanpa titik dua di ujung menghasilkanSyntaxError. - Salah tempat
printterakhir. Bila baris 9 ikut menjorok, jumlah dicetak tiap putaran, bukan sekali. - Mengubah daftar sambil mengulanginya. Menambah atau membuang isi daftar di dalam perulangan atas daftar yang sama bisa menghasilkan urutan yang aneh. Buat daftar baru bila perlu.
Latihan variasi. Ubah skrip supaya mencetak semua petak yang kurang dari atau sama dengan 4 hektare, dan menghitung berapa banyak jumlahnya.
Contoh jawaban:
luas = {"KPH Alpha": 4.0, "KPH Beta": 4.0, "KPH Gamma": 8.0}
kecil = 0
for nama, ha in luas.items():
if ha <= 4:
print(nama, "petak kecil")
kecil = kecil + 1
print("Jumlah petak kecil:", kecil)KPH Alpha petak kecil
KPH Beta petak kecil
Jumlah petak kecil: 2Cek paham #
- Apa fungsi tanda titik dua di ujung baris
ifdanfor? - Apa beda
=dan==? - Bagaimana cara Python tahu bahwa suatu baris termasuk isi dari
for?
Jawaban.
- Titik dua menandai bahwa baris-baris yang menjorok sesudahnya adalah isi blok.
- Satu
=mengisi kotak. Dua==bertanya apakah dua nilai sama. - Lewat jarak menjorok (indentasi): baris yang menjorok adalah isi.
Kesalahan umum #
- Memakai
=pada syarat.if ha = 5salah. Perbaikan:if ha == 5. - Menjorok tidak seragam. Perbaikan: selalu empat spasi, dan atur editor agar Tab menjadi spasi.
- Mengira
range(3)berisi 1, 2, 3. Isinya 0, 1, 2. Perbaikan: ingat "mulai dari nol".
Ringkasan dan latihan #
if,elif,elsemengambil keputusan.formengulang.- Baris yang menjorok adalah isi blok. Empat spasi.
enumeratemenambah nomor urut,breakmenghentikan perulangan,rangemenghasilkan deretan angka.- Comprehension adalah perulangan satu baris untuk membuat daftar atau set.
Latihan. Dari daftar [4.0, 4.0, 8.0, 2.5, 12.0], cetak hanya luas yang lebih dari 3, lalu cetak jumlahnya. Kerjakan dua cara: dengan for dan dengan comprehension.
Tabel perbandingan: perulangan biasa dan comprehension #
| Hal | Perulangan for | Comprehension |
|---|---|---|
| Panjang | Beberapa baris | Satu baris |
| Cocok untuk | Pekerjaan banyak langkah | Menyaring atau mengubah daftar |
| Contoh | for ha in luas: lalu if dan append | [ha for ha in luas if ha > 3] |