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:

NilaiKeterangan
FalseBoolean palsu
NonePenanda tidak ada nilai
0, 0.0, 0jAngka 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:

python
>>> 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)
False

Perhatikan 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:

python
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:

text
Skenario 1: and dengan operan kiri False
Skenario 2: or dengan operan kiri True
Skenario 3: and dengan operan kiri True
evaluasi: kanan

Mari kita telaah apa yang terjadi pada baris-baris kode di atas:

  1. Baris 1-4 (def catat(nilai):): function catat() hanya mencetak "evaluasi: ..." lalu mengembalikan nilainya kembali — sintaks def dibahas tuntas pada Section Fungsi; untuk sekarang anggap catat() sebagai kotak hitam yang bersaksi setiap kali dievaluasi.
  2. Baris 7 (False and catat("kanan")): operan kiri False sudah falsy, sehingga interpreter Python berhenti — catat("kanan") tidak pernah dipanggil dan tidak ada baris evaluasi: yang tercetak.
  3. Baris 10 (True or catat("kanan")): operan kiri True sudah truthy, or berhenti lebih awal — catat() kembali tidak dipanggil.
  4. Baris 13 (True and catat("kanan")): operan kiri truthy sehingga and wajib memeriksa operan kanan — hanya skenario ini yang mencetak evaluasi: 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:

python
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:

text
0
90.0

Pada 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:

python
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:

text
Selamat datang, Tamu
Stok: 10

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