Dasar-dasar fungsi

Definisi fungsi dengan def, return, docstring, dan refactoring mengikuti prinsip DRY.

Daftar isi

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.

python Contoh: definisi dan pemanggilan fungsi
def sapa(nama):
    """Menyapa seseorang dengan salam singkat."""
    print("Halo,", nama)

sapa("Budi")
sapa("Citra")
text Keluaran
Halo, Budi
Halo, Citra

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

python Contoh: fungsi yang mengembalikan nilai
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))
text Keluaran
12.0
37.0

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

python Contoh: fungsi tanpa return menghasilkan None
def tulis_laporan(judul):
    print("==", judul, "==")

hasil = tulis_laporan("Suhu Harian")
print(hasil)
text Keluaran
== Suhu Harian ==
None

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

python Contoh: membaca docstring lewat __doc__
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))
text Keluaran
Mengonversi suhu Celsius ke Fahrenheit.
77.0

Atribut __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.

python status-siswa.py
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))
text Keluaran
Ali 78 LULUS
Budi 65 TIDAK LULUS
Citra 91 LULUS

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

bash
# menjalankan program status kelulusan
python3 status-siswa.py
text Keluaran
Ali 78 LULUS
Budi 65 TIDAK LULUS
Citra 91 LULUS

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

python Contoh: return di dalam perulangan
def total_salah(daftar):
    for angka in daftar:
        return angka

print(total_salah([10, 20, 30]))
text Keluaran
10

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

python Contoh: perbaikan dengan akumulasi
def total(daftar):
    hasil = 0
    for angka in daftar:
        hasil += angka
    return hasil

print(total([10, 20, 30]))
text Keluaran
60

Kesalahan 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 def mendefinisikan fungsi bernama dengan parameter, dan badannya baru dijalankan ketika fungsi dipanggil.
  • return mengembalikan nilai kepada pemanggil dan menghentikan badan fungsi, sedangkan fungsi tanpa return mengembalikan None.
  • Docstring pada baris pertama badan fungsi tersimpan di atribut __doc__ dan dibaca oleh help().
  • Kode yang berulang dipindahkan ke satu fungsi mengikuti prinsip DRY, sehingga perbaikan cukup dilakukan satu kali.

Referensi#