pythonfungsiMenengah6 mnt baca

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.

python
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))  # 1500

Sekarang versi yang lebih realistis, menghitung rata-rata penjualan harian yang jumlah harinya berubah-ubah:

python
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.

python
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.

python
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().

python
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.

python
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 **kwargs sebelum *args akan error.

Jebakan Umum

SALAH, lambda dipakai untuk logika panjang:

python
# 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:

python
# Lakukan: logika kompleks tetap pakai def
def proses(x):
    if x > 10:
        return x * 2
    if x > 5:
        return x + 5
    return x - 1

SALAH, lupa *args hanya menerima argumen posisi:

python
# Jangan: keyword argument masuk ke **kwargs, bukan *args
def jumlahkan(*angka):
    return sum(angka)

jumlahkan(a=10, b=20)  # TypeError: jumlahkan() takes 0 positional arguments

BENAR, pakai parameter yang sesuai kebutuhan:

python
# Lakukan: gabungkan keduanya kalau memang butuh
def jumlahkan(*angka, **bernama):
    return sum(angka) + sum(bernama.values())

print(jumlahkan(10, 20, a=5, b=5))  # 40

Tantangan

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.