Lambda

Sintaks lambda dan batasan penggunaannya dibandingkan fungsi biasa.

Daftar isi

Lambda adalah fungsi tanpa nama yang ditulis dalam satu ekspresi, dengan bentuk lambda parameter: ekspresi. Bentuk ini berguna ketika aturan kecil dibutuhkan sekali pakai, terutama sebagai argumen seperti key pada sorted(). Topik ini membahas sintaksnya, pemakaian yang lazim, batasannya, serta perbandingannya dengan fungsi def.

Sintaks lambda#

Ekspresi lambda menghasilkan objek fungsi seperti def, tetapi tanpa nama dan tanpa badan multi-baris. Seluruh isinya adalah satu ekspresi yang nilainya otomatis menjadi nilai kembalian, sehingga pernyataan return tidak ditulis.

python Contoh: bentuk dasar lambda
kuadrat = lambda x: x * x
print(kuadrat(5))
print((lambda a, b: a + b)(2, 3))
text Keluaran
25
5

Lambda pertama diberi nama kuadrat melalui penugasan, sedangkan lambda kedua langsung dipanggil pada barisnya. Keduanya setara dengan fungsi def yang badannya satu return. Pemberian nama melalui penugasan tidak dijadikan kebiasaan, karena PEP 8 menyarankan def untuk fungsi yang memang butuh nama, dan saran itu dibahas lagi pada bagian perbandingan.

Nama lambda diambil dari kalkulus lambda, yaitu notasi matematika untuk fungsi tanpa nama. Konsepnya masuk ke banyak bahasa pemrograman, dan Python memakainya sebagai bentuk ringkas untuk aturan kecil. Bentuk lengkapnya adalah lambda parameter: ekspresi, dan parameter default tetap diterima sebagaimana pada fungsi def.

Lambda sebagai argumen key#

Pemakaian yang paling lazim adalah sebagai argumen key, yaitu fungsi yang dipanggil sekali untuk setiap item guna menentukan urutan atau pembandingnya. Nilai hasil pemanggilan itulah yang dipakai oleh fungsi penerima key ketika membandingkan item.

python Contoh: mengurutkan dengan key lambda
siswa = [("Ali", 78), ("Budi", 65), ("Citra", 91)]
urut_nilai = sorted(siswa, key=lambda s: s[1])
print(urut_nilai)
text Keluaran
[('Budi', 65), ('Ali', 78), ('Citra', 91)]

Fungsi sorted() memanggil lambda untuk setiap pasangan, lalu mengurutkan menurut elemen kedua, yaitu nilai siswa. Tanpa key, pengurutan berjalan menurut elemen pertama, yaitu nama. Aturan kecil semacam ini memang tidak butuh nama dan tidak akan dipakai di tempat lain, sehingga lambda menyingkatnya menjadi satu baris.

python Contoh: key lambda pada min dan max
kata = ["sepuluh", "dua", "satu"]
print(min(kata, key=lambda k: len(k)))
text Keluaran
dua

Fungsi min() dan max() menerima key yang sama, sehingga kata terpendek dicari tanpa membangun list panjang kata secara manual. Setiap fungsi bawaan yang menerima key memanggil aturan tersebut untuk setiap item, dan lambda menjadi pilihan ringkas untuk mengisinya.

Argumen key tidak mengurutkan berdasarkan nilai aslinya, melainkan berdasarkan hasil pemanggilan key untuk setiap item. Aturan tersebut dipanggil tepat satu kali per item sebelum pengurutan dimulai, sehingga biayanya tetap wajar walau aturannya berupa fungsi.

Batasan lambda#

Lambda hanya menampung satu ekspresi, sehingga pernyataan seperti penugasan, perulangan for, dan pernyataan lain tidak dapat ditulis di dalamnya. Pemilihan bersyarat tetap sah karena bentuk a if syarat else b adalah ekspresi, bukan pernyataan. Ukuran keterbacaannya sederhana: bila lambda sudah sulit dibaca atau memerlukan penjelasan panjang, fungsi def lebih tepat digunakan.

python Contoh: lambda mengembalikan nilai ekspresinya
f = lambda x: print(x)
hasil = f(4)
print(hasil)
text Keluaran
4
None

Lambda di atas memanggil print(x), yang mengembalikan None, sehingga nilai yang dikembalikan lambda juga None. Contoh ini menunjukkan bahwa lambda mengembalikan nilai ekspresinya apa pun bentuknya, dan pemanggilan print hanyalah efek samping. Kesalahpahaman yang sama terjadi pada fungsi def yang badannya hanya mencetak, sehingga pemisahan antara menghitung dan menampilkan tetap penting.

Membandingkan lambda dengan def#

Keduanya menghasilkan objek fungsi dengan perilaku yang sama, dan perbedaannya terletak pada bentuk penulisan beserta keterbatasannya.

python Contoh: lambda dan def yang setara
def kuadrat_def(x):
    return x * x

kuadrat_lambda = lambda x: x * x

print(kuadrat_def(6), kuadrat_lambda(6))
print(kuadrat_def == kuadrat_lambda)
text Keluaran
36 36
False

Hasil pemanggilan keduanya identik, tetapi == menghasilkan False karena keduanya objek berbeda yang dibuat secara terpisah. Sebagai aturan praktis, lambda dipakai ketika fungsinya singkat, tanpa nama, dan ditulis langsung pada tempat pemanggilannya, sedangkan def dipakai ketika fungsi membutuhkan nama, docstring, atau badan lebih dari satu ekspresi.

Perbedaan lain terletak pada penelusuran error. Fungsi def dengan nama yang jelas menampilkan namanya pada traceback, sedangkan lambda selalu tampil sebagai <lambda>, sehingga letak kekeliruannya lebih sulit ditelusuri. Docstring juga tidak dapat dituliskan pada lambda karena badannya hanyalah satu ekspresi.

Kesalahan umum#

Kesalahan pertama adalah mencoba menulis lebih dari satu pernyataan di dalam lambda. Penugasan dan perulangan termasuk pernyataan, sehingga bentuknya ditolak sebagai SyntaxError sebelum program berjalan.

python
# tidak-dijalankan
f = lambda x: y = x + 1   # SyntaxError: penugasan bukan ekspresi

Perbaikannya memindahkan logika tersebut ke fungsi def, yang bebas memuat berapa pun pernyataan. Bila hasil antara perlu dihitung, badan fungsi def dapat menampungnya pada variabel lokal tanpa batasan apa pun.

Kesalahan kedua adalah menugaskan lambda ke nama sebagai pengganti def. Bentuk semacam ini melanggar saran PEP 8, dan traceback yang muncul darinya hanya menunjuk <lambda> tanpa nama yang bermakna. Fungsi def dengan nama yang jelas memudahkan penelusuran error dan dapat diberi docstring.

Kesalahan ketiga adalah memaksa lambda menangani logika yang kompleks, misalnya bersarang dengan ekspresi bersyarat berlapis. Nilai ekspresi tersebut tetap benar secara teknis, tetapi sulit dibaca dan sulit diuji, karena fungsinya tidak dapat dirujuk dari luar barisnya. Fungsi bernama dapat diimpor dan diuji secara terpisah, sedangkan lambda yang tersemat hanya terlihat dari pemanggilnya, sehingga lambda yang mulai melampaui satu aturan sederhana sebaiknya ditulis ulang sebagai fungsi bernama.

Ringkasan#

  • Lambda adalah fungsi tanpa nama berupa satu ekspresi yang nilainya otomatis dikembalikan.
  • Pemakaian yang paling lazim adalah argumen key pada sorted(), min(), dan max().
  • Lambda tidak memuat pernyataan, sehingga penugasan dan perulangan ditulis sebagai fungsi def.
  • Lambda yang mulai sulit dibaca atau butuh nama sebaiknya diganti fungsi def dengan nama dan docstring.

Referensi#