Apa Itu Operator Walrus Python
ekspresi penugasan, yang menggunakan operator :=, terlihat mirip dengan pernyataan penugasan yang lebih umum, yang menggunakan operator =. Namun, ada perbedaan penting antara keduanya.
Sebuah pernyataan (statement) adalah unit kode yang melakukan suatu aksi. Ekspresi adalah pernyataan yang dapat dievaluasi menjadi sebuah nilai. Jadi, sebuah ekspresi mengembalikan nilai, sedangkan pernyataan yang bukan ekspresi tidak mengembalikan nilai apa pun.
REPL Python (Read, Evaluate, Print, and Loop) menampilkan nilai dari sebuah ekspresi segera setelah dievaluasi. Namun, tidak ada nilai yang ditampilkan ketika mengeksekusi pernyataan yang bukan ekspresi:
>>> import random # Not an expression
>>> 10 * 2 # An expression
20
Pernyataan import tidak dievaluasi menjadi nilai apa pun. Namun, 10 * 2 adalah ekspresi yang dievaluasi menjadi sebuah nilai.
Pernyataan penugasan, yang menggunakan operator =, menetapkan sebuah objek ke variabel atau referensi lain, tetapi tidak mengembalikan nilainya. Ekspresi penugasan, atau operator walrus, melakukan aksi yang sama seperti pernyataan penugasan namun juga mengembalikan objeknya:
>>> value = 10 # Assignment statement
>>> value
10
>>> (value := 20) # Assignment expression
20
Perhatikan bahwa pernyataan penugasan tidak mengembalikan nilai, berbeda dengan ekspresi penugasan. Jadi, sebuah ekspresi penugasan menggabungkan beberapa operasi:
- Mengevaluasi ekspresi di sisi kanan operator
:=. - Menetapkan nilai ini ke sebuah nama variabel.
- Mengembalikan nilai tersebut.
Penggunaan tanda kurung merupakan sintaks yang diperlukan saat menggunakan ekspresi penugasan alih-alih pernyataan penugasan, seperti pada contoh ini, untuk mengurangi ambiguitas. Persyaratan sintaks untuk operator walrus akan dibahas lebih lanjut nanti di tutorial ini.
Ekspresi penugasan dapat digunakan di mana pun ekspresi dapat digunakan di Python. Mari lihat contohnya:
print(f"The number is {(value := 50)}")
print(value)
The number is 50
50
Nama variabel value didefinisikan di dalam f-string pada baris pertama. Namun, bilangan bulat tersebut juga langsung dikembalikan ke kurung kurawal di f-string. Kurung kurawal dalam f-string harus memuat sebuah ekspresi, itulah mengapa pernyataan penugasan tidak bisa digunakan.
Kasus Penggunaan Operator Walrus Python
Dua kasus penggunaan umum untuk operator walrus adalah menyederhanakan dan mengoptimalkan kode.
Menyederhanakan kode
Kasus penggunaan umum untuk operator walrus adalah menyederhanakan kode ketika sebuah variabel biasanya perlu didefinisikan sebelum digunakan, seperti pada beberapa pernyataan kondisional. Pertimbangkan while loop berikut:
import random
value = random.randint(1, 20)
while value < 18:
print(value)
value = random.randint(1, 20)
7
5
1
11
12
1
9
Kode ini menjalankan blok while selama nilai acak yang dihasilkan lebih kecil dari 18. Variabel value perlu didefinisikan sebelum while loop agar bisa digunakan dalam pernyataan while. Angka acak baru ditetapkan ke value di akhir blok while.
Ekspresi penugasan := dapat digunakan untuk mengurangi jumlah baris kode dan memanggil fungsi random.randint() di satu tempat dalam program:
import random
while (value := random.randint(1, 20)) < 18:
print(value)
1
9
2
4
9
15
11
Angka acak baru dihasilkan dan ditetapkan ke value setiap kali while loop memulai iterasi baru.
Mengoptimalkan kode
Mari lihat contoh lain menggunakan list comprehension. Pertimbangkan kode berikut, yang memfilter daftar string berisi tanggal dan membuat daftar datetime.datetime object yang hanya memuat tanggal dalam tahun tertentu:
from datetime import datetime
def format_date(date_str):
return datetime.strptime(date_str, "%Y-%m-%d")
dates = ["2024-01-01", "2022-12-31", "2024-06-15", "2023-08-23", "2024-11-30"]
formatted_dates = [
format_date(date)
for date in dates
if format_date(date).year == 2024
]
print(formatted_dates)
[datetime.datetime(2024, 1, 1, 0, 0), datetime.datetime(2024, 6, 15, 0, 0), datetime.datetime(2024, 11, 30, 0, 0)]
Fungsi format_date() menerima string tanggal dalam format yyyy-mm-dd dan mengembalikan objek datetime.datetime. Salah satu atribut objek datetime.datetime adalah .year, yang berisi komponen tahun dari tanggal tersebut.
Hanya tiga tanggal tahun 2024 yang disertakan dalam daftar akhir, yang juga berisi objek datetime.datetime alih-alih string. List comprehension menyertakan klausa if yang memanggil format_date(). Namun, format_date() juga dipanggil pada ekspresi pertama dalam list comprehension, yang menghasilkan nilai untuk dimasukkan ke daftar. Memanggil fungsi yang sama dua kali dengan argumen yang sama tidak efisien, terutama jika fungsi tersebut menjadi bottleneck dalam kinerja program.
Salah satu opsi untuk menghindari pemanggilan fungsi yang sama dua kali adalah memanggil fungsi dan menetapkannya ke variabel sebelum digunakan. Namun, ini tidak bisa dilakukan dengan pernyataan penugasan sambil tetap menggunakan list comprehension. Solusi ini memerlukan loop for standar:
from datetime import datetime
def format_date(date_str):
return datetime.strptime(date_str, "%Y-%m-%d")
dates = ["2024-01-01", "2022-12-31", "2024-06-15", "2023-08-23", "2024-11-30"]
formatted_dates = []
for date in dates:
formatted_date = format_date(date)
if formatted_date.year == 2024:
formatted_dates.append(formatted_date)
print(formatted_dates)
[datetime.datetime(2024, 1, 1, 0, 0), datetime.datetime(2024, 6, 15, 0, 0), datetime.datetime(2024, 11, 30, 0, 0)]
Operator walrus menyediakan alternatif yang kompatibel dengan list comprehension karena tanggal terformat yang dikembalikan oleh fungsi dapat ditetapkan ke nama variabel dan dikembalikan dalam ekspresi yang sama:
from datetime import datetime
def format_date(date_str):
return datetime.strptime(date_str, "%Y-%m-%d")
dates = ["2024-01-01", "2022-12-31", "2024-06-15", "2023-08-23", "2024-11-30"]
formatted_dates = [
formatted_date
for date in dates
if (formatted_date := format_date(date)).year == 2024
]
print(formatted_dates)
[datetime.datetime(2024, 1, 1, 0, 0), datetime.datetime(2024, 6, 15, 0, 0), datetime.datetime(2024, 11, 30, 0, 0)]
Ekspresi penugasan dalam list comprehension adalah ekspresi yang diapit tanda kurung, (formatted_date := format_date(date)). Ekspresi ini memanggil fungsi format_date(), menetapkan nilainya ke variabel formatted_date, dan mengembalikan nilainya. Karena ekspresi penugasan dievaluasi menjadi objek datetime.datetime, kode mengakses atribut .year yang kemudian dibandingkan dengan 2024 menggunakan operator kesetaraan.
Klausa if pada list comprehension dieksekusi sebelum ekspresi yang menghasilkan nilai untuk disimpan di daftar. Karena itu, operator walrus digunakan pada klausa if, dan variabel yang didefinisikan dalam ekspresi penugasan ini digunakan sebagai ekspresi pertama dalam list comprehension.
Kontroversi Operator Walrus Python
Ekspresi penugasan tidak disukai oleh semua pemrogram Python. Sebagian melihatnya sebagai cara untuk menyederhanakan kode, tetapi yang lain merasa ini membuat kode kurang mudah dibaca dan lebih memilih opsi yang lebih panjang. Keterbacaan itu subyektif, jadi pendapat bervariasi apakah operator walrus membuat kode lebih atau kurang mudah dibaca.
Contoh terakhir di bagian sebelumnya menunjukkan kompromi yang diperlukan. Tanpa operator walrus, kode pada contoh ini perlu menginisialisasi sebuah daftar kosong terlebih dahulu, lalu menambahkan nilai ke dalamnya di dalam loop for. Solusi ini lebih panjang dan kurang efisien dibandingkan menggunakan list comprehension, yang dioptimalkan untuk tugas ini.
Namun, solusi loop for standar bisa jadi lebih mudah dibaca bagi sebagian pemrogram yang lebih suka menulis kode lebih banyak daripada menggunakan operator walrus, terutama jika kinerja bukan prioritas.
Banyak panduan gaya penulisan kode masih merekomendasikan untuk menghindari ekspresi penugasan atau hanya menggunakannya seperlunya.
Operator Walrus Python: Aturan Sintaks
Kesalahan sintaks umum ditemui saat awal mempelajari operator walrus karena aturan sintaksnya.
Untuk menghindari kebingungan antara pernyataan penugasan = dan ekspresi penugasan :=, tidak ada situasi di mana kedua opsi tersebut sama-sama valid secara sintaks. Karena itu, sering kali perlu mengapit ekspresi penugasan dengan tanda kurung:
(value := 20) # Valid
value := 20 # Invalid (SyntaxError)
Persyaratan untuk menyertakan ekspresi penugasan di dalam tanda kurung pada situasi ini berkebalikan dengan persyaratan pernyataan penugasan, yang tidak boleh dimasukkan ke dalam tanda kurung.
Namun, ekspresi penugasan tidak selalu memerlukan tanda kurung:
import random
if value := random.randint(0, 3):
print(f"{value} is greater than 0")
1 is greater than 0
Ekspresi penugasan dalam pernyataan if menghasilkan angka acak antara 0 dan 3 dan menetapkannya ke variabel value. Bilangan bulat 1, 2, dan 3 bersifat truthy, dan kode di blok if akan berjalan ketika nilai-nilai ini dihasilkan. Namun, ketika random.randint() mengembalikan 0, yang bersifat falsy, blok if tidak dieksekusi.
Pernyataan penugasan tidak valid setelah kata kunci if. Karena itu, tidak ada kebingungan dalam situasi ini, dan tanda kurung tidak diperlukan.
Contoh ini juga menunjukkan poin penting lain tentang ekspresi penugasan. Cakupan (scope) variabel yang ditetapkan mengikuti aturan LEGB yang normal. Karena itu, variabel value tersedia di mana saja dalam cakupan global pada contoh ini:
import random
if value := random.randint(0, 3):
print(f"{value} is greater than 0")
print(value)
2 is greater than 0
2
Jika ekspresi penugasan digunakan dalam definisi fungsi, variabel tersebut hanya akan tersedia secara lokal di dalam fungsi. Ini sama seperti perilaku variabel yang dibuat menggunakan pernyataan penugasan.
Contoh ini dapat dimodifikasi untuk menunjukkan potensi jebakan lain saat menggunakan operator walrus. Mari ubah kode ini untuk menyertakan operator perbandingan dalam pernyataan if:
import random
if value := random.randint(0, 3) < 2:
print(f"{value} is less than 2")
True is less than 2
Keluaran tersebut mengisyaratkan masalah pada kode ini karena value bernilai Boolean True alih-alih bilangan bulat. Operator walrus memiliki prioritas terendah di antara semua operator, dan hanya koma yang memiliki prioritas lebih rendah. Karena itu, operator lebih kecil dari < dievaluasi terlebih dahulu, dan keluarannya ditetapkan ke value. Tanda kurung diperlukan untuk menangani situasi ini:
import random
if (value := random.randint(0, 3)) < 2:
print(f"{value} is less than 2")
0 is less than 2
Sekarang ekspresi penugasan dievaluasi terlebih dahulu karena tanda kurung memiliki prioritas tertinggi. Angka yang dikembalikan oleh random.randint() ditetapkan ke value, dan digunakan sebagai operan pertama untuk operator lebih kecil dari.
Berbeda dengan pernyataan penugasan, operator walrus hanya dapat menetapkan nilai ke nama variabel dan tidak dapat digunakan untuk menetapkan nilai ke subskrip atau atribut:
(name := "James") # Valid
points = {"James": 10, "Mary": 20}
(points["Sarah"] := 30) # Invalid
class Article:
pass
article = Article()
(article.title := "The Walrus Operator") # Invalid
Tidak mungkin menetapkan nilai menggunakan subskrip atau ke atribut dengan operator walrus.
Kesimpulan
Ekspresi penugasan, yang menggunakan sintaks := dan sering disebut operator walrus, merupakan tambahan yang relatif baru di Python. Pernyataan penugasan, yang menggunakan operator =, adalah cara yang lebih umum untuk menetapkan nilai ke sebuah nama variabel.
Namun, operator walrus memperluas operasi penugasan ini dengan juga mengembalikan nilai yang ditetapkan, yang menjadikan penugasan ini sebuah ekspresi. Karena itu, Anda dapat menggunakan ekspresi penugasan di mana pun Anda dapat menggunakan ekspresi lain di Python.
Namun, komunitas Python terbelah mengenai kegunaan dan keterbacaan operator walrus. Karena alasan ini, ekspresi penugasan tidak digunakan sesering penambahan baru lainnya di Python. Bagus untuk mengetahui cara menggunakan operator ini, tetapi jangan berlebihan!
Saya belajar Fisika dan Matematika pada tingkat sarjana di University of Malta. Kemudian, saya pindah ke London dan meraih gelar PhD dalam bidang Fisika dari Imperial College. Saya meneliti teknik optik baru untuk memindai retina manusia. Sekarang, saya berfokus menulis tentang Python, berkomunikasi tentang Python, dan mengajar Python.


Python 3.8 memperkenalkan operator baru ke dalam bahasa ini. Nama resminya adalah ekspresi penugasan, dan menggunakan operator
:=.Namun, operator ini lebih umum disebut operator walrus karena bentuknya menyerupai taring walrus!
Penambahan operator ini sempat memicu perdebatan di komunitas Python yang biasanya tenang, dan penggunaannya masih relatif terbatas. Meski begitu, ekspresi penugasan kini menjadi bagian dari Python dan bisa berguna dalam situasi tertentu.
Tutorial ini akan membahas cara kerja operator walrus Python dan situasi di mana operator ini dapat digunakan.