Belajar dengan membaca secara berurutan

Lambda Expression — Menulis Fungsi Anonim dalam Satu Baris

Pelajari lambda expression Python untuk menulis fungsi anonim ringkas dalam satu baris.

Pada artikel sebelumnya tentang higher-order function, kamu sudah melihat cara meneruskan fungsi sebagai argumen dan nilai kembali. Mendefinisikan fungsi baru dengan def setiap kali kamu perlu menyerahkan callback berarti sebuah operasi satu baris tiba-tiba menjadi 3 atau 4 baris.

Di situlah lambda expression (lambda) berperan — mereka memungkinkan kamu menulis fungsi anonim dalam satu baris. Sempurna untuk potongan logika kecil yang tidak cukup pantas mendapatkan def penuh.

Apa Itu Lambda — Dibandingkan dengan def

Sintaksnya adalah lambda args: expression. Hasil dari expression langsung menjadi nilai kembali, dan kamu tidak menulis return (faktanya, melakukannya memicu SyntaxError).

Tidak seperti fungsi biasa, lambda tidak punya nama, jadi ia tidak bisa dipanggil kecuali kamu menetapkannya ke variabel. Nama variabel yang kamu tetapkan padanya secara efektif menjadi nama fungsinya.

def vs Lambda Berdampingan
Versi defdef add_tax(p): return int(p*1.1)Versi lambdaadd_tax = lambda p: int(p*1.1)padatkan ke 1 baris
Fungsi kecil yang memakan 4 baris dengan def bisa ditulis dalam 1 baris dengan lambda. Tidak perlu return — nilai dari expression setelah : dikembalikan apa adanya.
# Ditulis dengan def
def add_tax(price):
    return int(price * 1.1)

print(add_tax(980))   # 1078

# Logika sama sebagai lambda (tidak perlu return)
add_tax = lambda price: int(price * 1.1)

print(add_tax(980))   # 1078

Hanya Expression yang Diperbolehkan — Tidak Ada Statement

Badan lambda hanya bisa berisi expression (sesuatu yang dievaluasi menjadi nilai). Statement if, loop for, dan penetapan (=) tidak akan masuk. Begitu kamu ingin sesuatu yang lebih rumit, kembali ke def — itu pilihan yang tepat.

Tulis fungsi satu baris yang menambahkan pajak penjualan 10% ke harga produk.

① Bangun fungsi yang menerima harga dan mengembalikan jumlah termasuk pajak sebagai integer.

② Panggil dengan 980 yen dan 2480 yen lalu cetak masing-masing hasil.

(Saat jawaban benar, penjelasan akan muncul.)

Python Editor

Jalankan kode untuk melihat output

Lebih Banyak Argumen, Conditional Expression, dan Default

Lambda juga bisa menerima beberapa argumen. Cukup daftarkan dengan koma, seperti lambda x, y: x * y.

Kamu juga bisa memakai default argument dengan cara yang sama seperti pada def. Untuk mengganti nilai berdasarkan kondisi, masukkan conditional expression value1 if condition else value2 ke dalam badannya.

# Beberapa argumen
rect_area = lambda width, height: width * height
print(rect_area(4, 5))            # 20

# Default argument (hilangkan rate untuk memakai 0.1)
add_tax = lambda price, rate=0.1: int(price * (1 + rate))
print(add_tax(1000))              # 1100
print(add_tax(1000, 0.08))        # 1080

# Conditional expression
judge_age = lambda age: "dewasa" if age >= 20 else "anak-anak"
print(judge_age(25))              # dewasa
print(judge_age(17))              # anak-anak

# Kembalikan beberapa nilai sebagai tuple
stats = lambda x, y: (x + y, x * y)
print(stats(3, 4))                # (7, 12)
Variasi Argumen Lambda
lambda x, y: x * yBeberapa argumenlambda x, y=2: x**yDefault argumentlambda x: "+" if x>0 else "-"Conditional expression
lambda menangani beberapa argumen, default argument, dan percabangan dengan conditional expression dengan rasa yang sama seperti def.

Tulis satu baris yang mengembalikan tier member (GOLD / SILVER / BRONZE) berdasarkan poin. 1000 atau di atasnya mendapat GOLD, 500 atau di atasnya mendapat SILVER, dan kurang dari itu adalah BRONZE.

① Bangun fungsi yang menerima poin dan mengembalikan tier.

② Panggil dengan 1500, 700, dan 100, dan cetak hasil untuk masing-masing.

Python Editor

Jalankan kode untuk melihat output

Berpasangan dengan Higher-Order Function — Tempat Lambda Bersinar

Lambda benar-benar mendapatkan tempatnya saat kamu ingin menyerahkan fungsi sekali pakai ke higher-order function. Misalnya, argumen key pada sorted() adalah higher-order function yang menerima "fungsi yang mengembalikan kunci sortir dari setiap elemen."

Untuk urutan sortir yang tidak perlu kamu beri nama dan pakai ulang, menulis key=lambda x: x["price"] inline di sisi pemanggil adalah bentuk paling alami.

products = [
    {"name": "Buku",     "price": 480},
    {"name": "Pena",     "price": 120},
    {"name": "Penghapus","price": 80},
]

# Sortir berdasarkan harga menaik (teruskan lambda inline sebagai key)
cheap_first = sorted(products, key=lambda item: item["price"])
for item in cheap_first:
    print(item["name"], item["price"])
# Penghapus 80
# Pena 120
# Buku 480

# higher-order function yang sama process_list bisa mengganti perilaku via lambda
def process_list(numbers, func):
    for n in numbers:
        print(func(n))

process_list([1, 2, 3, 4], lambda x: x ** 2)
# 1
# 4
# 9
# 16
Bagaimana Lambda Mengalir ke key pada sorted
products(list of dict)key=lambda item: item["price"]List baru disortirberdasarkan harga naikditerapkan ke tiap itemsortir berdasarkan nilai key

Sortir list pengguna berdasarkan score, tertinggi dahulu. sorted() membalik ke menurun saat kamu meneruskan reverse=True.

① Definisikan users = [{"name": "Budi", "score": 78}, {"name": "Siti", "score": 92}, {"name": "Ayu", "score": 65}].

② Sortir dengan sorted(users, key=lambda u: u["score"], reverse=True) dan tetapkan hasilnya ke ranking.

③ Loop dengan for u in ranking: lalu cetak print(u["name"], u["score"]).

Python Editor

Jalankan kode untuk melihat output

Kapan Memakai Lambda — dan Kapan Menghindarinya

Lambda nyaman, tetapi memakainya di mana-mana sebenarnya merusak keterbacaan. Tabel di bawah merangkumnya: gunakan lambda untuk operasi sekali pakai, satu baris, dan gunakan def untuk apa pun yang rumit atau dipakai ulang.

SituasiRekomendasiAlasan
Teruskan ke key pada sorted, filter, maplambdaSatu baris menyampaikan maksud; tidak butuh nama
Expression satu baris seperti harga termasuk pajaklambdaFungsi pendek bernama tanpa import
Logika yang butuh if / for / trydeflambda hanya untuk expression; statement memunculkan SyntaxError
Logika yang dipakai ulang dari banyak tempatdefNama menyampaikan maksud dan mendukung tes serta dokumentasi
Badan yang berjalan 3+ barisdefMemaksakan ke lambda hanya merusak keterbacaan

Jangan Memaksakan Semuanya ke Lambda

Tumpuk tiga conditional expression bersarang atau rangkai beberapa pemanggilan fungsi bersama dan kamu akan berakhir dengan kode yang berada pada satu baris tetapi tidak terbaca. Begitu kamu berpikir "Saya ingin meninggalkan komentar yang menjelaskan apa yang dilakukan lambda ini," beralihlah ke def.

Teruskan lambda inline ke higher-order function bernama process_list.

① Definisikan def process_list(numbers, func): dan panggil print(func(n)) di dalam for n in numbers:.

② Panggil process_list([1, 2, 3, 4, 5], lambda x: x ** 2) dan pastikan kuadrat tiap elemen tercetak berurutan.

③ Panggil lagi dengan process_list([1, 2, 3, 4, 5], lambda x: x * 10) dan pastikan perilaku berubah hanya dengan menukar lambda.

Python Editor

Jalankan kode untuk melihat output
QUIZ

Cek Pemahaman

Jawab setiap pertanyaan satu per satu.

Soal 1Manakah dari berikut ini yang merupakan lambda expression yang valid?

Soal 2Apa yang dicetak kode ini?
f = lambda x, y=3: x ** y
print(f(2))

Soal 3Manakah dari berikut ini yang merupakan penggunaan lambda expression yang paling tepat?