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:

PrioritasOperatorAsosiativitas
Tertinggi**kanan
+x, -x, ~x (unary)kanan
*, /, //, %kiri
+, -kiri
<<, >>kiri
&kiri
^kiri
|kiri
==, !=, <, >, <=, >=, in, not in, is, is notdapat dirantai
notkanan
andkiri
Terendahorkiri

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:

python
>>> 2 + 3 * 4
14
>>> (2 + 3) * 4
20

Pada 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:

python
>>> 2 ** 3 ** 2
512
>>> (2 ** 3) ** 2
64
>>> -3 ** 2
-9
>>> (-3) ** 2
9

Ekspresi 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:

python
>>> True or False and False
True
>>> (True or False) and False
False
>>> not True or True
True
>>> not (True or True)
False

Pada 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:

python
x = 7

hasil = x > 5 and x * 2 < 20
print(hasil)

selisih = 100 - 20 * 3
print(selisih)

Output yang Dihasilkan:

text
True
40

Mari kita telaah apa yang terjadi pada baris-baris kode di atas:

  1. Baris 1 (x = 7): variabel x menyimpan nilai yang akan diuji.
  2. Baris 3 (x > 5 and x * 2 < 20): dua perbandingan (x > 5 dan x * 2 < 20) dievaluasi lebih dulu, lalu hasil keduanya digabungkan dengan and yang memang prioritasnya paling rendah di sini. Hitungan x * 2 selesai (14) sebelum dibandingkan dengan 20.
  3. Baris 4 (print(hasil)): kedua perbandingan bernilai True, sehingga hasil bernilai True.
  4. Baris 6 (100 - 20 * 3): perkalian dikerjakan lebih dulu (60), lalu pengurangan menghasilkan 40.

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.