Learn
← Previous Next →

Hari 12: Fungsi — def, return & Scope

65 min Last updated 26 Mar 2026

Mengapa Fungsi?

Fungsi memungkinkan kode DRY (Don't Repeat Yourself), modular, dan mudah di-test. Satu fungsi = satu tanggung jawab.

# Tanpa fungsi — kode berulang
print("=" * 30)
print("  Laporan Januari")
print("=" * 30)

print("=" * 30)
print("  Laporan Februari")
print("=" * 30)

# Dengan fungsi
def cetak_header(judul):
    print("=" * 30)
    print(f"  {judul}")
    print("=" * 30)

cetak_header("Laporan Januari")
cetak_header("Laporan Februari")

Parameter & Argumen

# Parameter dengan nilai default
def sapa(nama, salam="Halo"):
    print(f"{salam}, {nama}!")

sapa("Budi")              # Halo, Budi!
sapa("Ani", "Selamat pagi") # Selamat pagi, Ani!

# Keyword argument — urutan bebas
def profil(nama, umur, kota):
    print(f"{nama}, {umur} tahun, dari {kota}")

profil(umur=25, kota="Jakarta", nama="Budi")

return — Nilai Kembalian

# Kembalikan satu nilai
def luas_persegi_panjang(p, l):
    return p * l

luas = luas_persegi_panjang(10, 5)
print(luas)  # 50

# Kembalikan banyak nilai (sebenarnya tuple)
def statistik(data):
    return min(data), max(data), sum(data)/len(data)

mn, mx, avg = statistik([3, 7, 2, 9, 4])
print(f"Min={mn}, Max={mx}, Avg={avg}")

# return tanpa nilai = return None
def validasi(x):
    if x < 0:
        print("Nilai negatif!")
        return          # keluar dari fungsi
    print(f"Nilai valid: {x}")

Scope — Jangkauan Variabel

# Local scope — hanya ada di dalam fungsi
def hitung():
    hasil = 42      # variabel lokal
    return hasil

# print(hasil)  # NameError! tidak bisa diakses di luar

# Global scope
total = 0

def tambah(n):
    global total    # deklarasi global agar bisa diubah
    total += n

tambah(10)
tambah(5)
print(total)  # 15

# Aturan LEGB: Local → Enclosing → Global → Built-in
x = "global"

def luar():
    x = "enclosing"
    def dalam():
        x = "local"
        print(x)   # local
    dalam()
    print(x)       # enclosing

luar()
print(x)           # global

Assignment

Buat fungsi-fungsi untuk sistem nilai: (1) hitung_grade(nilai) → grade A-E, (2) statistik_kelas(daftar_nilai) → dict berisi min, max, avg, lulus, tidak_lulus, (3) cetak_rapor(nama, nilai_dict) yang menampilkan rapor lengkap.

Expected output:

===================================
RAPOR — BUDI SANTOSO
===================================
Matematika : 88 (B)
Bahasa Indo : 75 (C)
IPA : 92 (A)
IPS : 70 (C)
Inggris : 85 (B)
===================================
Rata-rata: 82.0
PY main.py
Solution
Output