17. Boolean logic secara mendalam

Bab 16 menggunakan and, or, dan not untuk menggabungkan kondisi. Ketiganya melakukan lebih dari itu: mengetahui apa yang sebenarnya mereka kembalikan membuka trik yang selalu digunakan kode Python. Bab ini menggali lebih dalam tentang kebenaran.

Truthy dan falsy, lagi

Ingat dari Bab 16: dalam sebuah kondisi, False, None, 0, 0.0, "", dan koleksi kosong dianggap salah. Semua yang lain dianggap benar. Python menyebut yang itu sebagai falsy dan sisanya truthy.

if 0:
    print("zero is truthy")     # does NOT print — 0 is falsy in Python
if "":
    print("empty is truthy")    # does NOT print — "" is falsy in Python
if None:
    print("never")              # does not print
if 1:
    print("one is truthy")      # prints
if "hi":
    print("non-empty is truthy")# prints

Dalam Python, 0 dan "" adalah falsy. Ingat ini setiap kali kamu menguji sebuah nilai secara langsung.

and dan or mengembalikan sebuah nilai

Inilah yang jarang diberitahukan kepada pemula: and dan or tidak selalu mengembalikan True atau False. Mereka mengembalikan salah satu dari dua sisinya, tidak berubah.

  • a and b — jika a adalah falsy, ia mengembalikan a; jika tidak, ia mengembalikan b.
  • a or b — jika a adalah truthy, ia mengembalikan a; jika tidak, ia mengembalikan b.
print(5 and 10)          # 10    (5 is truthy, so the second value)
print(None and 10)       # None  (first is falsy, returned as-is)
print(False or "hi")     # hi    (first falsy, so the second)
print("yes" or "no")     # yes   (first truthy, returned at once)

Digunakan dalam sebuah if, ini berperilaku seperti logika benar/salah biasa — tapi nilai yang dikembalikan itulah yang membuat trik di bawah ini menjadi mungkin.

Trik nilai default: x or default

Karena or mengembalikan sisi truthy pertamanya, kamu bisa menyediakan nilai cadangan untuk sebuah nilai yang mungkin None. Bayangkan sebuah nama yang mungkin tidak ada:

typed_name = None                  # nothing was entered
name = typed_name or "stranger"
print("Hello, " + name)            # Hello, stranger

Jika typed_name menyimpan nilai nyata, name akan tetap menggunakannya. Baris x or default ini adalah cara umum Python untuk jatuh kembali ke nilai default — kamu akan melihatnya ketika sebuah nilai mungkin tidak ada.

Python 3.8 menambahkan operator walrus := dan ada juga pola value if value is not None else default, tapi x or default lebih pendek dan layak diketahui untuk kasus sederhana di mana nilai falsy apa pun harus memicu cadangan.

Buka exercises/17/01-default.py. chosen disetel ke None. Gunakan chosen or "rock" untuk jatuh kembali ke "rock", lalu cetak hasilnya. Setel chosen ke kata nyata dan jalankan lagi.

Short-circuit: sisi kedua dilewati

and dan or bersifat malas. Mereka berhenti segera setelah jawabannya sudah pasti:

  • a and b — jika a adalah falsy, b bahkan tidak pernah dilihat.
  • a or b — jika a adalah truthy, b tidak pernah dilihat.

Ini memungkinkan pengujian pertama menjaga yang kedua, yang berjalan hanya setelah yang pertama lolos:

total = 90
count = 0
# the average is only worth working out when count is not zero,
# so the count check guards the division
if count > 0 and total / count > 20:
    print("high average")
else:
    print("no average to show")

Karena count > 0 adalah False, Python tidak pernah mengevaluasi total / count — ia langsung short-circuit ke else. Pola if x > 0 and sesuatu-yang-menggunakan-x sering muncul.

not membalik truthiness

not mengubah nilai apa pun menjadi boolean nyata — True jika falsy, False jika truthy:

print(not None)     # True
print(not 0)        # True   (0 is falsy, so "not 0" is True)
print(not False)    # True
print(not 1)        # False  (1 is truthy)

Berguna untuk bertanya "apakah ini tidak ada?":

key = None
if not key:
    print("You need a key.")

Pekerjaan Rumah

File pekerjaan rumah ada di exercises/17/homework/.

Soal 1 — Warna default

Buka exercises/17/homework/01-default-colour.py. fav menyimpan sebuah warna atau None. Menggunakan or, setel colour ke fav, atau ke "blue" ketika fav adalah None, lalu cetak Your colour is <colour>. Jalankan sekali dengan fav = None dan sekali dengan warna nyata.

Soal 2 — Tabel truthy

Buka exercises/17/homework/02-truthy.py. Untuk masing-masing nilai ini, cetak nilainya dan apakah itu truthy, menggunakan bool(value) untuk mengkonversinya ke boolean nyata: 0, "", None, False, "hi", 1. Fungsi bool() memberikan True untuk nilai truthy dan False untuk yang falsy.

Soal 3 — Pembagian terjaga

Buka exercises/17/homework/03-guarded.py. Dua angka: total dan count (yang mungkin 0). Menggunakan and, cetak rata-rata total / count hanya ketika count lebih besar dari 0; jika tidak, cetak no data. Uji dengan count disetel ke 0 dan ke angka nyata.

Tantangan — Nilai pertama yang ada

Buka exercises/17/homework/04-first-value.py. Tiga variable a, b, c masing-masing menyimpan sebuah string atau None. Dalam satu baris menggunakan or, cetak yang pertama memiliki nilai, atau none jika ketiga-tiganya None. Coba berbagai kombinasi nilai dan None.

Buntu atau sudah selesai? Buka halaman solusi pekerjaan rumah.