Sesi 9: Fungsi, Prosedur, dan Modularitas Kode
Fondasi Kode Bersih: Mengorganisasi perhitungan kompleks menjadi unit-unit logis yang independen dan dapat digunakan kembali (reusable).
I. Ulasan: Mengapa Fungsi Wajib dalam Sains?
Fungsi adalah blok kode bernama yang hanya berjalan ketika dipanggil. Dalam komputasi saintifik, fungsi adalah jantung dari modularitas, menawarkan manfaat:
- Reusabilitas: Formula yang sama (misalnya, menghitung energi kinetik) dapat dipanggil ratusan kali tanpa perlu ditulis ulang.
- Keterbacaan: Kode utama menjadi lebih ringkas karena blok besar logika berada di dalam fungsi (abstraction).
- Kemudahan Debugging: Jika ada error, Anda tahu persis di fungsi mana masalah itu berada.
Anatomi Fungsi: def, Parameter, dan return
Fungsi didefinisikan dengan kata kunci def. Ia menerima *input* melalui **parameter** (argumen) dan mengirimkan *output* melalui kata kunci return. Sebuah fungsi yang tidak memiliki return hanya menjalankan aksi (disebut *prosedur*).
Cakupan Variabel (Scope)
Penting: Variabel yang didefinisikan di dalam fungsi bersifat lokal dan tidak dapat diakses di luar fungsi. Ini memastikan fungsi bersifat independen. Variabel **global** harus dihindari sebisa mungkin dalam fungsi untuk menjaga modularitas.
II. Contoh Manual: Implementasi Fungsi Rumus Gerak
Kita ingin menghitung Kecepatan Akhir (vt) dari benda yang bergerak dengan percepatan konstan.
2.1. Formula Gerak: vt = v0 + a . t
v0 (Kecepatan awal), a (Percepatan), t (Waktu).
PANGGILAN 1: Hitung Kecepatan Akhir
input: v0 = 10, a = 2, t = 5
Kalkulasi: 10 + (2 * 5) = 20
Output: 20.0
PANGGILAN 2: Skenario Berbeda
input: v0 = 5, a = -1.5, t = 2
Kalkulasi: 5 + (-1.5 * 2) = 2.0
Output: 2.0
Fungsi memungkinkan kita melakukan kalkulasi yang sama berulang kali dengan input yang berbeda tanpa menulis ulang formula. Nilai hasil di-*return* agar dapat digunakan untuk perhitungan lain (misalnya, menghitung Jarak).
III. Kode Praktik (Google Colab)
3.1. Kode Sederhana: Fungsi Kalkulasi Konstanta Boltzmann
Membuat fungsi untuk menghitung Energi Termal rata-rata per partikel, E = (3/2)kT.
# Konstanta Boltzmann (J/K)
K_BOLTZMANN = 1.380649e-23
def hitung_energi_termal(suhu_kelvin):
"""
Menghitung energi termal rata-rata partikel (Joule)
pada suhu_kelvin tertentu.
"""
# Formula: E = (3/2) * k * T
energi = 1.5 * K_BOLTZMANN * suhu_kelvin
return energi
# Panggilan Fungsi
T_ruangan = 300.0 # Kelvin
T_kriogenik = 4.2 # Helium cair
E_ruangan = hitung_energi_termal(T_ruangan)
E_kriogenik = hitung_energi_termal(T_kriogenik)
print(f"Energi Termal (300 K): {E_ruangan:.2e} J")
print(f"Energi Termal (4.2 K): {E_kriogenik:.2e} J")
Energi Termal (300 K): 6.21e-21 J Energi Termal (4.2 K): 8.69e-23 J
3.2. Kode Kompleks: Fungsi dengan Logika Kontrol dan Data List
Membuat satu fungsi untuk **menghitung rata-rata List** dan **mengklasifikasikan** hasilnya, mengintegrasikan Sesi 4, 6, dan 9.
def analisis_konduktivitas(data_konduktivitas):
"""
Menerima List data konduktivitas dan mengembalikan rata-rata
serta status klasifikasi bahannya.
"""
if not data_konduktivitas:
return 0.0, "Tidak ada data"
# Kalkulasi Rata-rata (List Function)
rata_rata = sum(data_konduktivitas) / len(data_konduktivitas)
# Logika Klasifikasi (Kondisional)
if rata_rata > 1e7:
status = "Konduktor Superior"
elif rata_rata > 1e3:
status = "Konduktor Standar"
else:
status = "Semikonduktor/Isolator"
return rata_rata, status
# Data Eksperimen (S/m)
konduktor_A = [1.2e7, 1.1e7, 1.3e7]
konduktor_B = [5000.0, 6500.0, 7000.0]
avg_A, status_A = analisis_konduktivitas(konduktor_A)
avg_B, status_B = analisis_konduktivitas(konduktor_B)
print(f"Bahan A: Rata-rata {avg_A:.2e} S/m -> {status_A}")
print(f"Bahan B: Rata-rata {avg_B:.2e} S/m -> {status_B}")
Bahan A: Rata-rata 1.20e+07 S/m -> Konduktor Superior Bahan B: Rata-rata 6.17e+03 S/m -> Konduktor Standar
3.3. Kode Kompleks: Fungsi dengan Argumen Default dan *Keyword*
Menggunakan Argumen Default untuk Percepatan Gravitasi (g = 9.81 m/s2) dalam menghitung Energi Potensial, sehingga g tidak perlu dimasukkan setiap saat.
def hitung_energi_potensial(massa, tinggi, gravitasi=9.81):
"""
Menghitung Energi Potensial (Joule).
Gravitasi memiliki nilai default 9.81 m/s^2.
"""
# Formula: E_p = m * g * h
energi = massa * gravitasi * tinggi
return energi
# Skenario 1: Bumi (menggunakan nilai default 9.81)
m_objek = 10.0 # kg
h_objek = 5.0 # meter
Ep_Bumi = hitung_energi_potensial(m_objek, h_objek)
# Skenario 2: Bulan (menggunakan keyword argument)
g_bulan = 1.62 # m/s^2
Ep_Bulan = hitung_energi_potensial(massa=m_objek, tinggi=h_objek, gravitasi=g_bulan)
print(f"Energi Potensial di Bumi: {Ep_Bumi:.2f} J")
print(f"Energi Potensial di Bulan: {Ep_Bulan:.2f} J")
Energi Potensial di Bumi: 490.50 J Energi Potensial di Bulan: 81.00 J
IV. Penugasan / PR Sesi 9: Fungsi Kalkulator Vektor
Tugas Anda adalah membuat fungsi yang menghitung Dot Product (hasil skalar) dari dua vektor 2D.
- Definisi Fungsi: Buat fungsi bernama dot_product_2d yang menerima empat parameter: x1, y1, x2, y2.
- Formula: Dot product: D = (x1 × x2) + (y1 × y2).
- Implementasi: Hitung dan kembalikan (return) nilai D.
- Pengujian: Panggil fungsi tersebut untuk menghitung Dot Product Vektor A (3, 4) dan Vektor B (1, −2). Hasilnya harus −5.