Operator #
Operator adalah simbol yang memberitahu Python untuk melakukan operasi tertentu terhadap satu atau lebih nilai (disebut operand). Python memiliki lebih banyak jenis operator dibanding yang tampak di permukaan — dan beberapa di antaranya memiliki perilaku yang tidak intuitif jika kamu datang dari bahasa lain. Misalnya, operator and dan or di Python tidak selalu menghasilkan True atau False, melainkan salah satu dari operandnya. Operator is dan == terlihat serupa tapi menguji hal yang sangat berbeda. Artikel ini membahas semua operator Python secara menyeluruh — termasuk perilaku, jebakan, dan kapan harus menggunakannya.
Operator Aritmatika #
Operator aritmatika digunakan untuk operasi matematika dasar. Python menyediakan tujuh operator aritmatika, dua di antaranya (// dan **) sering tidak ditemui di bahasa lain.
x = 17
y = 5
print(x + y) # → 22 penjumlahan
print(x - y) # → 12 pengurangan
print(x * y) # → 85 perkalian
print(x / y) # → 3.4 pembagian (SELALU float di Python 3)
print(x // y) # → 3 pembagian bulat (floor division)
print(x % y) # → 2 modulus / sisa bagi
print(x ** y) # → 1419857 pemangkatan (17⁵)
Perilaku Penting yang Perlu Diperhatikan #
# Pembagian (/) selalu menghasilkan float meski habis dibagi
print(10 / 2) # → 5.0 (float, bukan 5!)
print(10 / 5) # → 2.0 (float, bukan 2!)
# ANTI-PATTERN: mengira / menghasilkan int
jumlah_item = 10
per_halaman = 5
halaman = jumlah_item / per_halaman # → 2.0, bukan 2
range(halaman) # TypeError: 'float' object cannot be interpreted as an integer
# BENAR: gunakan // jika butuh hasil integer
halaman = jumlah_item // per_halaman # → 2
# Floor division pada bilangan negatif — hasilnya dibulatkan ke BAWAH
print(17 // 5) # → 3 (bukan 3)
print(-17 // 5) # → -4 (bukan -3! dibulatkan ke bawah menuju -inf)
print(17 // -5) # → -4 (bukan -3!)
# Modulus mengikuti tanda pembagi (bukan dividend) di Python
print(17 % 5) # → 2
print(-17 % 5) # → 3 (bukan -2! ikuti tanda y)
print(17 % -5) # → -3 (bukan 2! ikuti tanda y)
Operator pada Tipe Non-Numerik #
Python mendukung overloading operator — tipe lain bisa menggunakan operator aritmatika dengan makna berbeda:
# String: + untuk concatenation, * untuk repetisi
print("Hello" + " " + "World") # → Hello World
print("Ha" * 3) # → HaHaHa
print(3 * "Na" + " Batman!") # → NaNaNa Batman!
# List: + untuk menggabungkan, * untuk mengulang
print([1, 2] + [3, 4]) # → [1, 2, 3, 4]
print([0] * 5) # → [0, 0, 0, 0, 0]
# ANTI-PATTERN: + untuk menggabungkan list dalam loop
hasil = []
for i in range(5):
hasil = hasil + [i] # membuat list baru setiap iterasi — lambat!
# BENAR: gunakan append() atau extend()
hasil = []
for i in range(5):
hasil.append(i) # modifikasi in-place — efisien
Operator Perbandingan #
Operator perbandingan membandingkan dua nilai dan selalu menghasilkan True atau False.
x = 10
y = 20
print(x == y) # → False sama dengan
print(x != y) # → True tidak sama dengan
print(x > y) # → False lebih besar dari
print(x < y) # → True lebih kecil dari
print(x >= y) # → False lebih besar atau sama dengan
print(x <= y) # → True lebih kecil atau sama dengan
Chained Comparison — Fitur Unik Python #
Python memungkinkan perbandingan berantai yang lebih alami dan mudah dibaca:
nilai = 75
# ANTI-PATTERN: gaya bahasa lain
if nilai >= 60 and nilai < 80:
print("Cukup Baik")
# BENAR: chained comparison — lebih ekspresif dan mudah dibaca
if 60 <= nilai < 80:
print("Cukup Baik")
# Contoh lain
x = 5
print(1 < x < 10) # → True (x berada di antara 1 dan 10)
print(1 < x < 4) # → False
print(0 == False == 0) # → True (chaining bisa lebih dari dua)
Perbandingan String #
# String dibandingkan secara leksikografis (urutan Unicode)
print("apel" < "jeruk") # → True ('a' < 'j' dalam Unicode)
print("Budi" < "budi") # → True (huruf kapital < huruf kecil)
print("abc" == "abc") # → True
print("10" > "9") # → False ('1' < '9' dalam Unicode — hati-hati!)
# ANTI-PATTERN: membandingkan string angka secara leksikografis
versi_list = ["10", "9", "2", "1"]
print(sorted(versi_list)) # → ['1', '10', '2', '9'] ← urutan salah!
# BENAR: konversi ke int untuk pengurutan angka
print(sorted(versi_list, key=int)) # → ['1', '2', '9', '10'] ← benar
Operator Logika #
Operator logika menggabungkan ekspresi boolean. Python memiliki tiga operator logika: and, or, dan not.
print(True and True) # → True
print(True and False) # → False
print(False or True) # → True
print(False or False) # → False
print(not True) # → False
print(not False) # → True
Short-Circuit Evaluation #
Ini adalah perilaku paling penting dari operator logika yang sering tidak dipahami:
andberhenti dan mengembalikan operand pertama yang falsy, atau operand terakhir jika semua truthyorberhenti dan mengembalikan operand pertama yang truthy, atau operand terakhir jika semua falsy
# and — kembalikan operand pertama yang falsy, atau terakhir jika semua truthy
print(1 and 2) # → 2 (1 truthy, lanjut ke 2, kembalikan 2)
print(0 and 2) # → 0 (0 falsy, berhenti, kembalikan 0)
print("" and "hello") # → "" ("" falsy, berhenti)
print("a" and "b") # → "b" (semua truthy, kembalikan terakhir)
# or — kembalikan operand pertama yang truthy, atau terakhir jika semua falsy
print(1 or 2) # → 1 (1 truthy, berhenti, kembalikan 1)
print(0 or 2) # → 2 (0 falsy, lanjut, kembalikan 2)
print("" or "hello") # → "hello"
print("" or 0) # → 0 (semua falsy, kembalikan terakhir)
Memanfaatkan Short-Circuit secara Idiomatis #
# Pola nilai default dengan or
nama_input = ""
nama = nama_input or "Tamu" # jika nama_input falsy, gunakan "Tamu"
print(nama) # → Tamu
konfigurasi = None
host = konfigurasi or "localhost"
print(host) # → localhost
# Pola guard dengan and — eksekusi hanya jika kondisi terpenuhi
data = [1, 2, 3]
hasil = data and data[0] # ambil elemen pertama hanya jika data tidak kosong
print(hasil) # → 1
data = []
hasil = data and data[0] # data falsy, short-circuit, tidak akses data[0]
print(hasil) # → [] (tidak IndexError!)
# ANTI-PATTERN: menulis kondisi bertele-tele
if pengguna is not None:
if pengguna.aktif is True:
tampilkan_dashboard()
# BENAR: manfaatkan short-circuit
if pengguna and pengguna.aktif:
tampilkan_dashboard()
Karenaanddanormengembalikan salah satu operand (bukan selaluTrue/False), berhati-hatilah saat menyimpan hasilnya ke variabel. Gunakanbool()secara eksplisit jika kamu memang butuh nilai boolean:aktif = bool(pengguna and pengguna.aktif).
Operator Penugasan #
Operator penugasan menetapkan nilai ke variabel. Selain = dasar, Python menyediakan operator penugasan gabungan yang mempersingkat operasi baca-ubah-tulis.
x = 10 # penugasan dasar
x += 5 # x = x + 5 → 15
x -= 3 # x = x - 3 → 12
x *= 2 # x = x * 2 → 24
x /= 4 # x = x / 4 → 6.0
x //= 2 # x = x // 2 → 3.0
x %= 2 # x = x % 2 → 1.0
x **= 3 # x = x ** 3 → 1.0
# Juga berlaku untuk string dan list
s = "Hello"
s += " World" # → "Hello World"
lst = [1, 2]
lst += [3, 4] # setara dengan lst.extend([3, 4]) → [1, 2, 3, 4]
Walrus Operator := (Python 3.8+)
#
Operator walrus (:=) memungkinkan assignment sekaligus di dalam ekspresi. Nama “walrus” karena simbol := menyerupai mata dan taring walrus.
# Tanpa walrus: harus baca data dua kali atau pakai variabel sementara
import re
teks = "Nomor HP: 081234567890"
match = re.search(r"\d{10,13}", teks)
if match:
print(f"Ditemukan: {match.group()}")
# Dengan walrus: lebih ringkas
if match := re.search(r"\d{10,13}", teks):
print(f"Ditemukan: {match.group()}")
# Walrus sangat berguna dalam while loop
# ANTI-PATTERN: membaca data dua kali
data = baca_chunk()
while data:
proses(data)
data = baca_chunk()
# BENAR: walrus menghilangkan duplikasi
while data := baca_chunk():
proses(data)
# Walrus dalam list comprehension — filter dan transform sekaligus
angka = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# ANTI-PATTERN: hitung dua kali untuk filter dan transform
kuadrat_genap = [x**2 for x in angka if x**2 > 25]
# BENAR: hitung sekali dengan walrus
kuadrat_genap = [y for x in angka if (y := x**2) > 25]
print(kuadrat_genap) # → [36, 49, 64, 81, 100]
Operator Bitwise #
Operator bitwise bekerja langsung pada representasi biner dari integer. Paling sering digunakan dalam pemrograman sistem, manipulasi flag, kriptografi, dan kompresi data.
a = 0b1100 # 12 dalam desimal
b = 0b1010 # 10 dalam desimal
# a = 1100
# b = 1010
# ────
print(a & b) # AND → 1000 = 8 (1 hanya jika KEDUANYA 1)
print(a | b) # OR → 1110 = 14 (1 jika SALAH SATU 1)
print(a ^ b) # XOR → 0110 = 6 (1 jika BERBEDA)
print(~a) # NOT → -(a+1) = -13 (balik semua bit)
print(a << 2) # Left shift → 110000 = 48 (kalikan 2^2)
print(a >> 1) # Right shift → 110 = 6 (bagi 2^1)
Penggunaan Praktis Bitwise #
# Penggunaan flag dengan bitwise OR dan AND
IZIN_BACA = 0b001 # 1
IZIN_TULIS = 0b010 # 2
IZIN_HAPUS = 0b100 # 4
# Tetapkan beberapa izin sekaligus dengan |
izin_editor = IZIN_BACA | IZIN_TULIS # → 0b011 = 3
izin_admin = IZIN_BACA | IZIN_TULIS | IZIN_HAPUS # → 0b111 = 7
# Cek apakah izin tertentu dimiliki dengan &
def punya_izin(izin_pengguna, izin_dicek):
return bool(izin_pengguna & izin_dicek)
print(punya_izin(izin_editor, IZIN_BACA)) # → True
print(punya_izin(izin_editor, IZIN_HAPUS)) # → False
print(punya_izin(izin_admin, IZIN_HAPUS)) # → True
# Shift kiri = kalikan dengan pangkat 2 (lebih cepat dari **)
print(1 << 0) # → 1 (2⁰)
print(1 << 1) # → 2 (2¹)
print(1 << 8) # → 256 (2⁸)
print(1 << 10) # → 1024 (2¹⁰)
Operator Keanggotaan #
Operator in dan not in mengecek apakah suatu nilai ada di dalam koleksi atau string.
# Pada string
print("Python" in "Belajar Python") # → True
print("Java" not in "Belajar Python") # → True
# Pada list
buah = ["apel", "jeruk", "mangga"]
print("apel" in buah) # → True
print("durian" in buah) # → False
print("durian" not in buah) # → True
# Pada dict — mengecek KEY, bukan value
data = {"nama": "Budi", "umur": 25}
print("nama" in data) # → True (cek key)
print("Budi" in data) # → False (nilai, bukan key!)
print("Budi" in data.values()) # → True (jika ingin cek nilai)
# Pada set — O(1), jauh lebih cepat dari list untuk data besar
himpunan = {1, 2, 3, 4, 5}
print(3 in himpunan) # → True (O(1))
print(6 in himpunan) # → False (O(1))
# ANTI-PATTERN: cek keanggotaan di list besar berulang kali
daftar_banned = ["user1", "user2", ...] # ribuan elemen
for permintaan in permintaan_masuk:
if permintaan.user in daftar_banned: # O(n) setiap kali!
tolak(permintaan)
# BENAR: konversi ke set untuk O(1) lookup
set_banned = set(daftar_banned)
for permintaan in permintaan_masuk:
if permintaan.user in set_banned: # O(1) setiap kali
tolak(permintaan)
Operator Identitas #
Operator is dan is not mengecek apakah dua variabel menunjuk ke objek yang sama di memori — bukan hanya nilainya sama.
# is vs == — perbedaan krusial
a = [1, 2, 3]
b = [1, 2, 3]
c = a
print(a == b) # → True (nilainya sama)
print(a is b) # → False (objek berbeda di memori)
print(a is c) # → True (c adalah alias dari a, objek SAMA)
print(id(a)) # → misal 140234567
print(id(b)) # → misal 140234890 (berbeda)
print(id(c)) # → 140234567 (sama dengan a)
# ANTI-PATTERN: menggunakan is untuk membandingkan nilai
x = 1000
y = 1000
print(x is y) # → bisa True ATAU False tergantung implementasi!
# Python meng-cache int kecil (-5 hingga 256)
print(256 is 256) # → True (di-cache)
print(257 is 257) # → mungkin False (tidak di-cache)
print("hello" is "hello") # → mungkin True (string interning)
# BENAR: gunakan == untuk membandingkan nilai
print(x == y) # → True (selalu benar untuk perbandingan nilai)
# is HANYA tepat digunakan untuk:
# 1. Membandingkan dengan None
if hasil is None:
pass
# 2. Membandingkan dengan True/False (jarang diperlukan)
if nilai is True:
pass
Jangan gunakanisuntuk membandingkan nilai int, string, list, atau tipe lainnya — gunakan==. Python meng-cache beberapa objek kecil (int -5 sampai 256, string pendek), sehinggaisbisa memberikan hasil yang tidak konsisten tergantung nilai dan implementasi interpreter.
Prioritas Operator #
Ketika beberapa operator muncul dalam satu ekspresi, Python mengevaluasinya berdasarkan urutan prioritas (dari tertinggi ke terendah):
Prioritas │ Operator │ Keterangan
──────────┼───────────────────────────────────┼──────────────────────────
1 (tinggi)│ () │ tanda kurung
2 │ ** │ pemangkatan
3 │ +x, -x, ~x │ unary (positif, negatif, bitwise NOT)
4 │ *, /, //, % │ perkalian, pembagian
5 │ +, - │ penjumlahan, pengurangan
6 │ <<, >> │ bitwise shift
7 │ & │ bitwise AND
8 │ ^ │ bitwise XOR
9 │ | │ bitwise OR
10 │ ==, !=, <, >, <=, >=, in, not in, │ perbandingan & identitas
│ is, is not │
11 │ not │ logika NOT
12 │ and │ logika AND
13 (rendah)│ or │ logika OR
# Contoh prioritas dalam ekspresi nyata
print(2 + 3 * 4) # → 14 (* lebih tinggi dari +)
print((2 + 3) * 4) # → 20 (kurung mengubah prioritas)
print(2 ** 3 ** 2) # → 512 (** asosiatif kanan: 2**(3**2) = 2**9)
print((2 ** 3) ** 2) # → 64
# Logika: not → and → or
print(True or False and False) # → True (and lebih tinggi dari or)
print(True or (False and False)) # → True (sama, karena and lebih dulu)
print((True or False) and False) # → False (kurung ubah urutan)
# ANTI-PATTERN: mengandalkan hafalan prioritas untuk ekspresi kompleks
if x > 0 and y > 0 or z == 0: # ambigu saat dibaca
pass
# BENAR: gunakan kurung untuk memperjelas niat
if (x > 0 and y > 0) or (z == 0): # niat jelas
pass
Ringkasan #
/selalu menghasilkan float — gunakan//jika kamu butuh hasil integer dari pembagian.//dan%pada bilangan negatif dibulatkan ke arah -∞ — hasilnya mungkin mengejutkan:-17 // 5adalah-4, bukan-3.anddanorbukan selalu menghasilkanTrue/False— keduanya mengembalikan salah satu operand berdasarkan short-circuit evaluation.- Short-circuit
oruntuk nilai default —nama = input_nama or "Tamu"adalah idiom Python yang bersih dan umum dipakai.- Walrus
:=memungkinkan assignment di dalam ekspresi — sangat berguna diwhileloop dan comprehension untuk menghindari kalkulasi ganda.ishanya untukNone, bukan untuk nilai — gunakan==untuk membandingkan nilai;ismembandingkan identitas objek di memori.inpadasetadalah O(1) — konversi list ke set jika kamu perlu melakukan pengecekan keanggotaan berulang kali terhadap data besar.- Gunakan kurung untuk ekspresi kompleks — jangan andalkan hafalan prioritas operator saat ekspresi melibatkan lebih dari dua operator berbeda.