BAB 10: Seleksi Kondisi di Python

Pelajari cara membuat program yang bisa memutuskan — menggunakan if, elif, else, conditional expression, dan match/case untuk mengendalikan alur kuis.py berdasarkan data nyata.

Di bab terakhir, kita menutup kuis.py dengan pertanyaan yang menggantung: bagaimana Python bisa mencetak “Selamat, kamu lulus” untuk Rina yang punya nilai 85.0 dan “Coba lagi” untuk Andi yang nilainya 68.0? Sampai sekarang semua kode kita berjalan lurus dari atas ke bawah — Python menjalankan setiap baris tanpa tahu kondisi mana yang berlaku. Untuk mengubah itu, kita butuh seleksi kondisi.

Seleksi kondisi adalah mekanisme yang memungkinkan program memilih blok kode mana yang dijalankan berdasarkan kondisi tertentu. Ini bukan fitur ekstra — ini adalah inti dari logika pemrograman. Hampir setiap program nyata yang pernah kamu pakai mengandalkan seleksi kondisi ribuan kali per detik.

Nilai Truthy dan Falsy

Sebelum menulis satu baris if pun, ada satu konsep dasar yang perlu kamu pegang: Python tidak hanya menerima True dan False di dalam kondisi. Ia menerima nilai apapun, lalu mengevaluasinya sebagai truthy (dianggap benar) atau falsy (dianggap salah).

Nilai-nilai berikut selalu dianggap falsy oleh Python:

  • None dan False
  • Angka nol dari tipe apapun: 0, 0.0, 0j
  • Koleksi kosong: "", [], {}, (), set()

Semua nilai lainnya dianggap truthy — string non-kosong, angka non-nol, list yang punya isi, dan seterusnya.

Ini penting karena kita bisa langsung memakai variabel sebagai kondisi:

# kuis.py
jawaban_pengguna = None
daftar_peserta = ["Rina", "Budi", "Sari", "Andi"]
nama_peserta = ""

# Daripada menulis: if jawaban_pengguna == None
if jawaban_pengguna is None:
    print("Belum ada jawaban")

# Daripada menulis: if len(daftar_peserta) > 0
if daftar_peserta:
    print(f"Ada {len(daftar_peserta)} peserta terdaftar")

# Daripada menulis: if nama_peserta == ""
if not nama_peserta:
    print("Nama peserta belum diisi")
Belum ada jawaban
Ada 4 peserta terdaftar
Nama peserta belum diisi

Untuk None, selalu gunakan is None atau is not None, bukan == None. Ini adalah konvensi Python — is memeriksa identitas objek, bukan kesetaraan nilai, dan None di Python hanya ada satu instance.

if, elif, dan else

Struktur kondisional di Python dibangun dari tiga kata kunci: if untuk kondisi utama, elif untuk kondisi tambahan, dan else sebagai fallback jika semua kondisi sebelumnya tidak terpenuhi.

# kuis.py — menentukan kategori nilai
NILAI_LULUS = 70.0

nilai_rina = 85.0

if nilai_rina >= 90:
    kategori = "Sempurna"
elif nilai_rina >= 80:
    kategori = "Sangat Baik"
elif nilai_rina >= NILAI_LULUS:
    kategori = "Lulus"
else:
    kategori = "Belum Lulus"

print(f"Rina: {nilai_rina}{kategori}")
Rina: 85.0 — Sangat Baik

Python mengevaluasi kondisi dari atas ke bawah dan berhenti di kondisi pertama yang bernilai True. Artinya, urutan elif sangat menentukan hasil. Coba ganti nilai Rina dengan 68.0, maka elif nilai_rina >= NILAI_LULUS tidak terpenuhi dan program akan masuk ke else.

Sekarang kita terapkan ini untuk semua peserta di kuis.py:

# kuis.py — mengevaluasi seluruh daftar peserta
from typing import Final

SKOR_MAKSIMAL: Final[int] = 100
JUMLAH_SOAL: Final[int] = 20
NILAI_LULUS: Final[float] = 70.0

profil_peserta = {
    "nama": "Rina",
    "skor": 17,
    "nilai_akhir": 85.0,
    "lulus": True
}

nilai = profil_peserta["nilai_akhir"]
nama = profil_peserta["nama"]

if nilai >= 90:
    pesan = f"Luar biasa, {nama}! Nilai kamu hampir sempurna."
elif nilai >= 80:
    pesan = f"Kerja bagus, {nama}! Nilai kamu sangat baik."
elif nilai >= NILAI_LULUS:
    pesan = f"Selamat, {nama}. Kamu lulus dengan nilai cukup."
else:
    pesan = f"Semangat, {nama}. Kamu perlu sedikit lagi untuk lulus."

print(pesan)
Kerja bagus, Rina! Nilai kamu sangat baik.

Indentasi adalah Sintaks

Di Python, blok kode tidak dibatasi oleh tanda kurung kurawal seperti di banyak bahasa lain — melainkan oleh indentasi. Standar yang ditetapkan PEP 8 adalah 4 spasi per level.

nilai = 85.0

if nilai >= NILAI_LULUS:
    print("Lulus")        # dalam blok if — 4 spasi
    print("Selamat!")     # masih dalam blok if — 4 spasi
print("Selesai")          # di luar blok if — tidak ada indentasi

Mencampur tab dan spasi di Python 3 akan menyebabkan TabError. Pastikan editor kamu dikonfigurasi untuk selalu menggunakan spasi, bukan tab, saat menekan tombol Tab. Hampir semua editor modern dan IDE memiliki pengaturan ini.

Nested if

Kondisi bisa bersarang di dalam kondisi lain. Ini berguna ketika kamu perlu memeriksa kondisi tambahan yang hanya relevan setelah kondisi luar terpenuhi.

# kuis.py — memeriksa lulus dan menentukan perlu remedial atau tidak
nilai = profil_peserta["nilai_akhir"]
jawaban_lengkap = True  # peserta menjawab semua soal

if nilai >= NILAI_LULUS:
    print(f"{nama} lulus kuis.")
    if jawaban_lengkap:
        print("Semua soal dijawab — rekam hasil ke database.")
    else:
        print("Ada soal yang tidak dijawab — tandai untuk ditinjau.")
else:
    print(f"{nama} belum lulus.")
    if nilai >= 60:
        print("Nilai mendekati lulus — tawarkan remedial.")
    else:
        print("Nilai terlalu jauh — rekomendasikan mengulang modul.")
Rina lulus kuis.
Semua soal dijawab — rekam hasil ke database.

Nested if memang berguna, tapi hindari menumpuk lebih dari dua level. Kondisi yang terlalu dalam biasanya bisa disederhanakan dengan menggabungkan kondisi menggunakan and dan or, atau dengan memecah logika ke dalam fungsi tersendiri.

Conditional Expression

Python punya cara ringkas untuk menulis if-else dalam satu baris ketika kamu hanya perlu menetapkan nilai berdasarkan kondisi. Ini disebut conditional expression atau ternary expression:

nilai_if_kondisi_true if kondisi else nilai_if_kondisi_false

Dalam konteks kuis.py:

# kuis.py — menetapkan status dengan conditional expression
nilai = profil_peserta["nilai_akhir"]

status = "Lulus" if nilai >= NILAI_LULUS else "Belum Lulus"
print(f"Status {nama}: {status}")

# Bisa juga langsung di dalam string format
print(f"Remedial: {'Tidak' if nilai >= NILAI_LULUS else 'Ya'}")

# Membandingkan dengan if-else biasa — hasilnya identik
if nilai >= NILAI_LULUS:
    status_biasa = "Lulus"
else:
    status_biasa = "Belum Lulus"
Status Rina: Lulus
Remedial: Tidak

Gunakan conditional expression untuk kondisi sederhana dan mudah dibaca. Jika kondisi atau hasilnya kompleks, lebih baik kembali ke if-else biasa — keterbacaan kode lebih penting dari keringkasan.

Kondisi Ganda dengan and, or, not

Di bab operator kita sudah melihat and, or, dan not dalam aksi. Di dalam if, mereka memungkinkan pengecekan beberapa kondisi sekaligus:

# kuis.py — kondisi kelulusan yang lebih ketat
nilai = profil_peserta["nilai_akhir"]
skor_benar = profil_peserta["skor"]
MINIMUM_SOAL_BENAR = 14

# Lulus hanya jika nilai cukup DAN menjawab cukup soal dengan benar
if nilai >= NILAI_LULUS and skor_benar >= MINIMUM_SOAL_BENAR:
    print(f"{nama} lulus dengan {skor_benar}/{JUMLAH_SOAL} soal benar.")
elif nilai >= NILAI_LULUS and skor_benar < MINIMUM_SOAL_BENAR:
    print(f"Nilai cukup tapi hanya {skor_benar} soal benar — perlu tinjauan.")
else:
    print(f"{nama} belum lulus.")
Rina lulus dengan 17/20 soal benar.

Python mengevaluasi ekspresi and dan or dengan short-circuit evaluation — ia berhenti segera setelah hasilnya bisa ditentukan. Pada and, jika operan kiri sudah False, operan kanan tidak perlu diperiksa. Pada or, jika operan kiri sudah True, operan kanan dilewati. Ini berguna secara performa, tapi juga punya implikasi praktis: letakkan kondisi yang “lebih mungkin gagal” di kiri and, agar kondisi yang lebih berat tidak perlu dievaluasi.

match/case — Pattern Matching

Python 3.10 memperkenalkan match dan case untuk structural pattern matching. Ini berbeda dari switch-case di bahasa lain — match tidak hanya membandingkan nilai, tapi bisa mencocokkan pola struktur data sekaligus mengekstrak nilainya.

Untuk kuis.py, mari lihat kasus sederhana: menentukan respons berdasarkan kategori nilai:

# kuis.py — match/case untuk kategori nilai (Python 3.10+)
nilai = profil_peserta["nilai_akhir"]

# Tentukan kategori dulu
if nilai >= 90:
    kategori = "sempurna"
elif nilai >= 80:
    kategori = "sangat_baik"
elif nilai >= NILAI_LULUS:
    kategori = "lulus"
else:
    kategori = "belum_lulus"

match kategori:
    case "sempurna":
        rekomendasi = "Coba tantang dirimu dengan materi lanjutan."
    case "sangat_baik":
        rekomendasi = "Bagus! Ulangi satu kali lagi untuk memastikan pemahamanmu solid."
    case "lulus":
        rekomendasi = "Lulus! Tapi ada ruang untuk meningkatkan nilai."
    case "belum_lulus":
        rekomendasi = "Pelajari ulang materi yang masih lemah, lalu coba lagi."
    case _:
        rekomendasi = "Kategori tidak dikenali."

print(rekomendasi)
Bagus! Ulangi satu kali lagi untuk memastikan pemahamanmu solid.

case _: adalah wildcard — ia menangkap semua nilai yang tidak cocok dengan case sebelumnya, setara dengan else dalam if-elif-else.

match juga bisa bekerja dengan kondisi tambahan menggunakan guard (if di dalam case):

# kuis.py — match dengan guard
skor = profil_peserta["skor"]

match skor:
    case n if n == JUMLAH_SOAL:
        hasil = "Sempurna! Semua soal benar."
    case n if n >= MINIMUM_SOAL_BENAR:
        hasil = f"{n} soal benar — di atas minimum."
    case n if n >= 10:
        hasil = f"{n} soal benar — masih perlu latihan."
    case _:
        hasil = "Skor terlalu rendah — ulangi dari awal."

print(hasil)
17 soal benar — di atas minimum.

match/case baru tersedia di Python 3.10 ke atas. Jika lingkungan kerja kamu masih Python 3.9 atau lebih lama, gunakan if-elif-else biasa. Untuk keperluan bab ini, semua contoh match/case bisa ditulis ulang dengan if-elif-else dan hasilnya identik.

Latihan

Coba kerjakan tantangan berikut untuk memperkuat pemahamanmu:

  1. Buat program yang menerima input nilai dari pengguna (gunakan int(input(...)) seperti yang sudah kita bahas), lalu tentukan kategori nilainya: “A” untuk 90-100, “B” untuk 80-89, “C” untuk 70-79, dan “D” untuk di bawah 70. Tambahkan validasi agar program menolak nilai di luar rentang 0-100.

  2. Kembangkan program di atas: tambahkan kondisi bahwa peserta hanya bisa mendapat nilai “A” jika nilai numeriknya 90+ DAN menjawab lebih dari 18 soal benar. Peserta dengan nilai 90+ tapi soal benar ≤18 hanya mendapat “B”.

  3. Tulis ulang kondisi utama dari tantangan nomor 2 menggunakan match/case dengan guard. Bandingkan keterbacaannya dengan versi if-elif-else — mana yang lebih mudah dipahami untuk kasus ini?

Untuk semua latihan, gunakan data dari kuis.py yang sudah kita bangun sejak bab-bab sebelumnya.

Sejauh ini kuis.py bisa mengevaluasi satu peserta sekaligus. Tapi kita punya skor_peserta = [85, 72, 91, 68] — empat peserta yang perlu dievaluasi satu per satu. Melakukannya secara manual dengan menyalin kode yang sama empat kali jelas bukan solusi yang baik. Kita butuh cara untuk menjalankan blok kode yang sama berulang kali — itulah yang akan kita pelajari di bab berikutnya tentang perulangan.

Referensi

  1. 1Python Docs — The if Statement
  2. 2Python Docs — Truth Value Testing
  3. 3PEP 636 — Structural Pattern Matching: Tutorial
  4. 4Real Python — Using the “or” Boolean Operator in Python