Saat sebuah ekspresi memuat banyak operator sekaligus — angka, perkalian, perbandingan, hingga logika — interpreter Python harus memutuskan urutan pengerjaannya. Keputusan tersebut diatur oleh dua aturan: precedence (operator mana dikerjakan lebih dulu) dan associativity (arah pengerjaan ketika operator setara berdampingan). Memahami keduanya membuat kita bisa membaca ekspresi rumit dengan pasti, bukan menebak-nebak.
Tabel Prioritas Operator #
Berikut urutan operator yang sering kita pakai, dari prioritas tertinggi ke terendah:
| Prioritas | Operator | Asosiativitas |
|---|---|---|
| Tertinggi | ** | kanan |
+x, -x, ~x (unary) | kanan | |
*, /, //, % | kiri | |
+, - | kiri | |
<<, >> | kiri | |
& | kiri | |
^ | kiri | |
| | kiri | |
==, !=, <, >, <=, >=, in, not in, is, is not | dapat dirantai | |
not | kanan | |
and | kiri | |
| Terendah | or | kiri |
Tanda kurung selalu menang atas semua prioritas: apapun yang dibungkus ( ... ) akan dievaluasi lebih dulu tanpa memedulikan tabel di atas.
Asosiativitas: Kiri dan Kanan #
Ketika dua operator setara bertemu, asosiativitas menentukan arah pengelompokan. Operator aritmatika dan logika umumnya left-associative — dievaluasi dari kiri ke kanan:
>>> 2 + 3 * 4
14
>>> (2 + 3) * 4
20Pada 2 + 3 * 4, perkalian memiliki prioritas lebih tinggi sehingga 3 * 4 dikerjakan lebih dulu menghasilkan 12, baru ditambah 2 menjadi 14. Tanda kurung pada (2 + 3) * 4 membalik urutannya menjadi 20.
Satu pengecualian penting: operator pangkat ** bersifat right-associative — dievaluasi dari kanan ke kiri:
>>> 2 ** 3 ** 2
512
>>> (2 ** 3) ** 2
64
>>> -3 ** 2
-9
>>> (-3) ** 2
9Ekspresi 2 ** 3 ** 2 dikelompokkan sebagai 2 ** (3 ** 2): pangkat paling kanan (9) dihitung lebih dulu, lalu 2 dipangkatkan 9 menghasilkan 512. Kalau dikelompokkan dari kiri, hasilnya akan salah menjadi 64. Untuk tanda minus, ** mengikat lebih erat daripada unary di kirinya, sehingga -3 ** 2 berarti -(3 ** 2); menulis (-3) ** 2 memberi hasil 9 yang berbeda.
Precedence Campuran dalam Satu Ekspresi #
Aturan pada tabel juga berlaku saat aritmatika bertemu perbandingan dan logika:
>>> True or False and False
True
>>> (True or False) and False
False
>>> not True or True
True
>>> not (True or True)
FalsePada True or False and False, operator and lebih tinggi daripada or, sehingga ekspresi dikelompokkan menjadi True or (False and False) dan hasilnya True. Operator not lebih tinggi dari and/or, jadi not True or True berarti (not True) or True.
Berikut contoh ekspresi campuran dalam konteks pengecekan angka:
x = 7
hasil = x > 5 and x * 2 < 20
print(hasil)
selisih = 100 - 20 * 3
print(selisih)Output yang Dihasilkan:
True
40Mari kita telaah apa yang terjadi pada baris-baris kode di atas:
- Baris 1 (
x = 7): variabelxmenyimpan nilai yang akan diuji. - Baris 3 (
x > 5 and x * 2 < 20): dua perbandingan (x > 5danx * 2 < 20) dievaluasi lebih dulu, lalu hasil keduanya digabungkan denganandyang memang prioritasnya paling rendah di sini. Hitunganx * 2selesai (14) sebelum dibandingkan dengan20. - Baris 4 (
print(hasil)): kedua perbandingan bernilaiTrue, sehinggahasilbernilaiTrue. - Baris 6 (
100 - 20 * 3): perkalian dikerjakan lebih dulu (60), lalu pengurangan menghasilkan40.
Tanda Kurung untuk Kejelasan #
Tabel prioritas membantu kita membaca kode, tetapi tidak berarti kita harus menulis kode yang mengandalkan hafalan tabel.
Dengan pemahaman precedence dan associativity, kita kini bisa memprediksi hasil ekspresi apa pun yang dibangun dari operator-operator pada section ini. Dua topik terakhir section ini membedah bagaimana Python menilai kebenaran suatu nilai dan bagaimana evaluasi bisa berhenti lebih awal.