Tiga kata, bukan simbol
Operator logika Python berupa kata bahasa Inggris and, or, dan not. Bahasa lain menuliskannya &&, ||, dan !. Di Python, && dan || menghasilkan SyntaxError, dan ! hanya muncul sebagai bagian dari != ("tidak sama dengan").
Dengan True dan False, aturannya seperti yang kamu duga:
a | b | a and b | a or b | not a |
|---|---|---|---|---|
True | True | True | True | False |
True | False | False | True | False |
False | True | False | True | True |
False | False | False | False | True |
and butuh kedua sisinya benar. or butuh setidaknya satu. not menerima satu nilai dan membaliknya.
Dalam kode sungguhan, kedua sisinya biasanya berupa perbandingan, dan hasilnya dipakai oleh if atau while:
Output:
eligible
standard ticket
Sejauh ini sudah cukup untuk kebanyakan kondisi. Sisa halaman ini membahas apa yang dilakukan operator ini pada nilai yang bukan True atau False, serta aturan yang menentukan sisi mana dari sebuah ekspresi yang dijalankan.
Nilai truthy dan falsy
and, or, dan not menerima nilai apa pun, bukan hanya boolean. Python menentukan apakah sebuah nilai dianggap benar berdasarkan truthiness-nya. Nilai-nilai ini falsy:
FalsedanNone- nol dari tipe angka apa pun:
0,0.0 - container dan string kosong:
"",[],(),{},set(),range(0)
Semua yang lain truthy, termasuk "0", "False", [0], dan -1. Kamu bisa melihat bagaimana Python menggolongkan sebuah nilai dengan bool():
Output:
0 False
1 True
-1 True
'' False
'0' True
[] False
[0] True
None False
0.0 False
String "0" itu truthy karena merupakan string yang tidak kosong. Hal ini sering menjebak orang yang membaca angka dari input lalu mengujinya sebelum dikonversi. Halaman angka dan boolean membahas hubungan bool dengan int.
and dan or mengembalikan operand
Di sinilah Python berbeda dari kebanyakan bahasa. and dan or tidak menghasilkan True atau False yang baru. Keduanya mengembalikan salah satu dari dua nilai yang kamu berikan:
x or ymengembalikanxjikaxtruthy, dan jika tidak, mengembalikany.x and ymengembalikanxjikaxfalsy, dan jika tidak, mengembalikany.
Jika kedua operand berupa boolean, "mengembalikan operand" dan "mengembalikan boolean" sama saja, karena itu perbedaannya tidak terasa sampai kamu mencampur tipe lain.
not adalah pengecualian: ia selalu mengembalikan True atau False.
Kalau kamu butuh boolean sungguhan dari ekspresi and/or, misalnya untuk disimpan atau dikembalikan dari fungsi yang menjanjikan bool, bungkus dengan bool():
Evaluasi short-circuit
Python mengevaluasi and dan or dari kiri ke kanan dan berhenti begitu jawabannya sudah pasti:
andberhenti di nilai falsy pertama, karena tidak ada lagi yang bisa membuat seluruh ekspresi bernilai benar.orberhenti di nilai truthy pertama, karena tidak ada lagi yang bisa membuat seluruh ekspresi bernilai salah.
Sisi yang dilewati sama sekali tidak dijalankan. Kamu bisa melihatnya dengan fungsi yang mencetak sesuatu saat dipanggil:
Output:
and:
checking A
False
or:
checking A
True
B tidak pernah diperiksa di kedua kasus. Short-circuit inilah yang membuat kondisi penjaga aman. Bagian kedua dari setiap kondisi di bawah akan crash kalau berdiri sendiri, tapi bagian itu baru dijalankan setelah bagian pertama memastikan kasus buruknya tidak terjadi:
Letakkan uji yang murah atau yang melindungi di depan. Kalau urutannya dibalik, user.startswith("admin") and user is not None memunculkan AttributeError saat user bernilai None.
Pola yang dibangun di atas or dan and
Karena or mengembalikan operand truthy pertamanya, kamu bisa membuat nilai default dalam satu baris:
Output:
Hello, Ada!
Hello, guest!
Hello, guest!
Jebakannya, or mengganti setiap nilai falsy, bukan hanya None. Kalau 0, "", atau [] adalah input yang sah, or akan membuangnya:
Pakai x if x is not None else default kalau nol atau nilai kosong adalah nilai yang valid. Halaman if/else membahas ekspresi kondisional itu.
and punya pola pasangannya: "pakai nilai ini hanya jika nilai pertama sudah terisi". Pola ini lebih jarang dan sering lebih jelas ditulis sebagai if, jadi pakailah seperlunya:
Prioritas: not, lalu and, lalu or
Saat sebuah ekspresi mencampur ketiganya, Python menerapkan not lebih dulu, lalu and, lalu or. Perbandingan seperti ==, <, dan in diterapkan sebelum semuanya.
a or b and c dan (a or b) and c memberi jawaban berbeda dari nilai yang sama, jadi kondisi campuran sebaiknya diberi tanda kurung meskipun urutan bawaannya kebetulan sudah benar. Tanda kurung tidak ada ruginya dan menghapus keraguan bagi pembaca berikutnya.
and/or vs &/|
& dan | terlihat mirip dengan and dan or dan kadang memberi jawaban yang sama, tapi keduanya operator yang berbeda.
and/ormenguji truthiness, melakukan short-circuit, dan mengembalikan salah satu operand.&/|adalah operator bitwise. Pada integer, keduanya menggabungkan bit dari dua angka. Pada set, artinya irisan dan gabungan. PadaTruedanFalse, keduanya mengembalikan boolean. Keduanya tidak pernah melakukan short-circuit: kedua sisi selalu dievaluasi.
Operator bitwise juga punya prioritas lebih tinggi daripada perbandingan, sehingga kondisi yang ditulis dengan & berubah menjadi sesuatu yang lain sama sekali:
1 & y adalah 1 & 5, yaitu 1, sehingga baris tengah menjadi rantai 5 > 1 > 1, dan 1 > 1 bernilai salah. Dalam kode Python biasa, pakai and, or, dan not untuk kondisi.
Satu-satunya tempat &, |, dan ~ tepat dipakai untuk kondisi adalah NumPy dan pandas. Sebuah array menyimpan banyak nilai, jadi ia tidak punya satu nilai kebenaran, dan and memunculkan ValueError: The truth value of an array ... is ambiguous. Library tersebut membuat & dan | bekerja per elemen, itulah sebabnya filter pandas berbentuk df[(df.age > 18) & (df.country == "CA")], dengan tanda kurung di setiap perbandingan karena alasan prioritas di atas.
any() dan all(): and dan or untuk sebuah list
Untuk menggabungkan seluruh deret kondisi, pakai fungsi bawaan all() (sebuah and untuk semua item) dan any() (sebuah or untuk semua item). Keduanya melakukan short-circuit dengan cara yang sama:
Berbeda dengan and dan or, any() dan all() selalu mengembalikan boolean.
Kesalahan umum
Membandingkan satu variabel dengan beberapa nilai memakai or. Kondisi ini selalu bernilai benar:
Python membaca kondisi pertama sebagai (color == "red") or "blue". Perbandingannya False, jadi or mengembalikan "blue", sebuah string tidak kosong yang truthy. Ulangi perbandingannya di kedua sisi, atau lebih baik lagi, uji keanggotaan dengan in.
Menulis && atau ||. Keduanya menghasilkan SyntaxError. Pakai and dan or.
Mengharapkan boolean dari and/or. x = a or b menyimpan a atau b itu sendiri. Sering kali itu yang kamu mau, tapi kalau sebuah fungsi seharusnya mengembalikan True atau False, konversikan dengan bool().
Mengandalkan prioritas di kondisi campuran. a or b and c legal dan jelas aturannya, tapi tambahkan tanda kurung supaya tidak ada yang perlu mengingat aturannya.
Pertanyaan yang sering diajukan
Apa fungsi operator and di Python?
a and b bernilai benar hanya jika kedua sisinya benar. Python mengevaluasi a lebih dulu; jika a falsy, Python mengembalikan a tanpa melihat b, dan jika tidak, Python mengembalikan b. Dengan boolean biasa, hasilnya sesuai dugaan: True and False adalah False.
Kenapa 0 or 5 mengembalikan 5, bukan True?
or dan and mengembalikan salah satu operandnya, bukan boolean baru. x or y mengembalikan x jika x truthy, dan jika tidak, mengembalikan y. 0 itu falsy, jadi 0 or 5 mengembalikan 5. Bungkus ekspresinya dengan bool() kalau kamu butuh True atau False yang sebenarnya.
Apa bedanya and dan & di Python?
and adalah operator logika: ia menguji truthiness dan melakukan short-circuit. & adalah operator bitwise: pada integer ia menggabungkan bit (6 & 3 adalah 2), pada set ia mengambil irisan, dan ia selalu mengevaluasi kedua sisinya. Pakai and di kondisi if. Pengecualiannya adalah NumPy dan pandas, tempat & berarti and per elemen.
Mana yang dijalankan lebih dulu di Python, and atau or?
not mengikat paling kuat, lalu and, lalu or. Jadi a or b and c berarti a or (b and c), dan not a or b berarti (not a) or b. Perbandingan seperti == dan < mengikat lebih kuat daripada ketiganya.
Apakah && dan || bisa dipakai di Python?
Tidak. && dan || menghasilkan SyntaxError di Python. Operator logikanya berupa kata and, or, dan not. Satu & atau | itu valid, tapi artinya lain (and/or bitwise).