Lewati ke isi
Profil penulisSeri Buku GIS Kehutanan dan Pertanian/ PY

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.

Ilustrasi 6.1: Alur keputusan di dalam perulangan
Skema alur: ambil petak berikutnya, periksa apakah luas lebih dari 5 hektare, bila ya cetak nama petak, bila tidak lewati, lalu kembali mengambil 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 if atau for di atasnya.
  • Indentasi: jarak menjorok itu. Python memakai empat spasi.

Keputusan: if, elif, else #

PYTHONUnduh berkas
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.
  • else menampung semua yang tidak cocok dengan pertanyaan di atasnya.
  • Python berhenti di pilihan pertama yang benar dan melewati sisanya.
HASIL
petak besar

Tanda 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 #

PYTHONUnduh berkas
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 = 0 menyiapkan kotak penampung jumlah, mulai dari nol.
  • for nama, ha in luas.items(): mengulang satu putaran untuk tiap pasangan di kamus. Di tiap putaran, kotak nama dan ha berisi pasangan yang sedang dibaca.
  • total = total + ha menambahkan 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.
HASIL
KPH Gamma termasuk petak besar
Total: 16.0 ha

Alat bantu perulangan: enumerate, break, range #

  • range(n) menghasilkan angka 0 sampai n dikurangi 1. Cocok untuk mengulang sejumlah tertentu.
  • enumerate menambahkan nomor urut (mulai 0) pada tiap putaran.
  • break menghentikan perulangan lebih awal.
PYTHONUnduh berkas
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)
HASIL
0 P-01
1 P-02
2 P-03
selesai
putaran 0
putaran 1
putaran 2

Pola 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.

PYTHONUnduh berkas
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.

HASIL
[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):

PYTHONUnduh berkas
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.

BarisTulisanArtinya
1luas = {...}Kamus luas tiga petak (dari bagian ketiga).
3# 4. Perulangan ...Komentar yang mengingatkan arti menjorok.
4total = 0Siapkan penampung jumlah, mulai dari nol.
5for nama, ha in luas.items():Mulai perulangan: satu putaran untuk tiap pasangan nama dan luas.
6total = total + haTambahkan luas petak ke penampung.
7if ha > 5:Periksa: apakah luas petak ini lebih dari 5?
8print(nama, "termasuk petak besar")Bila ya, tampilkan nama petak. Menjorok dua tingkat: ia bagian dari if.
9print("Total:", total, "ha")Tampilkan jumlah. Tidak menjorok, jadi berjalan sekali setelah perulangan.

Hasil.

HASIL
KPH Gamma termasuk petak besar
Total: 16.0 ha

Bagian 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): ganti print dengan perintah lain, misalnya menyimpan nama ke daftar.

Jebakan.

  • Salah menjorok. Bila baris 8 sejajar dengan if, Python menolak dengan IndentationError: expected an indented block after 'if' statement. Bila jarak menjorok tidak sama, pesannya IndentationError: unindent does not match any outer indentation level.
  • Lupa titik dua. Menulis for nama, ha in luas.items() tanpa titik dua di ujung menghasilkan SyntaxError.
  • Salah tempat print terakhir. 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:

PYTHONUnduh berkas
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)
HASIL
KPH Alpha petak kecil
KPH Beta petak kecil
Jumlah petak kecil: 2

Cek paham #

  1. Apa fungsi tanda titik dua di ujung baris if dan for?
  2. Apa beda = dan ==?
  3. Bagaimana cara Python tahu bahwa suatu baris termasuk isi dari for?

Jawaban.

  1. Titik dua menandai bahwa baris-baris yang menjorok sesudahnya adalah isi blok.
  2. Satu = mengisi kotak. Dua == bertanya apakah dua nilai sama.
  3. Lewat jarak menjorok (indentasi): baris yang menjorok adalah isi.

Kesalahan umum #

  • Memakai = pada syarat. if ha = 5 salah. 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, else mengambil keputusan. for mengulang.
  • Baris yang menjorok adalah isi blok. Empat spasi.
  • enumerate menambah nomor urut, break menghentikan perulangan, range menghasilkan 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 #

HalPerulangan forComprehension
PanjangBeberapa barisSatu baris
Cocok untukPekerjaan banyak langkahMenyaring atau mengubah daftar
Contohfor ha in luas: lalu if dan append[ha for ha in luas if ha > 3]