BAB 9: Operator di Python
Pelajari cara mengolah data di Python menggunakan operator: aritmatika, assignment, perbandingan, logika, identity, membership, dan bitwise — semuanya dalam konteks program kuis nyata.
Di bab sebelumnya kita menutup kuis.py dengan data yang cukup lengkap: skor_peserta = [85, 72, 91, 68], profil_peserta yang menyimpan nama dan skor, bahkan jawaban_pengguna = None yang menandakan belum ada input. Data itu sudah ada — tapi belum berguna sampai kita bisa mengolahnya. Berapa nilai rata-rata keempat peserta? Siapa yang melampaui batas lulus 70.0? Apakah “Rina” ada di daftar_peserta?
Semua pertanyaan itu dijawab dengan operator. Operator adalah simbol atau kata kunci yang memerintahkan Python melakukan sebuah operasi terhadap satu atau lebih nilai. Kamu sudah diam-diam menggunakan beberapa operator sejak bab 8 — * untuk menghitung nilai_akhir, >= untuk mengecek apakah peserta lulus. Di bab ini kita menggali semua jenis operator secara sistematis, lengkap dengan kapan dan mengapa menggunakannya.
Operator Aritmatika
Operator aritmatika adalah yang paling intuitif — mereka bekerja seperti matematika yang sudah kamu kenal. Yang menarik di Python adalah beberapa operator ini punya perilaku yang tidak selalu terduga jika kamu datang dari bahasa lain.
# kuis.py
from typing import Final
SKOR_MAKSIMAL: Final[int] = 100
JUMLAH_SOAL: Final[int] = 20
NILAI_LULUS: Final[float] = 70.0
skor_peserta = [85, 72, 91, 68]
# Menghitung total dan rata-rata
total_skor = skor_peserta[0] + skor_peserta[1] + skor_peserta[2] + skor_peserta[3]
rata_rata = total_skor / len(skor_peserta)
print(f"Total skor : {total_skor}")
print(f"Rata-rata : {rata_rata}")
print(f"Rata-rata : {rata_rata:.1f}") # dibulatkan 1 desimal
Total skor : 316
Rata-rata : 79.0
Rata-rata : 79.0
Berikut semua operator aritmatika beserta contoh kontekstualnya:
# kuis.py — demonstrasi operator aritmatika
skor_rina = 85
skor_budi = 72
selisih = skor_rina - skor_budi # pengurangan: 13
gabungan = skor_rina + skor_budi # penjumlahan: 157
dikali = skor_budi * 2 # perkalian: 144
# Pembagian — perhatikan perbedaannya
nilai_persen = skor_rina / SKOR_MAKSIMAL # float: 0.85
soal_per_blok = JUMLAH_SOAL // 3 # floor division: 6 (bukan 6.67)
sisa_soal = JUMLAH_SOAL % 3 # modulo: 2
# Pangkat
bonus_poin = 2 ** 3 # 8
print(f"Selisih nilai : {selisih}")
print(f"Nilai per persen : {nilai_persen}")
print(f"Soal per blok : {soal_per_blok}")
print(f"Sisa soal : {sisa_soal}")
print(f"Bonus poin : {bonus_poin}")
Selisih nilai : 13
Nilai per persen : 0.85
Soal per blok : 6
Sisa soal : 2
Bonus poin : 8
Operator / di Python selalu menghasilkan float, bahkan jika kedua operannya integer dan hasilnya bilangan bulat. 20 / 4 menghasilkan 5.0, bukan 5. Jika kamu butuh hasil berupa integer, gunakan // (floor division). Perlu diingat bahwa // membulatkan ke bawah — artinya -7 // 2 menghasilkan -4, bukan -3, karena Python membulatkan menuju bilangan negatif yang lebih besar.
Operator modulo % sangat berguna untuk mendeteksi bilangan genap/ganjil, membagi data ke dalam kelompok, atau menghitung sisa dari pembagian. Misalnya, jika kamu ingin membagi 20 soal ke dalam kelompok 3 soal, kamu perlu tahu ada berapa sisa soal yang tidak masuk kelompok penuh — itulah JUMLAH_SOAL % 3.
Operator Assignment
Assignment operator digunakan untuk memberi nilai ke variabel. Yang paling dasar adalah =, tapi Python juga punya augmented assignment operators yang menggabungkan operasi aritmatika dengan assignment — ini membuat kode lebih ringkas ketika kamu mengupdate nilai variabel berdasarkan nilainya sendiri.
# kuis.py — memperbarui skor peserta
skor_budi = 72
# Augmented assignment: setara dengan skor_budi = skor_budi + 5
skor_budi += 5
print(f"Skor Budi setelah bonus: {skor_budi}") # 77
# Semua augmented assignment yang tersedia
poin_bonus = 10
poin_bonus += 5 # 15 (setara poin_bonus = poin_bonus + 5)
poin_bonus -= 3 # 12 (setara poin_bonus = poin_bonus - 3)
poin_bonus *= 2 # 24 (setara poin_bonus = poin_bonus * 2)
poin_bonus //= 4 # 6 (setara poin_bonus = poin_bonus // 4)
poin_bonus **= 2 # 36 (setara poin_bonus = poin_bonus ** 2)
poin_bonus %= 10 # 6 (setara poin_bonus = poin_bonus % 10)
print(f"Poin bonus akhir: {poin_bonus}")
Skor Budi setelah bonus: 77
Poin bonus akhir: 6
Python juga mendukung multiple assignment dalam satu baris — berguna saat kamu ingin menginisialisasi beberapa variabel sekaligus atau menukar nilai dua variabel:
# kuis.py — inisialisasi beberapa variabel
nama_pertama, nama_kedua, nama_ketiga = "Rina", "Budi", "Sari"
# Menukar nilai dua variabel — cara Python, tanpa variabel sementara
skor_pertama, skor_kedua = 85, 72
skor_pertama, skor_kedua = skor_kedua, skor_pertama
print(f"Setelah ditukar: {skor_pertama}, {skor_kedua}") # 72, 85
Setelah ditukar: 72, 85
Augmented assignment bukan sekadar singkatan sintaksis. Untuk objek yang mendukung operasi in-place (seperti list), += bisa lebih efisien daripada = + karena tidak selalu membuat objek baru. Untuk tipe immutable seperti int dan str, perbedaannya tidak signifikan.
Operator Perbandingan
Operator perbandingan membandingkan dua nilai dan selalu mengembalikan True atau False. Ini adalah fondasi dari logika kondisional — setiap keputusan di program kamu (nanti di bab if-else) akan dimulai dari perbandingan.
# kuis.py — memeriksa status kelulusan
NILAI_LULUS = 70.0
nilai_rina = 85.0
nilai_budi = 72.0
nilai_sari = 91.0
nilai_andi = 68.0
print(nilai_rina >= NILAI_LULUS) # True — Rina lulus
print(nilai_andi >= NILAI_LULUS) # False — Andi tidak lulus
print(nilai_rina == nilai_sari) # False — nilai berbeda
print(nilai_rina != nilai_andi) # True — nilai tidak sama
print(nilai_sari > nilai_rina) # True — Sari lebih tinggi
print(nilai_budi < nilai_sari) # True — Budi lebih rendah dari Sari
True
False
False
True
True
True
Python mendukung chained comparison — membandingkan lebih dari dua nilai sekaligus dalam satu ekspresi:
# kuis.py — memeriksa apakah nilai berada dalam rentang tertentu
nilai_andi = 68.0
nilai_budi = 72.0
# Apakah nilai berada di rentang 60-80?
print(60 <= nilai_andi <= 80) # True — 68.0 ada di rentang
print(60 <= nilai_budi <= 80) # True — 72.0 ada di rentang
# Ekuivalen dengan:
print(60 <= nilai_andi and nilai_andi <= 80) # True — tapi lebih panjang
True
True
True
Chained comparison ini sangat berguna dan lebih mudah dibaca dibandingkan menulis and di tengah. Python mengevaluasinya dengan cara yang benar secara matematis.
Jangan bingung antara = dan ==. Operator = adalah assignment — ia menetapkan nilai ke variabel. Operator == adalah perbandingan — ia memeriksa apakah dua nilai sama dan mengembalikan True atau False. Menulis nilai_rina = 85.0 mengubah nilai variabel; menulis nilai_rina == 85.0 hanya memeriksa apakah nilainya 85.0 tanpa mengubah apapun. Ini adalah salah satu kesalahan paling umum pemula Python.
Operator Logika
Operator logika menggabungkan beberapa kondisi perbandingan menjadi satu ekspresi. Ada tiga operator logika di Python: and, or, dan not.
and mengembalikan True hanya jika kedua kondisi bernilai True. or mengembalikan True jika setidaknya satu kondisi bernilai True. not membalik nilai boolean — True menjadi False dan sebaliknya.
# kuis.py — memeriksa kondisi ganda
NILAI_LULUS = 70.0
JUMLAH_SOAL = 20
nilai_rina = 85.0
skor_rina_soal = 17 # jumlah soal benar
jawaban_lengkap = True
# and: semua kondisi harus terpenuhi
lulus_dan_lengkap = nilai_rina >= NILAI_LULUS and jawaban_lengkap
print(f"Lulus dan jawaban lengkap: {lulus_dan_lengkap}") # True
# or: cukup satu kondisi terpenuhi
dapat_mengulang = nilai_rina < NILAI_LULUS or skor_rina_soal < 10
print(f"Perlu mengulang: {dapat_mengulang}") # False
# not: membalik kondisi
belum_lulus = not (nilai_rina >= NILAI_LULUS)
print(f"Belum lulus: {belum_lulus}") # False
Lulus dan jawaban lengkap: True
Perlu mengulang: False
Belum lulus: False
Ada perilaku penting yang perlu kamu pahami: operator and dan or di Python tidak selalu mengembalikan True atau False — mereka mengembalikan salah satu operannya berdasarkan logika short-circuit evaluation. and mengembalikan operan pertama jika nilainya falsy, atau operan kedua jika operan pertama truthy. or mengembalikan operan pertama jika nilainya truthy, atau operan kedua jika operan pertama falsy.
# kuis.py — memanfaatkan short-circuit evaluation
jawaban_pengguna = None
# or: mengembalikan nilai default jika jawaban_pengguna kosong
jawaban_efektif = jawaban_pengguna or "tidak dijawab"
print(jawaban_efektif) # "tidak dijawab"
nama_peserta = "Rina"
nama_efektif = nama_peserta or "Peserta Anonim"
print(nama_efektif) # "Rina"
tidak dijawab
Rina
Pola nilai or default ini sangat idiomatis di Python untuk menetapkan nilai fallback ketika variabel mungkin kosong atau None.
Operator Identity dan Membership
Dua operator ini terlihat mirip dengan perbandingan biasa, tapi bekerja dengan cara yang sangat berbeda. Memahami perbedaannya akan menghindarkan kamu dari bug yang sulit ditemukan.
Operator identity (is, is not) memeriksa apakah dua variabel merujuk ke objek yang sama persis di memori — bukan apakah nilainya sama.
Operator membership (in, not in) memeriksa apakah sebuah nilai terdapat di dalam koleksi.
# kuis.py — operator identity untuk None
jawaban_pengguna = None
# Cara benar memeriksa None — gunakan is
if jawaban_pengguna is None:
print("Belum ada jawaban yang dimasukkan")
# is not: memeriksa bukan None
nama = "Rina"
if nama is not None:
print(f"Nama peserta: {nama}")
Belum ada jawaban yang dimasukkan
Nama peserta: Rina
# kuis.py — operator membership
daftar_peserta = ["Rina", "Budi", "Sari", "Andi"]
topik_dikuasai = {"variabel", "tipe data", "string"}
# Apakah "Rina" ada di daftar peserta?
print("Rina" in daftar_peserta) # True
print("Dewi" in daftar_peserta) # False
print("Dewi" not in daftar_peserta) # True
# Apakah topik sudah dikuasai?
print("operator" in topik_dikuasai) # False — belum dipelajari
# Pada dictionary, in memeriksa kunci
profil_peserta = {"nama": "Rina", "skor": 17, "nilai_akhir": 85.0, "lulus": True}
print("nama" in profil_peserta) # True — kunci ada
print("Rina" in profil_peserta) # False — "Rina" adalah nilai, bukan kunci
True
False
True
False
True
False
Operator is dan == bukan hal yang sama. == membandingkan nilai — apakah isinya sama. is membandingkan identitas objek — apakah keduanya adalah objek yang persis sama di memori. Untuk bilangan kecil dan string pendek, Python melakukan optimasi internal (interning) sehingga is bisa mengembalikan True secara tidak terduga. Gunakan is hanya untuk membandingkan dengan None, True, dan False. Untuk semua perbandingan nilai lainnya, gunakan ==.
Untuk string, operator in memeriksa apakah substring ada di dalam string induk:
# kuis.py — memeriksa konten string
judul_kuis = "Kuis Python Dasar"
print("Python" in judul_kuis) # True
print("python" in judul_kuis) # False — case-sensitive
print("python" in judul_kuis.lower()) # True — setelah dikonversi
True
False
True
Operator Bitwise
Operator bitwise bekerja langsung pada representasi biner integer. Mereka beroperasi bit per bit — setiap bit dari dua operan dibandingkan atau dimanipulasi secara individual. Untuk pemula, operator ini jarang dibutuhkan sehari-hari, tapi penting dipahami karena sering muncul di kode yang berkaitan dengan flag, permission, kriptografi, atau optimasi performa.
# Representasi biner:
# 10 = 0b1010
# 4 = 0b0100
x = 10 # 1010 dalam biner
y = 4 # 0100 dalam biner
print(x & y) # AND: 0000 = 0
print(x | y) # OR: 1110 = 14
print(x ^ y) # XOR: 1110 = 14
print(~x) # NOT: -0b1011 = -11 (-(x+1))
print(x << 1) # Left shift: 10100 = 20 (kalikan 2)
print(x >> 1) # Right shift: 0101 = 5 (bagi 2)
0
14
14
-11
20
5
Dalam konteks kuis kita, bitwise mungkin berguna jika kamu membangun sistem flag untuk status peserta — misalnya menggunakan satu integer untuk menyimpan beberapa status boolean sekaligus (sudah absen, sudah mengumpulkan, sudah dikoreksi). Tapi untuk saat ini, cukup pahami bahwa operator ini ada dan bekerja pada level biner.
Prioritas Operator
Ketika satu ekspresi memiliki beberapa operator, Python menentukan urutan evaluasinya berdasarkan prioritas operator (operator precedence). Aturan ini mirip dengan PEMDAS di matematika — tapi lebih lengkap.
# kuis.py — menghitung nilai akhir dengan beberapa operator
SKOR_MAKSIMAL = 100
JUMLAH_SOAL = 20
NILAI_LULUS = 70.0
BONUS_POIN = 5
skor_benar = 14
# Tanpa tanda kurung — apakah urutannya sudah benar?
nilai_mentah = skor_benar / JUMLAH_SOAL * SKOR_MAKSIMAL
print(nilai_mentah) # 70.0 (benar: / dan * sama prioritas, kiri ke kanan)
# Dengan bonus — perlu kurung agar bonus dijumlah dulu sebelum dikali
nilai_dengan_bonus_salah = skor_benar + BONUS_POIN / JUMLAH_SOAL * SKOR_MAKSIMAL
nilai_dengan_bonus_benar = (skor_benar + BONUS_POIN) / JUMLAH_SOAL * SKOR_MAKSIMAL
print(f"Salah : {nilai_dengan_bonus_salah}") # 39.5 (bonus dihitung tersendiri)
print(f"Benar : {nilai_dengan_bonus_benar}") # 95.0 (skor + bonus dulu, baru dibagi)
70.0
Salah : 39.5
Benar : 95.0
Urutan prioritas dari tertinggi ke terendah (hanya yang relevan untuk pemula):
| Prioritas | Operator | Keterangan |
|---|---|---|
| Tertinggi | () | Tanda kurung |
** | Pangkat (kanan ke kiri) | |
+x, -x, ~x | Unary | |
*, /, //, % | Perkalian, pembagian | |
+, - | Penjumlahan, pengurangan | |
<<, >> | Bitwise shift | |
& | Bitwise AND | |
^ | Bitwise XOR | |
| | Bitwise OR | |
in, not in, is, is not, <, <=, >, >=, !=, == | Perbandingan | |
not | Boolean NOT | |
and | Boolean AND | |
| Terendah | or | Boolean OR |
Rekomendasi praktis: selalu gunakan tanda kurung untuk ekspresi yang melibatkan lebih dari dua operator. Ini membuat kode lebih mudah dibaca dan menghindari kekeliruan urutan evaluasi yang tidak disadari.
Sekarang kamu bisa mengolah data di kuis.py sepenuhnya. Kamu bisa menghitung rata-rata skor, memeriksa apakah nilai peserta melampaui batas lulus, mengecek apakah nama ada di daftar, bahkan memperbarui skor dengan augmented assignment. Tapi sampai sekarang semua operasi itu berjalan lurus dari atas ke bawah — Python menjalankan setiap baris secara berurutan tanpa tahu kondisi mana yang harus diikuti.
Pertanyaannya sekarang: bagaimana Python bisa memutuskan? Bagaimana program kuis.py bisa mencetak “Selamat, kamu lulus” untuk Rina dan “Coba lagi” untuk Andi — dua respons berbeda untuk kondisi berbeda? Itu adalah kerja kondisional if-elif-else, yang akan kita bangun di bab berikutnya dengan memanfaatkan semua operator perbandingan dan logika yang baru saja kita pelajari.