2.11. Kondisional¶
Sebuah kondisional menjalankan blok kode hanya ketika suatu pengujian bernilai benar. Kata kuncinya adalah if, yang secara opsional diikuti oleh satu atau lebih cabang elif ("else if") dan else terakhir.
n = 42
if n > 0:
print("positive")
elif n < 0:
print("negative")
else:
print("zero")
Isi setiap cabang adalah semua yang diindentasi di bawahnya (empat spasi secara konvensi). Python menelusuri cabang secara berurutan, menjalankan yang pertama di mana pengujiannya benar, dan melewatkan sisanya. Blok else hanya berjalan jika setiap pengujian sebelumnya bernilai salah; blok ini selalu opsional.
Hanya satu cabang yang pernah berjalan. Pengujian dievaluasi dari atas ke bawah sampai satu berhasil; sisanya dilewati.¶
2.11.1. Truthiness¶
Pengujian dalam if tidak harus mengembalikan True atau False -- nilai apa pun dihitung sebagai truthy atau falsy. Nilai-nilai falsy adalah:
Semua yang lain adalah truthy. Ini memungkinkan Anda menulis pengujian yang ringkas:
if name: # false on empty string
print("hello", name)
if items: # false on empty list, dict, etc.
process(items)
Perlu diketahui bahwa truthiness mengubah makna. if value: tidak sama dengan if value is not None: -- yang pertama juga salah ketika value adalah 0 atau "". Ketika Anda benar-benar bermaksud "apakah ini tepat None", gunakan is None / is not None secara eksplisit.
2.11.2. Ekspresi ternari¶
Kondisional dapat muncul di dalam ekspresi:
label = "even" if n % 2 == 0 else "odd"
Dibaca sebagai "label adalah "even" jika n % 2 == 0 lain "odd"." Berguna untuk satu baris; untuk apa pun yang lebih dari satu baris, pernyataan if penuh lebih mudah dibaca.
2.11.3. Nesting dan early return¶
Kondisional dapat bersarang sedalam apa pun, tetapi setiap lapisan indentasi ekstra membuat fungsi lebih sulit dibaca. Contoh di bawah ini memeriksa empat kondisi sebelum melakukan pekerjaan sebenarnya dan meninggalkan baris berguna terkubur empat level indentasi:
def process(item):
if item is not None:
if item.is_valid():
if item.size() > 0:
if item.owner == "me":
return do_the_work(item)
return None
Dua pola meratakan jenis kode ini.
2.11.3.1. Early return untuk guard¶
Tangani setiap kasus "keluar" terlebih dahulu, masing-masing dengan return-nya sendiri, sehingga logika utama tetap pada indentasi luar. Setiap guard dibaca sebagai "ini bukan kasus yang kita tangani; tinggalkan":
def process(item):
if item is None:
return None
if not item.is_valid():
return None
if item.size() == 0:
return None
if item.owner != "me":
return None
return do_the_work(item)
"Jalur utama" sekarang adalah satu baris di bagian bawah fungsi, bukan terkubur di dalam empat lapisan. Gaya ini kadang-kadang disebut pola guard clause.
2.11.3.2. Menggabungkan pengujian dengan and / or¶
Ketika beberapa kondisi harus terpenuhi untuk cabang yang sama, gabungkan dengan and daripada bersarang. Kondisi yang masing-masing secara independen memicu cabang digabungkan dengan or:
# all must hold -- use `and`
if user.is_admin() and user.has_permission("write") and not locked:
save()
# any one of them is enough -- use `or`
if c == " " or c == "\t" or c == "\n":
whitespace_count += 1
Kedua bentuk menggunakan short-circuit, sehingga pemeriksaan yang mahal di sisi kanan hanya berjalan ketika pemeriksaan yang lebih murah di sebelah kiri belum menyelesaikan pertanyaan.