Fungsi adalah blok kode yang diberi nama, supaya bisa dipanggil berulang kali tanpa ditulis ulang. Bayangin kartu resep di dapur Warung Kopi Pak Darto: "Total harga: harga dikali jumlah gelas". Kartunya ditulis sekali, lalu dipakai tiap ada pembeli. Bagian yang kosong di kartu (harganya berapa, berapa gelas) diisi tiap kali dipakai, dan hasil hitungannya diserahkan balik ke kasir.
🧪 Tebakan cepat:
total_harga(harga, jumlah)yang badannyaprint(harga * jumlah), bukanreturn, dipanggil denganhasil = total_harga(15000, 3), laluprint(hasil). Ada dua baris yang tercetak. Baris keduanya45000atauNone? Tebak dulu, jawabannya ada di bagian "return dan print itu beda".
Membuat dan memanggil fungsi
def total_harga(harga, jumlah):
return harga * jumlah
print(total_harga(15000, 3)) # 45000
bayar = total_harga(5000, 2) + total_harga(12000, 1)
print(bayar) # 22000
defadalah keyword untuk membuat fungsi di Python. Bukanfunctionseperti di JavaScript, bukanfnataufunc.total_harganama fungsinya, ditulis snake_case. Di dalam kurung ada parameter: nama untuk nilai yang akan dikirim, di sinihargadanjumlah. Barisdefdiakhiri titik dua.- Baris yang menjorok di bawahnya adalah badan fungsi. Badan ini belum jalan saat
defdibaca. Python cuma mengingat resepnya. total_harga(15000, 3)memanggil fungsinya. Nilai yang dikirim saat memanggil disebut argumen:hargadiisi 15000,jumlahdiisi 3, sesuai urutannya.returnmenyerahkan hasilnya ke tempat fungsi itu dipanggil, lalu fungsinya selesai. Baris di bawahreturngak pernah jalan.- Karena hasilnya diserahkan balik, panggilan fungsi bisa dipakai seperti nilai biasa: dicetak, dijumlah, atau disimpan ke variabel.
Fungsi harus sudah di-def sebelum dipanggil. Python menjalankan file dari atas, jadi panggilan di atas def-nya gagal dengan NameError: name 'total_harga' is not defined.
return dan print itu beda
Bayangin kasir minta asistennya menghitung total. Asisten yang print meneriakkan angkanya ke seluruh warung: semua dengar, tapi kasir gak pegang apa-apa. Asisten yang return menuliskannya di kertas lalu menyerahkannya ke kasir, jadi angkanya bisa dipakai lagi.
def total_harga(harga, jumlah):
print(harga * jumlah)
hasil = total_harga(15000, 3)
print(hasil)
45000
None
45000dicetak olehprintdi dalam fungsi, saat fungsinya dipanggil.- Fungsinya selesai tanpa
return. Fungsi tanpareturnselalu mengembalikanNone, nilai khusus yang artinya "gak ada isinya". JadihasilberisiNone, dan baris kedua mencetakNone. Itu jawaban tebakannya. - Akibatnya,
total_harga(15000, 3) + 5000gagal denganTypeError, karenaNonegak bisa dijumlah.
Aturannya: fungsi yang menghitung sesuatu sebaiknya return hasilnya. Yang mencetak biar kode yang memanggilnya.
Parameter default
Parameter bisa diberi nilai bawaan dengan =. Kalau argumennya gak dikirim, nilai bawaan itu yang dipakai:
def total_harga(harga, jumlah=1):
return harga * jumlah
print(total_harga(12000)) # 12000, jumlah pakai default 1
print(total_harga(15000, 3)) # 45000, jumlah diisi 3
jumlah=1artinya: kalau pemanggil gak menyebut jumlahnya, anggap 1 gelas.- Parameter tanpa default ditulis duluan.
def total_harga(jumlah=1, harga):ditolak denganSyntaxError: parameter without a default follows parameter with a default.
Contoh lain, menghitung harga setelah diskon. Diskon 10% dari 100.000: potongannya 100000 * 10 / 100, yaitu 10000.0, jadi harga akhirnya 100000 - 10000.0 = 90000.0. Ingat dari pelajaran operator, / selalu menghasilkan float, makanya Python menulis 90000.0, bukan 90000.
Docstring
Docstring adalah string di baris pertama badan fungsi, ditulis dengan tiga tanda kutip, yang menjelaskan apa yang dilakukan fungsi itu:
def sapa(nama):
"""Menyapa pelanggan dengan namanya."""
return f"Halo, {nama}!"
print(sapa.__doc__) # Menyapa pelanggan dengan namanya.
- Docstring bukan komentar
#. Python menyimpannya disapa.__doc__, danhelp(sapa)menampilkannya. - Editor juga menampilkannya saat kamu mengetik nama fungsinya, jadi orang lain tahu cara pakainya tanpa membaca isinya.
Variabel di dalam fungsi
Variabel yang dibuat di dalam fungsi cuma hidup di dalam fungsi itu. Namanya variabel lokal.
def total_harga(harga, jumlah):
subtotal = harga * jumlah
return subtotal
total_harga(15000, 3)
print(subtotal) # NameError: name 'subtotal' is not defined
Variabel di luar semua fungsi boleh dibaca dari dalam fungsi. Tapi begitu fungsi mengubahnya dengan = atau +=, Python menganggap nama itu variabel lokal milik fungsi, dan baris yang membacanya duluan gagal:
total = 0
def tambah(harga):
total += harga
tambah(15000)
UnboundLocalError: cannot access local variable 'total' where it is not associated with a value
Perbaikan yang paling bersih: kirim nilainya lewat parameter dan return hasil barunya, lalu simpan di luar: total = tambah(total, 15000), dengan def tambah(total, harga): return total + harga.
⚠️ Jebakan yang sering ketemu
printdikirareturn. Fungsinya mencetak angka, tapi hasilnyaNone. Kalau hasilnya mau dipakai lagi,return.- Kurang argumen.
total_harga(15000)tanpa default gagal denganTypeError: total_harga() missing 1 required positional argument: 'jumlah'. - Memanggil sebelum
def.NameError: name 'total_harga' is not defined. Taruhdefdi atas. - Mengubah variabel luar dari dalam fungsi.
total += hargadi dalam fungsi jadiUnboundLocalError. Kirim lewat parameter, lalureturn.
TL;DR: def nama(parameter): membuat fungsi, dan badannya baru jalan saat dipanggil dengan nama(argumen). return menyerahkan hasil ke pemanggil dan mengakhiri fungsi. Fungsi tanpa return mengembalikan None, jadi print di dalam fungsi bukan pengganti return. Parameter default (jumlah=1) dipakai kalau argumennya gak dikirim, dan ditulis setelah parameter tanpa default. / menghasilkan float: 100000 - 100000 * 10 / 100 adalah 90000.0. Docstring ("""...""" di baris pertama badan) menjelaskan fungsinya dan terbaca lewat help(). Variabel di dalam fungsi itu lokal: mengubah variabel luar dengan += memicu UnboundLocalError.