Fungsi adalah blok kode yang diberi nama dan dapat dipanggil berulang kali dari bagian mana pun pada program. Topik ini membahas cara mendefinisikan fungsi dengan pernyataan def, mengembalikan nilai dengan return, mendokumentasikannya dengan docstring, serta merapikan kode yang berulang menjadi fungsi mengikuti prinsip DRY. Setelah membacanya, program yang panjang dapat dipecah menjadi bagian bernama yang mudah diuji dan digunakan ulang.
Mendefinisikan fungsi dengan def#
Pernyataan def membuat fungsi baru dengan bentuk def nama(parameter): diikuti badan fungsi yang menjorok ke dalam. Nama fungsi mengikuti aturan penamaan variabel, dan konvensi PEP 8 menyarankan huruf kecil dengan tanda garis bawah. Badan fungsi tidak dijalankan pada saat def dibaca, melainkan hanya ketika fungsinya dipanggil dengan menuliskan namanya disertai tanda kurung.
Parameter ditulis di dalam tanda kurung sebagai nama yang berlaku secara lokal di dalam fungsi. Apabila pemanggil mengirim nilai, nilai tersebut masuk melalui parameter. Contoh berikut mendefinisikan fungsi sapa dengan satu parameter, lalu memanggilnya dua kali.
def sapa(nama):
"""Menyapa seseorang dengan salam singkat."""
print("Halo,", nama)
sapa("Budi")
sapa("Citra")Halo, Budi
Halo, CitraFungsi yang sama dipanggil dua kali dengan nilai berbeda, sehingga dua salam berbeda dicetak. Nama fungsi cukup didefinisikan sekali, sedangkan perilakunya digunakan ulang pada setiap pemanggilan. String pada baris pertama badan fungsi adalah docstring yang penulisannya dibahas pada bagian selanjutnya.
Baris def dijalankan dari atas ke bawah seperti baris lainnya, sehingga fungsi wajib terdefinisi sebelum baris yang memanggilnya dieksekusi. Pemanggilan yang ditulis lebih dahulu ditolak dengan NameError. Kebiasaan yang lazim adalah menumpuk seluruh definisi fungsi pada bagian atas berkas, lalu memanggilnya dari bagian bawah.
Mengembalikan nilai dengan return#
Pernyataan return mengembalikan sebuah nilai kepada pemanggil dan langsung menghentikan eksekusi badan fungsi. Nilai yang dikembalikan dapat disimpan ke dalam variabel atau langsung dipakai di dalam ekspresi lain. Fungsi yang berperan menghitung biasanya mengembalikan nilai tanpa mencetak apa pun, sehingga perhitungan dan tampilan tetap terpisah.
def luas_segitiga(alas, tinggi):
"""Menghitung luas segitiga dari alas dan tingginya."""
return alas * tinggi / 2
hasil = luas_segitiga(6, 4)
print(hasil)
print(luas_segitiga(10, 5) + luas_segitiga(3, 8))12.0
37.0Fungsi luas_segitiga mengembalikan hasil pembagian, sehingga nilainya bertipe float meskipun hasilnya bilangan bulat. Pemanggilan kedua menggabungkan dua hasil di dalam satu ekspresi penjumlahan, yang menunjukkan bahwa nilai kembalian dapat diperlakukan seperti nilai biasa. Bentuk ini memungkinkan fungsi dirangkai menjadi perhitungan yang lebih besar tanpa menyimpan keadaan di antaranya.
Fungsi tanpa return mengembalikan None#
Tidak setiap fungsi mengembalikan nilai. Fungsi yang badannya tidak memuat return, atau hanya memuat return tanpa nilai, mengembalikan None secara otomatis. Perilaku ini penting dipahami agar hasil sebuah fungsi tidak disalahgunakan sebagai nilai perhitungan.
def tulis_laporan(judul):
print("==", judul, "==")
hasil = tulis_laporan("Suhu Harian")
print(hasil)== Suhu Harian ==
NoneFungsi tulis_laporan hanya mencetak judul, dan variabel hasil menerima None karena fungsi tersebut tidak memiliki return. Pemisahan peran ini lazim pada program yang rapi, yaitu fungsi yang memproses data mengembalikan nilai, sedangkan fungsi yang menampilkan keluaran cukup mencetak tanpa mengembalikan apa pun.
Mendokumentasikan dengan docstring#
String pertama pada badan fungsi dinamakan docstring, yaitu dokumentasi yang menyertainya dan dapat dibaca oleh alat bantu maupun pembaca kode. Docstring ditulis dalam tanda kutip tiga dan biasanya berisi satu baris ringkas, dengan rincian tambahan pada baris berikutnya apabila diperlukan. Python menyimpannya pada atribut __doc__ milik fungsi.
def konversi_celsius(celsius):
"""Mengonversi suhu Celsius ke Fahrenheit.
Rumus: F = C * 9 / 5 + 32.
"""
return celsius * 9 / 5 + 32
print(konversi_celsius.__doc__.splitlines()[0])
print(konversi_celsius(25))Mengonversi suhu Celsius ke Fahrenheit.
77.0Atribut __doc__ berisi seluruh docstring, dan contoh di atas mengambil baris pertamanya untuk ditampilkan. Fungsi bawaan help() membaca docstring yang sama, sehingga dokumentasi yang ditulis sekali dapat dilihat oleh pembaca kode maupun pengguna REPL. Kebiasaan menulis docstring sejak fungsi pertama menjaga program tetap dapat dipahami tanpa membaca detail implementasinya.
Merapikan kode berulang dengan DRY#
Prinsip DRY (Don’t Repeat Yourself) menyatakan bahwa satu aturan sebaiknya hanya ditulis satu kali pada program. Kode yang disalin-tempel di banyak tempat harus diperbaiki di semua tempat apabila aturannya berubah, sedangkan logika yang sudah menjadi fungsi cukup diperbaiki pada satu definisi. Proses memindahkan kode berulang ke dalam fungsi dinamakan refactoring.
Contoh berikut memuat logika penentuan kelulusan yang dipakai untuk setiap siswa, lengkap dengan data ujiannya.
def status_kelulusan(nilai):
"""Menyatakan LULUS bila nilai minimal 70, selain itu TIDAK LULUS."""
if nilai >= 70:
return "LULUS"
return "TIDAK LULUS"
siswa = [("Ali", 78), ("Budi", 65), ("Citra", 91)]
for nama, nilai in siswa:
print(nama, nilai, status_kelulusan(nilai))Ali 78 LULUS
Budi 65 TIDAK LULUS
Citra 91 LULUSLogika penentuan status berada pada satu fungsi, sedangkan perulangan hanya menyalurkan data. Apabila batas kelulusan berubah menjadi 75, cukup satu baris di dalam status_kelulusan yang disunting dan seluruh program mengikuti. Berkas pada contoh tersimpan sebagai status-siswa.py, dan programnya dijalankan dengan perintah berikut.
# menjalankan program status kelulusan
python3 status-siswa.pyAli 78 LULUS
Budi 65 TIDAK LULUS
Citra 91 LULUSKesalahan umum#
Kesalahan pertama adalah menaruh return di dalam perulangan tanpa disadari. Pernyataan return menghentikan seluruh fungsi, sehingga nilai yang dikembalikan hanya milik item pertama dan sisa perulangan tidak pernah dijalankan.
def total_salah(daftar):
for angka in daftar:
return angka
print(total_salah([10, 20, 30]))10Fungsi di atas hanya mengembalikan 10, yaitu item pertama, karena return dijalankan sebelum perulangan sempat berputar lagi. Perbaikannya menampung hasil pada variabel di luar perulangan, lalu return diletakkan setelah perulangan selesai.
def total(daftar):
hasil = 0
for angka in daftar:
hasil += angka
return hasil
print(total([10, 20, 30]))60Kesalahan kedua adalah mendefinisikan fungsi tetapi tidak memanggilnya. Baris def hanya mendaftarkan nama, sehingga program yang tidak memuat pemanggilan berjalan tanpa hasil dan tanpa pesan error. Kesalahan ketiga adalah mengira mencetak sama dengan mengembalikan, padahal fungsi yang badannya hanya berisi print tetap mengembalikan None sebagaimana dibahas pada bagian sebelumnya.
Ringkasan#
- Pernyataan
defmendefinisikan fungsi bernama dengan parameter, dan badannya baru dijalankan ketika fungsi dipanggil. returnmengembalikan nilai kepada pemanggil dan menghentikan badan fungsi, sedangkan fungsi tanpareturnmengembalikanNone.- Docstring pada baris pertama badan fungsi tersimpan di atribut
__doc__dan dibaca olehhelp(). - Kode yang berulang dipindahkan ke satu fungsi mengikuti prinsip DRY, sehingga perbaikan cukup dilakukan satu kali.
Referensi#
- More Control Flow Tools — Python Software Foundation — Bagian tutorial resmi tentang pendefinisian fungsi, return, dan docstring.
- Function definitions — Python Software Foundation — Referensi bahasa untuk semantik pernyataan def.
- PEP 257 – Docstring Conventions — Python Software Foundation — Konvensi penulisan docstring yang disarankan.