Interpreter Python tidak selalu menuntut nilai True atau False untuk mengambil keputusan. Setiap nilai — angka, string, list, None — secara diam-diam punya “nilai kebenaran” sendiri saat diuji dalam konteks logika. Perilaku inilah yang disebut truthiness, dan memahaminya menjelaskan banyak hal yang tampak ajaib di Python: mengapa "" or "Tamu" bisa menghasilkan "Tamu", dan mengapa sebuah function bisa tidak jadi dipanggil.
Nilai Truthy dan Falsy #
Saat Python perlu menilai sebuah nilai sebagai kondisi, nilai tersebut dikonversi implisit menjadi True atau False. Nilai yang dinilai False disebut falsy, dan daftarnya singkat:
| Nilai | Keterangan |
|---|---|
False | Boolean palsu |
None | Penanda tidak ada nilai |
0, 0.0, 0j | Angka nol dari semua tipe numerik |
"" | String kosong |
[], (), {}, set() | List, tuple, dictionary, dan set kosong |
Setiap nilai lain bernilai truthy — termasuk angka negatif, string berisi spasi " ", dan list berisi satu elemen None. Kita bisa membuktikannya dengan fungsi bool() yang melakukan konversi secara eksplisit:
>>> bool(0)
False
>>> bool(42)
True
>>> bool("")
False
>>> bool("Belajar Python")
True
>>> bool(" ")
True
>>> bool([1, 2])
True
>>> bool([])
False
>>> bool(None)
False
>>> bool(-1)
True
>>> bool(0.0)
FalsePerhatikan bahwa bool(" ") akan True karena string spasi memang berisi satu karakter — kebenaran string ditentukan oleh ada-tidaknya isinya, bukan isinya apa. Perilaku ini membuat fungsi print() di atas cukup dijalankan langsung untuk melihat kategori setiap nilai.
Evaluasi Short-Circuit #
Pada Chapter Operator Logika kita sudah melihat bahwa and dan or mengembalikan salah satu operannya. Sekarang kita bedah konsekuensinya: operand kedua sering tidak pernah dievaluasi sama sekali. Interpreter Python mengevaluasi x and y dengan berhenti di x jika x falsy (hasil sudah pasti x), dan mengevaluasi x or y dengan berhenti di x jika x truthy (hasil sudah pasti x). Perilaku berhenti lebih awal inilah yang disebut short-circuit evaluation.
Bukti paling jelas adalah function yang mencatat setiap kali dirinya dipanggil:
def catat(nilai):
print("evaluasi:", nilai)
return nilai
print("Skenario 1: and dengan operan kiri False")
False and catat("kanan")
print("Skenario 2: or dengan operan kiri True")
True or catat("kanan")
print("Skenario 3: and dengan operan kiri True")
True and catat("kanan")Output yang Dihasilkan:
Skenario 1: and dengan operan kiri False
Skenario 2: or dengan operan kiri True
Skenario 3: and dengan operan kiri True
evaluasi: kananMari kita telaah apa yang terjadi pada baris-baris kode di atas:
- Baris 1-4 (
def catat(nilai):): functioncatat()hanya mencetak"evaluasi: ..."lalu mengembalikan nilainya kembali — sintaksdefdibahas tuntas pada Section Fungsi; untuk sekarang anggapcatat()sebagai kotak hitam yang bersaksi setiap kali dievaluasi. - Baris 7 (
False and catat("kanan")): operan kiriFalsesudah falsy, sehingga interpreter Python berhenti —catat("kanan")tidak pernah dipanggil dan tidak ada barisevaluasi:yang tercetak. - Baris 10 (
True or catat("kanan")): operan kiriTruesudah truthy,orberhenti lebih awal —catat()kembali tidak dipanggil. - Baris 13 (
True and catat("kanan")): operan kiri truthy sehinggaandwajib memeriksa operan kanan — hanya skenario ini yang mencetakevaluasi: kanan.
Guard Clause #
Short-circuit menjelaskan pola yang sangat umum: menempatkan pemeriksaan murah di depan agar kondisi berat atau berisiko tidak pernah dieksekusi. Versi paling terkenal adalah guard clause — kondisi penjaga di awal function yang langsung keluar bila input tidak layak:
def hitung_rata_rata(nilai):
if not nilai:
return 0
return sum(nilai) / len(nilai)
print(hitung_rata_rata([]))
print(hitung_rata_rata([80, 90, 100]))Output yang Dihasilkan:
0
90.0Pada baris if not nilai:, list kosong [] adalah falsy sehingga not [] bernilai True — function langsung mengembalikan 0 tanpa pernah membagi apa pun. Tanpa penjaga ini, sum([]) / len([]) akan memicu ZeroDivisionError karena len([]) bernilai 0. Pola if not <koleksi>: adalah cara idiomatik Python untuk menangkap “wadah kosong” dari semua tipe sekaligus.
Idiom x or default #
Truthiness dan short-circuit bergabung dalam idiom nilai cadangan yang sangat populer:
nama_pengguna = ""
nama_tampil = nama_pengguna or "Tamu"
print("Selamat datang,", nama_tampil)
stok = 0
stok = stok or 10
print("Stok:", stok)Output yang Dihasilkan:
Selamat datang, Tamu
Stok: 10Pada baris nama_pengguna or "Tamu", string kosong bernilai falsy sehingga or melanjutkan ke operan kanan dan "Tamu" yang menjadi hasil. Idiom ini ringkas, tetapi perhatikan baris kedua: stok yang bernilai 0 — angka nol yang sah — ikut tergantikan menjadi 10.
Dengan truthiness dan short-circuit, kita sudah menuntaskan seluruh perangkat operator Python. Seluruh pengetahuan ini menjadi bahan bakar utama Section Control Flow, di mana nilai kebenaran bertemu if, while, dan struktur keputusan lainnya.