Ekskul CSSE · SMAS St. John — BINUSPertemuan 12
12
Modular · Sesi 12 — Functions / Modular Programming
Functions /
Modular Programming

Mesin mini: masuk buah, keluar jus. Ditulis sekali, dipanggil berkali-kali — tanpa copy-paste.

TUJUAN 01
Mendefinisikan & memanggil fungsi — def, parameter, return
TUJUAN 02
Membedakan return vs print & memakai parameter default
TUJUAN 03
Memecah program jadi modul — 1 fungsi 1 tanggung jawab
Target — apa yang kita capai hari ini

Dari nulis kode ke merakit mesin

Target Sesi 12
  1. Mendefinisikan fungsi dengan def & memanggilnya — parameter & argument
  2. Mengembalikan hasil dengan return & menyimpannya untuk dipakai lagi
  3. Bedakan return vs print — dua hal yang SANGAT beda
  4. Parameter default & modular: satu fungsi, satu tugas
◎

Kemarin hitung rata-rata ditulis sekali jalan — hari ini dibungkus jadi mesin yang tinggal dipanggil di tiga tempat.

Alur 100 menit
10'Pembuka & rekap Sesi 11
30'Materi: mesin, parameter, return vs print
20'Tugas 1 & 2: fungsi luas, keliling, konversi
20'Challenge: cek genap & konversi suhu
20'Pembahasan, rangkuman & Q&A
Prasyaratlist + loop + rata-rata dari Sesi 11 — hari ini dibungkus, bukan diulang.
Sebelum gas — minggu lalu kamu ndapetin apa?

Rekap Sesi 11 · List / Array

Yang sudah kamu pegang
  • Keranjang — satu nama pegang banyak nilai: nilai = [85, 92, 78]
  • Indeks 0 & negatif — nilai[0] pertama, nilai[-1] terakhir, slicing [1:3] stop tidak ikut
  • Kelola keranjang — append · remove · len · in, cek dulu baru hapus
  • Pola wadah — [] di luar, append di dalam, hitung di luar → rata-rata sum/len

Masalah kecil minggu lalu: kode rata-rata ditulis sekali jalan — tapi kalau butuh hitungan serupa di tiga tempat, copy-paste tiga kali? Hari ini ada cara yang lebih elegan.

Kuis kilat — tebak output!
nilai = [85, 92, 78]
print(sum(nilai) / len(nilai))

Keluar berapa? 85.0. Sekarang bayangkan butuh hitungan itu di 3 menu program — mau copy-paste 3×?

!

Posisimu: 12 dari 17 — 71% perjalanan. Mini Project 2 makin dekat!

Blender: masuk buah, keluar jus — buah apa pun, mesinnya sama

Fungsi = mesin mini

Code — mesin pertamamu
def sapa(nama):          # def = MERAKIT mesin
    pesan = "Hai, " + nama + "!"
    return pesan         # return = hasil keluar mesin

print(sapa("Budi"))       # memanggil = MENYALAKAN
print(sapa("Ani"))        # mesin yang sama, buah beda
Cara membacanya
  • def = merakit mesin — belum jalan, cuma disiapkan
  • sapa("Budi") = menyalakan — tanpa tanda kurung, mesin diam
  • Ditulis sekali, dipanggil berkali-kali — buah apa pun bisa di-blend
Output
Hai, Budi!
Hai, Ani!

Satu mesin, dua panggilan, hasil beda — kamu tidak menulis ulang rumusnya.

DEFINISI
def sapa(nama):
PANGGILAN
sapa("Budi")
→

Nama fungsi pakai snake_case deskriptif: hitung_luas() bukan f() — nama menjelaskan kerja mesinnya.

Kotak masukan berlabel — isi kotaknya apa, otaknya selesai

Parameter & argument

Code — dua kotak masukan
def luas_persegi_panjang(panjang, lebar):
    return panjang * lebar

print(luas_persegi_panjang(8, 5))   # 40
print(luas_persegi_panjang(7, 2))   # 14
PARAMETER

di definisi — panjang, lebar: kotak kosong yang nunggu diisi

ARGUMEN

di panggilan — 8, 5: nilai beneran yang masuk kotak

Output
40
14

Urutan pengisian mengikuti urutan kotak: 8 masuk panjang, 5 masuk lebar.

Tanya satu hal: "mesin ini butuh apa untuk bekerja?" — itulah parameternya. Butuh dua data? Jangan dipaksa satu.

Mesin sudah jalan — tapi hasilnya mau kamu bawa pulang?

return — hasil keluar mesin

Code — hasil bisa disimpan & dihitung lagi
def luas_persegi(sisi):
    return sisi * sisi

hasil = luas_persegi(5)    # hasil = 25, DISIMPAN
print(hasil)                 # 25
print(hasil * 2)             # 50 — bisa dihitung lagi!
Cara membacanya
  • return = mesin menyerahkan hasil ke tangan yang memanggil
  • Hasilnya bisa disimpan ke variabel — lalu dipakai, dihitung, dioper ke mesin lain
  • Selesai return, mesin berhenti — baris di bawahnya tidak dieksekusi
Output
25
50

hasil * 2 bisa jalan karena fungsi memakai return — hasilnya nilai yang hidup, bukan sekadar tampil.

?

Kalau return diganti print — apa yang ditangkap hasil = ...? Jawabannya slide berikutnya, dan itu jebakan terkenal.

Jebakan paling legendaris pemula — dua kata yang dikira kembar

return vs print — SANGAT beda

return — menyerahkan kopi ke tanganmu
def kali(a, b):
    return a * b

hasil = kali(3, 4)
print(hasil + 1)   # 13 — bisa dihitung!
  • Hasil bisa disimpan & dipakai lagi
  • Layar tidak otomatis menampilkan apa-apa
  • Untuk fungsi yang menghitung — hampir selalu ini
print — cuma menunjukkan kopi, lalu lenyap
def kali(a, b):
    print(a * b)   # cuma tampil di layar

hasil = kali(3, 4)  # 12 tampil, TAPI...
print(hasil)        # None — tidak ada yang disimpan!
  • Tampil di layar, lalu lenyap — tak bisa dipakai lagi
  • Hasil panggilan fungsi jadi None
  • Untuk menampilkan — panggil di luar fungsi

Analogi kelas: mesin yang hanya print itu barista yang cuma nunjukin kopi — kelihatan, tapi tidak bisa diminum. Mesin yang return menyerahkan kopinya ke tanganmu — disimpan, dihitung lagi, dioper ke mesin lain. Uji cepat: total = kali(3, 4) + 1 hanya benar kalau fungsi return.

Giliran kamu — garasi mesinmu menunggu

Tugas 1 · Mesin geometri — luas & keliling

Kerjakan berurutan — 3 langkah
  1. Mesin 1 — def luas_persegi_panjang(panjang, lebar): yang return hasilnya. Simpan ke variabel, cetak.
  2. Mesin 2 — def keliling_persegi_panjang(panjang, lebar): yang return 2 * (panjang + lebar).
  3. Panggil keduanya sekali dengan p = 8, l = 5 — lalu panggil LAGI dengan data lain, tanpa menulis ulang rumus.
Kerangka mulai
def luas_persegi_panjang(panjang, lebar):
    return panjang * lebar

luas = luas_persegi_panjang(8, 5)
print("Luas:", luas)
Output yang harus muncul
Luas: 40
Keliling: 26
Luas 7x2: 14

Panggilan kedua dengan data beda tanpa nulis ulang — itu bukti mesinmu reusable.

!

Kaget None muncul? Bagus — itu bahan diskusi return vs print. Cek kata yang kamu pakai di dalam mesin.

Kotak yang tidak diisi tetap bikin mesin jalan — caranya?

Parameter default & mesin modular

Code — nilai cadangan
def sapa(nama="teman"):
    return "Hai, " + nama + "!"

print(sapa("Budi"))   # Hai, Budi!
print(sapa())          # Hai, teman! — pakai default

Default = nilai cadangan — kotak yang tidak diisi tetap membuat mesin jalan. Wajib diisi dulu, boleh-skip di belakang: def f(wajib, opsional="x"):

Output
Hai, Budi!
Hai, teman!

Isi kotaknya → timpa default. Kosongkan → mesin tetap nyala dengan isi bawaan.

→

Modular = program dipecah mesin-mesin kecil — 1 fungsi, 1 tanggung jawab. luas() cuma hitung luas, keliling() cuma keliling. Dirakit jadi program besar.

Naik level — tiga mesin, satu program, tugas penilaian sesi ini

Tugas 2 · Tiga fungsi dalam satu program

Misi — dari penilaian kurikulum
  1. Mesin luas — luas_persegi_panjang(panjang, lebar) → return luas
  2. Mesin keliling — keliling_persegi_panjang(panjang, lebar) → return keliling
  3. Mesin konversi — konversi_suhu(celsius) → return celsius * 9 / 5 + 32
  4. Rakit — panggil ketiganya dalam satu program, cetak semua hasilnya
Struktur file yang benar
def mesin_1(...): # 3 def di ATAS
def mesin_2(...):
def mesin_3(...):

print(mesin_1(...)) # panggilan di BAWAH
print(mesin_2(...))
print(mesin_3(...))
Output yang harus muncul
Luas 8x5: 40
Keliling 8x5: 26
32 C = 89.6 F

Angka boleh kamu pilih — yang dinilai: 3 fungsi return & semuanya terpanggil.

!

Waktu: 20 menit untuk Tugas 1 + 2. Ini tugas penilaian sesi 12 — mesin dibuat di atas, dipakai di bawah.

Tantangan terakhir — mesin yang menjawab True/False & suhu

Challenge · Cek genap & konversi suhu

Misi A — wasit genap/ganjil
cek_genap(7) -> False
cek_genap(8) -> True

Bikin cek_genap(angka) yang return hasil cek: habis dibagi 2 atau tidak. Petunjuk: operator % dari Sesi 06 — angka % 2 sisa baginya. Fungsi ini return boolean — bisa langsung masuk if.

Misi B — terjemah suhu
konversi_suhu(0) -> 32.0
konversi_suhu(32) -> 89.6
konversi_suhu(100) -> 212.0

Bikin konversi_suhu(celsius) — rumus Celsius ke Fahrenheit: celsius * 9 / 5 + 32. Cek: 0°C harus 32°F, 100°C harus 212°F.

Waktu 15 menit · dua misi sekali jalan. Alat lama: %, rumus, return — dirakit jadi dua mesin baru.
Gimana cara menyelesaikannya?

Pembahasan Challenge — kode lengkap

Solusi A — wasit genap/ganjil
def cek_genap(angka):
    return angka % 2 == 0

print(cek_genap(7))    # False
print(cek_genap(8))    # True
if cek_genap(10):
    print("boleh tim")  # masuk tim

Kunci: return boolean — langsung sah dipakai di if. Bandingkan dulu (% 2 == 0), baru kirim jawabannya.

Solusi B — terjemah suhu
def konversi_suhu(celsius):
    return celsius * 9 / 5 + 32

print(konversi_suhu(0))    # 32.0
print(konversi_suhu(100))  # 212.0

Uji dengan angka yang kamu tahu jawabannya: 0°C = 32°F. Kalau hasil meleset — rumusnya, bukan mesinnya. Debugging itu uji satu kasus dulu.

!

Bonus gabungan (buat yang cepat): loop list nilai dari Sesi 11 — for angka in rekap: print(angka, status_nilai(angka)). Satu mesin dipanggil berkali-kali — inilah reuse.

Mesin nggak nyala? Mungkin kamu kena salah satu ini

Kotak masalah — 3 jebakan fungsi

Jebakan 01
NameError — dipanggil sebelum dibuat
print(luas(8, 5))   # dipanggil duluan

def luas(p, l):
    return p * l
# NameError: name 'luas' is not defined

Mesinnya belum dirakit, sudah disuruh nyala. Python membaca file dari atas — def harus dieksekusi dulu, panggilan belakangan.

Jebakan 02
Lupa return — hasil jadi None
def luas(p, l):
    print(p * l)     # cuma tampil

hasil = luas(8, 5)
print(hasil + 1)
# TypeError: + antara None dan int

print tampil lalu lenyap — hasil menangkap None. Ganti jadi return — kopi diserahkan, bukan cuma ditunjukkan.

Jebakan 03
Kotak masukan kosong
def luas(p, l):
    return p * l

luas()   # mesin nyala tanpa buah
# TypeError: missing 2 required
# positional arguments: 'p', 'l'

Blender dinyalakan tanpa buah. Jumlah argument harus sama dengan jumlah parameter — atau beri default di parameter terakhir.

Error itu alarm posisi, bukan vonis — dua jebakan teratas adalah masalah urutan, bukan kecerdasan. Jangan cari solusi instan: baca pesannya, tanya "mesinnya sudah dibuat? kotaknya sudah diisi?" — itu latihan debugging yang bikin kamu naik level.

Rangkuman — yang kita bawa pulang

5 poin hari ini — mesin dikuasai

01
def nama(parameter): = merakit mesin — baru jalan saat dipanggil nama(argument)
02
Parameter di definisi (kotak berlabel) · argument di panggilan (nilai beneran) — urutan pengisian mengikuti kotak
03
return menyerahkan nilai — bisa disimpan & dihitung lagi · print cuma tampil lalu lenyap → None
04
Parameter default = nilai cadangan — kotak kosong tetap bikin mesin jalan: def sapa(nama="teman"):
05
Modular = 1 fungsi 1 tanggung jawab — mesin kecil dirakit jadi program besar, reuse tanpa copy-paste
Mesin dikuasai — program bisa dirakit Next → String Manipulation
Next — langkah selanjutnya

Minggu depan:
String Manipulation

Sesi 13 — String Manipulation

Mesin hari ini kerja di angka —
minggu depan alat sama dipakai di teks: nama.strip().title()

Bersihkan input user, ubah huruf, pecah kalimat — bekal fitur wajib Mini Project 2. Siap-siap kaget: string itu immutable — nama.upper() tidak mengubah nama!

upper · lowerstrip · splitf-string
PR iseng (opsional)
  • Bikin fungsi.py isi 3 fungsi: sapa, cek_genap, konversi_suhu — panggil semua di bawahnya
  • Refactor tugas List minggu lalu: bungkus hitung rata-rata jadi def rata_rata(nilai):
  • Tidak ada laptop? Tulis 3 definisi fungsi di kertas — minggu depan ketik bareng
Sampai jumpa di Sesi 13! ingat: return bukan print