Fungsi Python Lambda: Sintaks, Kegunaan Sebenarnya, dan Kapan Tidak Digunakan
Lambda adalah fungsi kecil yang dapat Anda tulis dalam satu baris, tepat di tempat yang Anda perlukan. Pelajari sintaksisnya, tempat lambda benar-benar membantu, jebakan yang menangkap pengembang berpengalaman, dan kapan fungsi normal menjadi lebih baik.
- lambda adalah fungsi anonim yang terbatas pada satu ekspresi.
- Penggunaan terbaiknya adalah sebagai argumen singkat, khususnya
keyuntuksorted,mindanmax. - Pemahaman daftar biasanya lebih jelas dibandingkan
mapataufilterdengan lambda. - Jika Anda menetapkan lambda ke sebuah nama, tulislah
defsebagai gantinya.
Anda perlu mengurutkan produk berdasarkan harga. Menulis fungsi bernama terpisah hanya untuk mengatakan “gunakan harga” terasa seperti banyak upacara. Fungsi python lambda memungkinkan Anda menentukan bagian kecil logika sebaris, tepat di tempat Anda menggunakannya.
Lambda memang berguna, tetapi juga mudah digunakan secara berlebihan. Panduan ini menunjukkan bagian mana yang benar-benar membantu dan bagian mana yang membuat kode lebih sulit dibaca. Kami menjalankan setiap contoh di Python 3.13, dan output yang ditampilkan berasal dari proses tersebut.
Apa itu lambda?
Lambda adalah fungsi tanpa nama, ditulis dengan kata kunci lambda:
lambda arguments: expression
Dibutuhkan sejumlah argumen dan mengembalikan nilai ekspresi tunggal, secara otomatis. Tidak ada kata kunci return, dan tidak ada pernyataan.
square = lambda x: x * x
print(square(4)) # 16
print((lambda a, b=10: a + b)(5)) # 15
Baris kedua mendefinisikan lambda dengan argumen default dan segera memanggilnya. Anda jarang menulis ini dalam kode nyata, tetapi ini menunjukkan bahwa lambda adalah objek fungsi biasa.
lambda vs def
Keduanya menghasilkan fungsi yang berperilaku sama:
square = lambda x: x * x
def square_def(x):
return x * x
print(square(4), square_def(4)) # 16 16
print(square.__name__, square_def.__name__) # <lambda> square_def
Lihatlah nama-namanya. Setiap lambda hanya dipanggil <lambda>, jadi pesan kesalahan dan log tidak dapat memberi tahu Anda mana yang gagal. Ini adalah alasan utama panduan gaya seperti PEP 8 merekomendasikan def kapan pun Anda ingin memberi nama pada suatu fungsi.
| Fitur | lambda |
def |
|---|---|---|
| Nama | Anonim | Dinamakan |
| Tubuh | Satu ekspresi | Sejumlah pernyataan |
| Kembali | Tersirat | Eksplisit return |
| Docstring dan ketik petunjuk | Tidak didukung | Didukung |
| Traceback yang dapat dibaca | Pertunjukan <lambda> |
Menunjukkan namanya |
| Terbaik untuk | Argumen singkat yang bisa dibuang | Segala sesuatu yang lain |
Menyortir dengan kunci: penggunaan terbaik
Fungsi seperti sorted, min dan max menerima fungsi key yang memutuskan apa yang akan dibandingkan. Di sinilah lambda bersinar:
products = [("pen", 10), ("bag", 900), ("book", 250)]
sorted(products, key=lambda p: p[1])
# [('pen', 10), ('book', 250), ('bag', 900)]
max(products, key=lambda p: p[1])
# ('bag', 900)
Untuk mengurutkan berdasarkan beberapa hal, kembalikan Tuple. Di sini, orang diurutkan berdasarkan usia, yang tertua terlebih dahulu, lalu berdasarkan nama:
people = [{"name": "Asha", "age": 31}, {"name": "Ben", "age": 25},
{"name": "Dev", "age": 31}]
[p["name"] for p in sorted(people, key=lambda p: (-p["age"], p["name"]))]
# ['Asha', 'Dev', 'Ben']
Tanda minus membalik urutan angkanya saja. Terkadang Anda tidak memerlukan lambda sama sekali, karena fungsi yang ada sudah melakukan tugasnya. Bandingkan pengurutan default dengan pengurutan yang tidak peka huruf besar/kecil:
names = ["Asha", "ben", "Chitra", "dev"]
sorted(names) # ['Asha', 'Chitra', 'ben', 'dev']
sorted(names, key=str.lower) # ['Asha', 'ben', 'Chitra', 'dev']
Standarnya menempatkan semua kata dengan huruf kapital terlebih dahulu. Meneruskan str.lower akan memperbaikinya tanpa lambda apa pun. Modul operator menawarkan pembantu serupa, seperti itemgetter(1) untuk lambda p: p[1].
peta dan filter
map menerapkan fungsi ke setiap item, dan filter menjaga item yang dikembalikannya tetap benar. Keduanya bekerja dengan lambda, tetapi bandingkan masing-masing dengan pemahaman daftar:
nums = [1, 2, 3, 4, 5, 6]
list(map(lambda n: n * 10, nums)) # [10, 20, 30, 40, 50, 60]
[n * 10 for n in nums] # [10, 20, 30, 40, 50, 60]
list(filter(lambda n: n % 2 == 0, nums)) # [2, 4, 6]
[n for n in nums if n % 2 == 0] # [2, 4, 6]
Hasilnya sama, dan sebagian besar pengembang Python menganggap pemahamannya lebih mudah dibaca. Perhatikan juga bahwa map dan filter mengembalikan iterator yang malas, jadi Anda perlu list() untuk melihat nilainya. Panduan kami untuk Pemahaman daftar Python mencakup gaya tersebut secara mendalam. map masih terbaca dengan baik dengan fungsi bernama yang sudah ada, seperti pada map(str.strip, lines).
mengurangi
functools.reduce menggabungkan item menjadi satu nilai, membawa hasil yang berjalan:
from functools import reduce
reduce(lambda acc, n: acc + n, nums, 0) # 21
sum(nums) # 21
Untuk pekerjaan umum, misalnya total, gunakan bawaan seperti sum, max atau any. Pertahankan reduce untuk kasus yang lebih jarang, dan pertimbangkan perulangan biasa jika lambda mulai terlihat rumit.
Kondisi di lambda
Anda tidak dapat menggunakan pernyataan if di lambda, tetapi Anda dapat menggunakan ekspresi kondisional:
label = lambda total: "large" if total >= 1000 else "small"
label(1200), label(300)
# ('large', 'small')
Satu syarat baik-baik saja. Begitu Anda mulai menyusunnya, pembaca harus bekerja keras, yang merupakan tanda jelas untuk beralih ke pernyataan def dengan if biasa.
Lambdas yang mengembalikan fungsi
Suatu fungsi dapat membuat dan mengembalikan lambda yang mengingat nilai dari lingkungannya:
def multiplier(n):
return lambda x: x * n
double = multiplier(2)
double(7) # 14
Ini berfungsi karena adanya penutupan, yang dijelaskan dalam artikel kami tentang penutupan JavaScript dalam bahasa yang berbeda. functools.partial Python menawarkan cara lain untuk mengisi argumen terlebih dahulu.
Jebakan yang mengikat terlambat
Hal ini pada akhirnya akan menimpa hampir semua orang. Kami membuat tiga lambda dalam satu lingkaran, mengharapkan masing-masing lambda mengembalikan nomornya sendiri:
funcs = [lambda: i for i in range(3)]
[f() for f in funcs]
# [2, 2, 2]
Ketiganya mengembalikan 2. Lambda tidak menangkap nilai dari i saat dibuat. Ia mencari variabel ketika dipanggil, dan pada saat itu loop telah selesai, meninggalkan i di 2. Perbaikan yang biasa dilakukan adalah dengan menangkap nilai sebagai argumen default, karena default dievaluasi pada waktu definisi:
funcs = [lambda i=i: i for i in range(3)]
[f() for f in funcs]
# [0, 1, 2]
Ini tidak unik untuk lambda, karena def di dalam loop berperilaku dengan cara yang sama. Ini hanya muncul lebih sering dengan lambda, karena mereka biasanya dibuat dalam loop, seperti ketika melampirkan callback tombol.
Tips: Jika Anda memerlukan fungsi per item, pertimbangkan apakah Anda memerlukan banyak fungsi atau tidak. Seringkali fungsi tunggal yang menggunakan item sebagai argumen lebih jelas dan menghindari jebakan sepenuhnya.
Tabel pencarian fungsi kecil
Lambdas sangat cocok dengan kamus yang memetakan nama ke operasi kecil:
ops = {
"add": lambda a, b: a + b,
"sub": lambda a, b: a - b,
}
ops["sub"](10, 3) # 7
Ini dapat menggantikan rantai panjang if dan elif. Panduan Kamus Python mencakup lebih banyak pola kamus, dan modul operator sudah menyediakan operator.add dan operator.sub.
Batasan lambda
- Hanya satu ekspresi. Tidak ada penugasan dengan
=, tanpa loop, dan tanpa bloktry. - Tidak ada pernyataan. Penulisan
lambda x: return xgagal denganSyntaxError, seperti yang dikonfirmasi oleh pengujian kami. - Tidak ada docstring atau petunjuk mengetik. Alat dan pembaca kurang mendapat bantuan.
- Debug yang lebih sulit. Kesalahan menunjuk pada
<lambda>daripada nama yang berguna.
Lambdas tentu saja masih dapat mengajukan pengecualian. Penanganannya berfungsi sama seperti fungsi apa pun, seperti yang dibahas dalam penanganan pengecualian Python.
Kapan tidak menggunakan lambda
| Situasi | Pilihan yang lebih baik |
|---|---|
| Menugaskannya ke sebuah nama | def |
| Logika membutuhkan lebih dari satu baris | def |
| Mengubah atau memfilter daftar | Pemahaman daftar |
| Menjumlahkan atau mencari hasil maksimal | sum, max, min |
| Mendapatkan item atau atribut | operator.itemgetter atau attrgetter |
| Lambda yang sama muncul di beberapa tempat | Fungsi bernama yang dapat Anda uji |
Poin terakhir itu penting. Logika yang layak digunakan kembali layak untuk diuji, dan fungsi bernama jauh lebih mudah untuk diuji, seperti yang ditunjukkan oleh tutorial pytest kami.
Penutup
Lambda yang baik cukup pendek untuk dibaca sekilas, dan digunakan sekali, biasanya sebagai argumen. Kunci pengurutan adalah contoh klasik. Untuk memeriksa kode Anda sendiri, cari = lambda, dan ubah menjadi fungsi bernama. Kemudian lihat map atau filter mana pun dengan lambda, dan lihat apakah suatu pemahaman terbaca lebih baik.
Pertanyaan yang sering diajukan
Apa fungsi lambda di Python?
Ini adalah fungsi anonim kecil yang dibuat dengan kata kunci lambda. Dibutuhkan argumen dan mengembalikan nilai ekspresi tunggal, tanpa nama atau pernyataan pengembalian.
Bisakah lambda Python memiliki banyak baris?
Tidak. Lambda terbatas pada satu ekspresi. Anda dapat membaginya menjadi beberapa baris di dalam tanda kurung, namun tetap tidak dapat berisi pernyataan, jadi gunakan def untuk logika yang lebih kompleks.
Bisakah saya menggunakan if else di lambda?
Anda dapat menggunakan ekspresi kondisional, seperti lambda x: “big” if x > 10 else “small”. Pernyataan if dengan blok tidak diperbolehkan.
Apakah lambda lebih cepat dari fungsi normal?
Tidak secara berarti. Keduanya membuat objek fungsi yang sama. Pilih di antara keduanya untuk keterbacaan, bukan kinerja.
Haruskah saya menggunakan peta dengan lambda atau pemahaman daftar?
Kebanyakan pengembang Python lebih memilih pemahaman daftar agar mudah dibaca. map masuk akal jika Anda sudah memiliki fungsi bernama, seperti map(str.strip, line).
Teruslah belajar
Butuh bantuan dengan pengujian, WordPress atau SEO?
Kami membantu tim mengirimkan perangkat lunak yang lebih baik dan mengembangkan situs mereka. Beritahu kami apa yang sedang Anda kerjakan dan kami akan menyarankan langkah selanjutnya yang jelas.
Panduan lebih lanjut tentang pengujian, AI & pengembangan modern
Menikmati artikel ini? Pilih topik dan langsung masuk ke tutorial terbaru kami.
Penjelasan Halusinasi AI: Mengapa Model Bahasa Memperbaiki Masalah dan Cara Menguranginya
Halusinasi AI menjelaskan: apa itu, mengapa model bahasa memproduksinya, tipe umum, cara menguranginya dengan landasan dan petunjuk, dan pemeriksaan…
Baca artikel →DevOpsPenjelasan Variabel Lingkungan: File .env, Rahasia, dan Konfigurasi Dilakukan dengan Benar
Variabel lingkungan dijelaskan dengan contoh Python yang kami jalankan: membaca dan mengaturnya, mengapa setiap nilai berupa string, file .env, pewa…
Baca artikel →Pengembangan perangkat lunakPenjelasan Pembatasan Kecepatan API: Algoritma, Header, dan Penanganan 429 Kesalahan
Pembatasan laju API dijelaskan dengan simulasi yang kami jalankan: keranjang token, jendela tetap, jendela geser, respons 429, header batas laju, pe…
Baca artikel →Otomatisasi pengujianMengejek dengan Python: unittest.mock, patch dan Kesalahan yang Membuat Tes Berbohong
Mengejek dengan Python dengan unittest.mock, menguji: Mock dan return_value, side_effect, menambal di mana nama digunakan, spesifikasi dan autospec,…
Baca artikel →Pengujian perangkat lunakPenjelasan Cakupan Kode: Cakupan Jalur vs Cabang dan Apa Arti 100% Sebenarnya
Cakupan kode dijelaskan dengan coverage.py yang sebenarnya dijalankan: cakupan garis, cabang dan kondisi, membaca laporan, mengapa cakupan 100% masi…
Baca artikel →Basis data & SQLDELETE vs TRUNCATE vs DROP dalam SQL: Perbedaan, Rollback dan Kapan Menggunakan Masing-Masing
DELETE vs TRUNCATE vs DROP dijelaskan dengan SQL yang diuji: apa yang dihapus, rollback, pemicu, reset identitas, kecepatan, dan perbedaan PostgreSQ…
Baca artikel →Basis data & SQLPenjelasan Tampilan SQL: Membuat, Menggunakan, dan Menghindari Kesalahan, Dengan Contoh
Tampilan SQL dijelaskan dengan kueri yang kami jalankan: membuat tampilan, hasil langsung, menyembunyikan kolom, kinerja, tampilan yang dapat diperb…
Baca artikel →Pengembangan perangkat lunakAntarmuka TypeScript vs Tipe: Perbedaan Nyata, Diuji Dengan Kompiler
Antarmuka TypeScript vs tipe, diperiksa dengan kompiler sebenarnya: apa yang bisa dilakukan keduanya, apa yang hanya bisa dilakukan satu orang, peng…
Baca artikel →Pengembangan perangkat lunakPenjelasan Python *args dan **kwargs: Fungsi Fleksibel Dengan Contoh Jelas
Python *args dan **kwargs dijelaskan dengan kode yang kami jalankan: pengepakan dan pembongkaran, urutan parameter, argumen hanya kata kunci dan pos…
Baca artikel →Pengembangan perangkat lunakFungsi Python Lambda: Sintaks, Kegunaan Sebenarnya, dan Kapan Tidak Digunakan
Fungsi python lambda dijelaskan dengan kode yang kami jalankan: sintaksis, pengurutan dengan kunci, peta dan filter, penutupan, jebakan pengikatan a…
Baca artikel →Kecerdasan buatanApa Itu Agen AI? Cara Kerjanya, Dengan Agent Loop Sederhana yang Dapat Anda Jalankan
Apa itu agen AI? Panduan sederhana tentang loop agen, alat, memori, dan pagar pembatas, dengan loop Python kecil yang kami jalankan, risiko nyata da…
Baca artikel →DevOpsPemantauan vs Observabilitas: Perbedaan Nyata, Dengan Log, Metrik, dan Jejak
Penjelasan pemantauan vs observabilitas: kegagalan yang diketahui dan tidak diketahui, log, metrik dan jejak, penelusuran insiden checkout, sinyal e…
Baca artikel →DevOpsVolume Docker vs Bind Mounts: Pertahankan Data Kontainer dengan Cara yang Benar
Volume Docker vs pengikatan pengikat dijelaskan: mengapa data kontainer menghilang, volume yang diberi nama, pengikatan pengikatan, tmpfs, contoh Tu…
Baca artikel →Otomatisasi pengujianTDD vs BDD: Perbedaan Utama, Satu Fitur Dibangun dengan Dua Cara dan Kapan Menggunakan Masing-masing
TDD vs BDD dijelaskan dengan satu fitur diskon yang dibuat dengan dua cara: refactor merah-hijau dengan kode yang kami jalankan, skenario Mengingat-…
Baca artikel →Pengembangan perangkat lunakGit merge vs rebase: perbedaan, contoh, dan kapan memakai masing-masing
Git merge vs rebase dijelaskan dengan keluaran log nyata, tabel perbandingan, aturan emas rebase, dan alur kerja tim yang aman.
Baca artikel →Pengembangan perangkat lunakList Comprehension Python: Sintaks, Contoh, dan Kapan Harus Dihindari
List comprehension Python dijelaskan: sintaks, filter, if-else, perulangan bersarang, waktu yang diukur, dan kapan perulangan for biasa lebih baik.
Baca artikel →Basis data & SQLPenjelasan SQL JOIN dengan Contoh (Inner, Left, Right, Full)
Pahami SQL JOIN langkah demi langkah dengan tabel dan query contoh: INNER, LEFT, RIGHT, FULL, CROSS, dan SELF, plus kesalahan umum dan tips performa.
Baca artikel →