Fungsi yang tidak perlu repot diberi nama
Kebanyakan fungsi di Python didefinisikan dengan def, punya nama, dan tinggal di file tempat ia bisa dipakai ulang. lambda adalah alternatif yang lebih kecil dan tanpa nama, berguna di beberapa kasus ketika mendefinisikan fungsi lengkap terasa terlalu repot.
Ini bentuknya berdampingan:
Dua fungsi, keduanya melakukan hal yang persis sama. Versi lambda muat dalam satu baris karena memang itulah tugasnya: fungsi sekali pakai untuk momen sekali pakai.
Sintaks
lambda <params>: <expression>
<params>adalah daftar parameter yang sama seperti yang dipakaidef, mendukung nilai default,*args, dan**kwargs.<expression>adalah satu ekspresi yang nilainya menjadi nilai kembalian.
Contoh:
Tidak ada kata kunci return. Nilai ekspresinya dikembalikan secara implisit.
Satu-satunya batasan
Lambda hanya bisa berisi satu ekspresi. Kamu tidak bisa menaruh pernyataan di dalamnya:
Tapi kamu bisa memakai ekspresi ternary:
Kalau kamu butuh lebih dari satu ekspresi, itu tanda untuk beralih ke def.
Tempat lambda benar-benar berguna
Lambda yang di-assign ke sebuah variabel hampir selalu lebih buruk daripada def bernama:
Itu jelas lebih buruk daripada def double(x): return x * 2: sama mudahnya dibaca, ditambah versi lambda memberi debugger nama yang tidak membantu, <lambda>, di stack trace.
Lambda bersinar di tepat satu tempat: sebagai argumen langsung untuk higher-order function.
Key khusus untuk pengurutan
Kasus klasiknya:
Argumen key milik sorted menginginkan fungsi yang menerima satu item lalu mengembalikan nilai yang dipakai untuk mengurutkan. Lambda satu baris pas sekali di sini, dan memakai def lengkap akan terasa berat untuk sesuatu sekecil ini.
Kamu bisa mengurutkan berdasarkan beberapa field dengan memakai tuple:
min, max, filter, map
Ceritanya mirip: semuanya menerima argumen fungsi yang opsional:
Untuk map dan filter, list comprehension biasanya malah lebih jelas:
Karena alasan ini, kebanyakan programmer Python lebih memilih comprehension daripada map/filter. lambda tetap cocok secara alami untuk sorted, min, dan max, karena di sana tidak ada jalan pintas berupa comprehension.
Lambda dan operator
Kalau lambda-mu hanya "ambil sebuah key" atau "ambil sebuah atribut", modul operator di Python punya alternatif yang lebih cepat dan lebih jelas:
Keuntungannya tidak besar, tapi di kode yang memang sudah meng-import operator, cara ini terbaca sedikit lebih deklaratif.
Kapan kembali memakai def
Kalau salah satu dari ini benar, tulis def:
- Logikanya tidak muat dengan rapi dalam satu ekspresi.
- Kamu ingin memberi nama pada fungsinya karena nama itu akan membantu keterbacaan.
- Kamu akan memakai logika yang sama di lebih dari satu tempat.
- Fungsinya butuh docstring (lambda tidak bisa membawa docstring).
Ingat: Python tidak dinilai dari jumlah baris. Fungsi bernama tiga baris hampir selalu lebih enak dibaca daripada lambda satu baris begitu logikanya tidak sepele.
Berikutnya: decorator
Lambda memperlakukan fungsi sebagai nilai yang bisa dioper ke mana-mana. Decorator membawa ide yang sama selangkah lebih jauh: dengan decorator kamu bisa membungkus fungsi apa pun dengan perilaku yang bisa dipakai ulang, seperti logging, mengukur waktu, caching, dan autentikasi, cukup dengan satu @ di baris di atasnya. Itulah halaman berikutnya.
Pertanyaan yang sering diajukan
Apa itu lambda di Python?
lambda adalah fungsi pendek tanpa nama yang bisa kamu tulis dalam satu baris. lambda x: x * 2 setara dengan def double(x): return x * 2, hanya saja tanpa nama. Lambda paling berguna saat kamu butuh fungsi kecil sebagai argumen untuk fungsi lain.
Kapan sebaiknya memakai lambda, bukan def?
Pakai lambda untuk fungsi sekali pakai yang hanya berisi satu ekspresi dan langsung kamu berikan ke sesuatu seperti sorted, max, atau filter. Untuk apa pun yang badannya lebih dari satu ekspresi, atau apa pun yang ingin kamu beri nama, pakai def. Fungsi bernama hampir selalu lebih jelas.
Apa batasan lambda?
Lambda hanya bisa berisi satu ekspresi, bukan pernyataan. Tidak ada assignment, tidak ada blok if (meskipun kamu bisa memakai ternary a if cond else b), tidak ada logika beberapa baris. Kalau kamu sampai bertarung dengan batasan itu, beralihlah ke def.