Argumen Fungsi
Cara memasukkan data ke fungsi lebih fleksibel dari yang terlihat — dan ada satu perilaku yang wajib kamu tahu sebelum tergigit olehnya.
Intisari
- Nilai bawaan:
def sapa(nama, salam="Halo"). Parameter bernilai bawaan harus ditaruh setelah yang tidak punya. - Memanggil dengan nama:
sapa(salam="Hai", nama="Budi")— urutan jadi bebas dan kodenya lebih jelas. - Kelebihan atau kekurangan argumen langsung
TypeError, bukan diam-diam salah. - Jangan pakai
[]atau{}sebagai nilai bawaan — pakaiNonelalu buat isinya di dalam. - Kalau argumennya sudah lebih dari 3–4, biasanya fungsi itu perlu dipecah.
Nilai bawaan
def sapa(nama, salam="Halo"):
return f"{salam}, {nama}!"
print(sapa("Budi")) # Halo, Budi!
print(sapa("Budi", "Selamat pagi")) # Selamat pagi, Budi!
Parameter dengan nilai bawaan jadi opsional. Aturannya: yang punya nilai bawaan harus ditulis paling belakang.
def salah(salam="Halo", nama): # SyntaxError
...
Memanggil dengan menyebut nama parameter
def buat_akun(nama, umur, kota, aktif=True):
...
# Sulit dibaca — apa arti True di ujung?
buat_akun("Budi", 20, "Bandung", False)
# Jelas
buat_akun(nama="Budi", umur=20, kota="Bandung", aktif=False)
# Campuran juga boleh: posisi dulu, baru yang bernama
buat_akun("Budi", 20, kota="Bandung", aktif=False)
Kebiasaan yang layak diikuti: begitu sebuah argumen berupa True/False
atau angka tanpa satuan yang jelas, sebutkan nama parameternya. Kamu sedang menulis untuk dirimu
tiga bulan lagi, yang sudah lupa urutan parameternya.
Salah jumlah argumen
def tambah(a, b):
return a + b
tambah(1) # TypeError: tambah() missing 1 required positional argument: 'b'
tambah(1, 2, 3) # TypeError: tambah() takes 2 positional arguments but 3 were given
Python tidak menebak — dan itu bagus. Pesan errornya menyebutkan persis apa yang kurang atau kelebihan.
Jebakan: nilai bawaan yang bisa berubah
def tambah_tugas(tugas, daftar=[]): # ← JANGAN PERNAH begini
daftar.append(tugas)
return daftar
print(tambah_tugas("belajar")) # ['belajar']
print(tambah_tugas("olahraga")) # ['belajar', 'olahraga'] ← lho?
Nilai bawaan dievaluasi sekali saja, saat baris def dibaca — bukan setiap kali
fungsi dipanggil. Jadi list kosong itu cuma ada satu, dan ia diwariskan terus dari panggilan ke panggilan.
Cara yang benar:
def tambah_tugas(tugas, daftar=None):
if daftar is None:
daftar = [] # list baru tiap kali dipanggil
daftar.append(tugas)
return daftar
print(tambah_tugas("belajar")) # ['belajar']
print(tambah_tugas("olahraga")) # ['olahraga'] ← benar
Hafalkan sebagai aturan buta: nilai bawaan hanya boleh berupa angka, teks,
True/False, atau None. Kalau kamu butuh list atau dictionary
sebagai bawaan, tulis None lalu buat isinya di baris pertama fungsi.
Fungsi bisa memanggil fungsi lain
def kena_pajak(harga, persen=11):
return harga * persen / 100
def harga_akhir(harga, diskon=0):
setelah_diskon = harga - (harga * diskon / 100)
return setelah_diskon + kena_pajak(setelah_diskon)
print(f"Rp {harga_akhir(100000, diskon=20):,.0f}") # Rp 88,800
Inilah cara program besar dibangun: fungsi-fungsi kecil yang bisa dipahami sendiri-sendiri, disusun jadi satu.
Terlalu banyak argumen
# Sulit dipakai, gampang tertukar
def kirim(nama, email, subjek, isi, cc, bcc, prioritas, lampiran):
...
# Kelompokkan jadi satu dictionary
def kirim(penerima, pesan):
...
kirim(
penerima={"nama": "Budi", "email": "[email protected]"},
pesan={"subjek": "Halo", "isi": "Apa kabar?"},
)
Latihan: buat fungsi hitung_gaji(gaji_pokok, lembur_jam=0, tarif_lembur=25000, potongan_persen=5)
yang mengembalikan gaji bersih. Panggil dengan berbagai kombinasi — hanya gaji pokok,
dengan lembur, dan dengan potongan berbeda — untuk merasakan gunanya nilai bawaan.
Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.