Function di Python: Memecah Masalah Jadi Kecil
Kode yang dipakai berulang kali sebaiknya ditulis sekali dan diberi nama. Function membuat program lebih pendek, lebih mudah dibaca, dan lebih mudah diperbaiki.
Oleh Afa Hernandes5 menit baca
Daftar isi
Bayangkan kamu menulis program kasir. Rumus “harga × jumlah, dikurangi diskon kalau belanja di atas Rp50.000” dipakai di lima tempat. Suatu hari aturan diskonnya berubah, dan kamu harus mencari serta mengganti kelima tempat itu, berharap tidak ada yang terlewat.
Function menyelesaikan masalah ini. Kamu menulis rumusnya sekali, memberinya nama, lalu memanggil nama itu di mana pun rumus itu dibutuhkan. Kalau aturannya berubah, cukup ubah di satu tempat.
Lebih dari itu, function adalah cara berpikir: memecah masalah besar menjadi bagian kecil yang masing-masing punya satu tugas jelas. Prinsip yang sama dipakai saat membangun aplikasi dengan AI, satu fitur sekali jalan. Semua contoh di tutorial ini diuji dengan Python 3.13.
Membuat dan memanggil function
Function dibuat dengan kata def, diikuti nama, tanda kurung, dan titik dua. Isinya menjorok ke dalam, sama seperti blok if dan for:
def sapa(): print("Halo!") print("Selamat belajar Python.")
sapa()sapa()Halo!Selamat belajar Python.Halo!Selamat belajar Python.Mendefinisikan function tidak menjalankannya. Kode di dalamnya baru berjalan saat function itu dipanggil dengan namanya diikuti tanda kurung: sapa().
Parameter: data yang dimasukkan
Function lebih berguna kalau bisa menerima data. Data itu ditulis sebagai parameter di dalam tanda kurung:
def sapa(nama): print(f"Halo, {nama}!")
sapa("Sari")sapa("Budi")Halo, Sari!Halo, Budi!nama adalah parameter, semacam variabel yang isinya diberikan oleh pemanggil. Nilai yang dimasukkan saat memanggil ("Sari", "Budi") disebut argumen.
return: hasil yang dikembalikan
Ini konsep yang paling penting, dan paling sering membingungkan pemula. print() hanya menampilkan sesuatu di layar. return mengembalikan nilai ke pemanggil, supaya bisa disimpan dan diolah lagi:
def hitung_total(harga, jumlah): return harga * jumlah
kopi = hitung_total(18000, 2)roti = hitung_total(12000, 3)semua = kopi + roti
print(kopi, roti, semua)36000 36000 72000Karena hitung_total mengembalikan angka, hasilnya bisa dijumlahkan menjadi semua. Coba bandingkan dengan versi yang memakai print:
def hitung_total_print(harga, jumlah): print(harga * jumlah)
hasil = hitung_total_print(18000, 2)print("Isi variabel hasil:", hasil)36000Isi variabel hasil: NoneAngkanya tampil di layar, tapi variabel hasil berisi None. Function tanpa return mengembalikan None, jadi hasilnya tidak bisa dipakai lagi. Aturan praktisnya: function yang menghitung sesuatu sebaiknya return, lalu yang menampilkan hasil adalah kode yang memanggilnya.
Nilai bawaan dan argumen bernama
Parameter bisa diberi nilai bawaan, sehingga boleh tidak diisi saat memanggil:
def harga_akhir(total, persen_diskon=0): potongan = total * persen_diskon // 100 return total - potongan
print(harga_akhir(73000))print(harga_akhir(73000, 10))print(harga_akhir(total=73000, persen_diskon=20))730006570058400Baris terakhir memakai argumen bernama (total=..., persen_diskon=...). Hasilnya sama, tapi kodenya lebih jelas dibaca, terutama kalau function punya banyak parameter.
Contoh lengkap: kasir kecil
Sekarang gabungkan semuanya. Setiap function punya satu tugas, lalu function-function itu dipakai bersama:
def subtotal(harga, jumlah): """Harga satu jenis barang dikali jumlahnya.""" return harga * jumlah
def persen_diskon(total): """Aturan diskon toko: 10% kalau belanja di atas Rp50.000.""" if total > 50000: return 10 return 0
def rupiah(angka): """Format angka menjadi teks rupiah, mis. 65700 -> 'Rp65.700'.""" return f"Rp{angka:,}".replace(",", ".")
keranjang = [("Kopi susu", 18000, 2), ("Roti bakar", 12000, 3)]
total = 0for nama, harga, jumlah in keranjang: total += subtotal(harga, jumlah) print(f"{nama:<12} {jumlah} x {rupiah(harga)}")
diskon = total * persen_diskon(total) // 100print(f"Total : {rupiah(total)}")print(f"Diskon : {rupiah(diskon)}")print(f"Bayar : {rupiah(total - diskon)}")Kopi susu 2 x Rp18.000Roti bakar 3 x Rp12.000Total : Rp72.000Diskon : Rp7.200Bayar : Rp64.800Perhatikan manfaatnya. Kalau aturan diskon berubah, kamu cukup mengubah persen_diskon. Kalau format rupiah perlu diperbaiki, cukup ubah rupiah. Setiap bagian bisa dipahami dan diuji sendiri-sendiri.
Teks di antara tiga tanda kutip di baris pertama setiap function disebut docstring. Isinya penjelasan singkat tentang tugas function itu. VS Code menampilkannya saat kursor diarahkan ke nama function.
({nama:<12} menulis teks rata kiri dengan lebar 12 karakter, supaya kolomnya sejajar.)
Scope: variabel di dalam function
Variabel yang dibuat di dalam function hanya ada di dalam function itu (variabel lokal):
def hitung(): luas = 10 * 2 return luas
print(hitung())print(luas)20Traceback (most recent call last): File "scope.py", line 6, in <module> print(luas) ^^^^NameError: name 'luas' is not definedluas hanya hidup selama hitung() berjalan. Ini justru menguntungkan: function tidak saling mengganggu variabel milik function lain. Cara yang benar untuk mengeluarkan nilai dari function adalah lewat return, seperti baris print(hitung()).
Kapan perlu membuat function?
- Kode yang sama ditulis dua kali atau lebih. Jadikan function.
- Sebuah bagian bisa diberi nama yang jelas, misalnya
hitung_ongkiratauvalidasi_email. Itu calon function yang baik. - Sebuah blok kode terlalu panjang untuk dipahami sekaligus. Pecah menjadi beberapa function kecil.
Satu function, satu tugas. Kalau nama function-mu butuh kata “dan” (misalnya hitung_dan_cetak_dan_simpan), kemungkinan ia sebaiknya dipecah.
Error yang sering muncul
NameError: name 'hitung_total' is not defined
Function dipanggil sebelum didefinisikan, atau namanya salah ketik. Python membaca dari atas ke bawah, jadi letakkan def di atas tempat ia dipanggil.
TypeError: hitung_total() missing 1 required positional argument: 'jumlah'
Jumlah argumen saat memanggil kurang dari jumlah parameternya.
Hasil function selalu None.
Lupa menulis return, atau return berada di dalam if yang tidak terpenuhi.
Cara membaca pesan error secara umum dibahas di membaca pesan error Python.
Latihan
- Buat function
luas_persegi_panjang(panjang, lebar)yang mengembalikan luasnya. - Buat function
nilai_huruf(nilai)yang mengembalikan"A","B","C", atau"D"memakai aturan di artikel percabangan, lalu panggil untuk tiga nilai berbeda.
Kesimpulan
Function adalah kode yang diberi nama: ditulis sekali, dipanggil berkali-kali. Parameter memasukkan data, return mengeluarkan hasil, dan variabel di dalamnya tidak mengganggu bagian lain. Pakai function untuk memecah masalah besar menjadi bagian kecil yang masing-masing punya satu tugas.
Langkah berikutnya di jalur Mulai Ngoding dari Nol: menyimpan banyak data sekaligus dengan list dan dictionary.



