Idenya
Setiap keputusan yang dibuat program bermuara pada pertanyaan ya/tidak. Apakah pesanan ini di atas Rp 300.000? Apakah produknya ada di stok? Apakah pelanggannya di Jakarta dan punya akun bisnis? Python menjawab pertanyaan-pertanyaan ini dengan boolean: tipe yang punya tepat dua nilai, True dan False.
Kamu akan memakai boolean untuk memfilter data, untuk menentukan kode mana yang dijalankan (dua modul lagi), dan untuk menulis pengecekan yang menangkap data buruk sebelum masuk ke laporan.
Operator perbandingan
Perbandingan melihat dua nilai dan menghasilkan boolean:
| Operator | Artinya | Contoh | Hasil |
|---|---|---|---|
== | sama dengan | 5 == 5 | True |
!= | tidak sama dengan | 5 != 3 | True |
< | kurang dari | 3 < 5 | True |
> | lebih dari | 3 > 5 | False |
<= | kurang dari atau sama dengan | 5 <= 5 | True |
>= | lebih dari atau sama dengan | 4 >= 5 | False |
total = 285000
print(total > 300000)
print(total >= 285000)
free_shipping = total >= 300000
print(free_shipping)
print(type(free_shipping))
False
True
False
<class 'bool'>
Perbandingan hanyalah sebuah nilai, jadi kamu bisa menyimpannya di variabel dengan nama yang baik seperti free_shipping. Kode yang berbunyi if free_shipping: hampir terbaca seperti bahasa Inggris biasa.
= memberi nilai dan == membandingkan. total = 300000 mengubah total; total == 300000 bertanya apakah nilainya sama dengan 300000. Tertukar antara keduanya adalah salah satu bug pemula yang paling umum.
Membandingkan teks
== juga bekerja pada string, dan sifatnya persis: huruf besar-kecil, spasi, dan tanda baca semuanya dihitung.
city = "Jakarta"
print(city == "Jakarta")
print(city == "jakarta")
print(city.lower() == "jakarta")
print("Jakarta " == "Jakarta")
True
False
True
False
Inilah sebabnya modul sebelumnya begitu ribut soal .strip() dan .lower(): bersihkan teksnya, lalu bandingkan.
String juga bisa dibandingkan dengan < dan >, yang membandingkannya secara alfabetis (secara teknis, berdasarkan kode karakter, jadi semua huruf kapital datang sebelum huruf kecil). "apple" < "banana" bernilai True. Pakai ini untuk mengurutkan, bukan untuk mengecek jumlah.
Perbandingan berantai
Python memungkinkanmu menulis rentang seperti di matematika:
rating = 4.3
print(4.0 <= rating <= 5.0)
age = 17
print(18 <= age < 65)
True
False
4.0 <= rating <= 5.0 berarti "rating berada di antara 4 dan 5, inklusif". Lebih rapi daripada menulis dua perbandingan yang disambung.
Menggabungkan kondisi: and, or, not
Pertanyaan sungguhan biasanya punya lebih dari satu bagian. Python punya tiga operator logika:
a and bbernilaiTruehanya kalau keduanya benar.a or bbernilaiTruekalau setidaknya satu benar.not amembalikTruemenjadiFalsedan sebaliknya.
city = "Jakarta"
segment = "Business"
total = 450000
print(city == "Jakarta" and segment == "Business")
print(city == "Bandung" or total > 400000)
print(not total > 400000)
True
True
False
Membaca ketiga hasilnya: yang pertama True karena kotanya memang Jakarta dan segmennya memang Business. Yang kedua True walaupun kotanya bukan Bandung, karena or hanya butuh satu sisi, dan totalnya di atas 400000. Yang ketiga membalik total > 400000, yang bernilai True, menjadi False.
Ini tabel kebenaran lengkap untuk and dan or, yang mencakup setiap kombinasi:
| a | b | a and b | a or b |
|---|---|---|---|
| True | True | True | True |
| True | False | False | True |
| False | True | False | True |
| False | False | False | False |
Kalau kamu mencampur and dan or, and dievaluasi lebih dulu, sama seperti * sebelum +. Pakai tanda kurung untuk membuat pengelompokannya eksplisit:
is_vip = False
in_stock = True
total = 350000
eligible = (is_vip or total >= 300000) and in_stock
print(eligible)
True
Short-circuiting
Python berhenti mengevaluasi begitu ia tahu jawabannya. Di a and b, kalau a bernilai False keseluruhannya False, jadi b bahkan tidak pernah dilihat. Di a or b, kalau a bernilai True, b dilewati. Ini memungkinkanmu berjaga-jaga terhadap error:
quantity = 0
total = 0
print(quantity > 0 and total / quantity > 50000)
False
Tanpa short-circuiting, total / quantity akan crash dengan ZeroDivisionError. Karena quantity > 0 sudah False, Python tidak pernah mencoba pembagiannya.
Truthiness: apa yang dianggap True?
Python bisa memperlakukan nilai apa pun sebagai benar atau salah, bukan hanya boolean. Ini disebut truthiness. Nilai-nilai yang "falsy" hanya sedikit dan layak dihafal:
FalsedanNone- nol:
0,0.0 - hal-hal yang kosong:
""(string kosong),[](list kosong),{}(dictionary kosong)
Selain itu semuanya "truthy". bool() memperlihatkan bagaimana Python melihat sebuah nilai:
print(bool(0), bool(42))
print(bool(""), bool("Ayu"))
print(bool(None))
False True
False True
False
Kamu akan melihat truthiness dipakai dalam kondisi seperti if name: yang berarti "kalau name tidak kosong". Ini gaya Python yang lazim, tapi hati-hati: if quantity: bernilai False untuk quantity 0, yang mungkin saja nilai yang valid. Kalau nol punya makna, tulis perbandingannya secara lengkap: if quantity is not None:.
is versus ==
== bertanya "apakah nilainya sama?". is bertanya "apakah ini objek yang benar-benar sama?". Sebagai pemula, kamu hanya butuh is untuk satu hal: mengecek None.
discount = None
print(discount is None)
True
Selalu tulis x is None (bukan x == None). Itu konvensi Python dan selalu benar.
Mengapa ini penting untuk kode bersih
Beri nama pada kondisimu. if total >= 300000 and city in ("Jakarta", "Bandung") and not is_cancelled: sulit dibaca sekali jalan, tapi free_shipping = total >= 300000 diikuti if free_shipping and ships_locally and not is_cancelled: menjelaskan aturan bisnisnya. Boolean dengan nama yang baik adalah dokumentasi yang tidak bisa kedaluwarsa.
Rangkuman
- Boolean adalah
TruedanFalse. Perbandingan (==,!=,<,>,<=,>=) menghasilkannya. =memberi nilai,==membandingkan.- Perbandingan string bersifat persis: bersihkan teks dengan
.strip()dan.lower()dulu. - Rangkai perbandingan untuk rentang:
low <= x <= high. and,or,notmenggabungkan kondisi.andmengikat lebih kuat daripadaor, jadi pakai tanda kurung.- Nilai falsy:
False,None,0,0.0,"",[],{}. Selain itu semuanya truthy. - Cek nilai yang hilang dengan
x is None.