Fungsi Lanjutan Python: *args, **kwargs, Lambda
Naik kelas dari fungsi biasa ke fungsi yang fleksibel: argumen tak terbatas, fungsi anonim, dan fungsi sebagai parameter.
Fungsi yang Bisa Menerima Apa Saja
Bayangkan kamu punya resep masakan yang bahan tambahannya bebas. Kadang dua bahan, kadang lima. Fungsi lanjutan itu seperti itu, satu fungsi yang siap menerima jumlah argumen berapa pun tanpa kamu harus menulis ulang.
Kenapa penting untuk data analyst? Karena data dunia nyata itu tidak rapi. Suatu hari kamu perlu menghitung rata-rata dari 3 kolom, besok dari 12 kolom. Fungsi fleksibel membuat skrip analisismu bisa dipakai ulang tanpa diutak-atik terus.
*args: Argumen Posisi Tak Terbatas
Tambahkan tanda bintang di depan parameter, dan Python akan membungkus semua argumen posisi jadi tuple.
def total_penjualan(*angka):
return sum(angka)
print(total_penjualan(10, 20, 30)) # 60
print(total_penjualan(5, 15)) # 20
print(total_penjualan(100, 200, 300, 400, 500)) # 1500Sekarang versi yang lebih realistis, menghitung rata-rata penjualan harian yang jumlah harinya berubah-ubah:
def rata_rata(*nilai):
if not nilai:
return 0
return sum(nilai) / len(nilai)
senin_jumat = rata_rata(120, 150, 130, 170, 160)
seminggu = rata_rata(120, 150, 130, 170, 160, 90, 80)
print(f"5 hari: {senin_jumat}, 7 hari: {seminggu}")**kwargs: Argumen Bernama Tak Terbatas
Dua bintang membungkus argumen bernama menjadi dictionary. Berguna untuk konfigurasi atau metadata.
def info_produk(nama, **detail):
print(f"Produk: {nama}")
for kunci, nilai in detail.items():
print(f" {kunci}: {nilai}")
info_produk("Kopi Susu", harga=18000, stok=50, kategori="minuman")Lambda: Fungsi Mini Satu Baris
Lambda adalah fungsi anonim untuk operasi kecil yang hanya dipakai sekali, misalnya sebagai kunci pengurutan.
data = [("Budi", 25), ("Ani", 30), ("Citra", 22)]
diurutkan = sorted(data, key=lambda x: x[1])
print(diurutkan) # [('Citra', 22), ('Budi', 25), ('Ani', 30)]Fungsi sebagai Argumen
Fungsi bisa dilempar ke fungsi lain. Ini fondasi dari map() dan method-method pandas seperti apply().
def ke_rupiah(angka):
return f"Rp{angka:,}"
harga = [15000, 25000, 30000]
hasil = list(map(ke_rupiah, harga))
print(hasil) # ['Rp15,000', 'Rp25,000', 'Rp30,000']Docstring: Dokumentasi yang Nempel di Fungsi
Tulis string di baris pertama fungsi. Ini yang dibaca orang lain (dan dirimu 3 bulan lagi) saat bingung fungsi ini buat apa.
def hitung_diskon(harga, persen):
"""Menghitung harga setelah diskon.
Args:
harga: harga awal dalam rupiah.
persen: besar diskon (0-100).
Returns:
Harga akhir setelah diskon.
"""
return harga * (1 - persen / 100)Catatan teknis: Urutan parameter yang benar adalah: parameter biasa, lalu
*args, lalu parameter keyword-only, lalu**kwargs. Menulis**kwargssebelum*argsakan error.
Jebakan Umum
SALAH, lambda dipakai untuk logika panjang:
# Jangan: lambda yang susah dibaca
proses = lambda x: x * 2 if x > 10 else (x + 5 if x > 5 else x - 1)BENAR, lambda hanya untuk yang sederhana:
# Lakukan: logika kompleks tetap pakai def
def proses(x):
if x > 10:
return x * 2
if x > 5:
return x + 5
return x - 1SALAH, lupa *args hanya menerima argumen posisi:
# Jangan: keyword argument masuk ke **kwargs, bukan *args
def jumlahkan(*angka):
return sum(angka)
jumlahkan(a=10, b=20) # TypeError: jumlahkan() takes 0 positional argumentsBENAR, pakai parameter yang sesuai kebutuhan:
# Lakukan: gabungkan keduanya kalau memang butuh
def jumlahkan(*angka, **bernama):
return sum(angka) + sum(bernama.values())
print(jumlahkan(10, 20, a=5, b=5)) # 40Tantangan
Fungsi ringkasan kolom yang fleksibel
Buat fungsi bernama ringkas_kolom yang menerima angka tak terbatas lewat *args dan mengembalikan tuple berisi (rata-rata, minimum, maksimum). Tulis docstring yang menjelaskan parameter dan nilai kembaliannya, lalu panggil dengan 5 angka penjualan.