Pendamping Bab 11: Fungsi: Menyusun Bagian Program yang Dapat Digunakan Ulang. Gunakan nomor contoh dan latihan yang sama dengan buku.
Tujuan Belajar
- Mendefinisikan dan memanggil fungsi.
- Membedakan parameter, argumen, dan nilai balik.
- Mengenali lingkup variabel serta dokumentasi fungsi.
Persiapan
Kamu sudah memahami input, percabangan, dan perulangan. Pembahasan inti memakai fungsi dalam satu file; organisasi banyak file diperdalam pada Bab 17.
Program dengan tombol Coba di IDE dapat dijalankan di browser. Untuk program lokal, unduh sumber, ekstrak ZIP, lalu ikuti README.txt.
Pembahasan
11-01 – Apa Itu Fungsi?
Setiap kali kamu ingin nasi goreng, kamu tinggal ikuti "resep" (panggil fungsi) tersebut.
Coba di IDE Unduh Sumberdef sapa():
print("Halo, selamat datang!")
sapa() # Memanggil fungsi
Hasil yang diharapkan:
Halo, selamat datang!Coba ubah: Ubah satu nilai pada contoh, lalu jelaskan pengaruhnya terhadap hasil.
11-02 – Parameter dan Argumen
u berikan saat memanggil fungsi disebut argumen.
Coba di IDE Unduh Sumberdef tambah(a, b):
print("Hasil:", a + b)
tambah(4, 7)
Hasil yang diharapkan:
Hasil: 11Coba ubah: Ubah satu nilai pada contoh, lalu jelaskan pengaruhnya terhadap hasil.
11-03 – Return Value (Nilai Balik)
Tidak semua fungsi hanya melakukan aksi (seperti mencetak sesuatu). Banyak fungsi yang setelah selesai bekerja, akan mengembalikan sebuah nilai ke bagian program yang memanggilnya. Nilai ini disebut *return value* atau nilai balik, dan kita menggunakan kata kunci return untuk menentukannya.
Coba di IDE Unduh Sumberdef kuadrat(x):
return x * x
hasil = kuadrat(5)
print(hasil) # 25
Hasil yang diharapkan:
25Coba ubah: Ubah satu nilai pada contoh, lalu jelaskan pengaruhnya terhadap hasil.
11-04 – Variabel Lokal
Analogi Variabel Lokal: Bayangkan sebuah dapur (fungsi). Peralatan masak dan bahan-bahan yang kamu siapkan khusus di dapur itu (variabel lokal) hanya ada dan digunakan di dapur itu. Orang di ruang tamu (di luar fungsi) tidak tahu dan tidak bisa langsung menggunakan panci spesifik yang ada di dapurmu.
Coba di IDE Unduh Sumberdef halo():
pesan = "Hai, dunia!" # variabel lokal
print(pesan)
halo()
# print(pesan) # Error: 'pesan' tidak dikenali di luar fungsi
Hasil yang diharapkan:
Hai, dunia!Coba ubah: Ubah satu nilai pada contoh, lalu jelaskan pengaruhnya terhadap hasil.
11-05 – Variabel Global
Analogi Variabel Global: Bayangkan sebuah lemari bumbu umum di sebuah rumah (program). Siapa pun yang ada di rumah itu, baik di dapur A (fungsi A) maupun di dapur B (fungsi B), bisa melihat dan menggunakan bumbu dari lemari umum tersebut (variabel global).
Coba di IDE Unduh Sumberpesan = "Halo!"
def tampilkan():
print(pesan)
tampilkan()
Hasil yang diharapkan:
Halo!Coba ubah: Ganti isi pesan dengan teks lain dan bandingkan hasilnya.
11-06 – Mengubah Variabel Global dari Dalam Fungsi
cara default, jika kamu mencoba memberi nilai baru ke variabel dengan nama yang sama seperti variabel global di dalam fungsi, Python akan membuat variabel lokal baru, bukan mengubah variabel globalnya. Jika kamu benar-benar ingin memodifikasi variabel global dari dalam fungsi, kamu harus menggunakan kata kunci global.
Coba di IDE Unduh Sumberangka = 0
def tambah():
global angka
angka += 1
for _ in range(3):
tambah()
print(angka) # Output: 3
Hasil yang diharapkan:
3Coba ubah: Ubah angka dari 0 menjadi 1, lalu prediksi hasilnya.
11-07 – Fungsi dengan Logika dan Perulangan
Perhatikan pemakaian cetak_genap, range pada data contoh dan bandingkan hasilnya dengan nilai awal.
Coba di IDE Unduh Sumberdef cetak_genap(n):
for i in range(n + 1):
if i % 2 == 0:
print(i)
cetak_genap(10)
Hasil yang diharapkan:
0
2
4
6
8
10Coba ubah: Ubah satu nilai pada contoh, lalu jelaskan pengaruhnya terhadap hasil.
11-08 – Fungsi Bersarang (Nested Function)
Analogi Fungsi Bersarang: Bayangkan kamu punya resep utama (fungsi luar), misalnya "Membuat Pesta Makan Malam". Di dalam resep itu, ada sub-resep khusus (fungsi dalam), seperti "Membuat Saus Spesial" yang hanya relevan dan digunakan untuk pesta makan malam tersebut, tidak untuk masakan lain secara umum.
Coba di IDE Unduh Sumberdef luar():
def dalam():
print("Fungsi dalam dipanggil")
dalam()
luar()
Hasil yang diharapkan:
Fungsi dalam dipanggilCoba ubah: Ubah satu nilai pada contoh, lalu jelaskan pengaruhnya terhadap hasil.
11-09 – Argumen Default
Analogi Argumen Default: Saat memesan kopi, jika kamu tidak bilang apa-apa soal gula, barista mungkin akan membuatkannya tanpa gula (nilai default gula=0). Tapi kamu tetap bisa minta, "Kopi, gulanya 2 sendok ya!" (memberikan argumen spesifik).
Coba di IDE Unduh Sumber# nama dan ucapan punya nilai default
def salam(nama="Teman", ucapan="Selamat pagi"):
print(f"{ucapan}, {nama}!")
# Menggunakan argumen yang diberikan
salam("Ayu", "Halo")
# Menggunakan default untuk ucapan: "Selamat pagi, Budi!"
salam("Budi")
# Menggunakan default untuk nama dan ucapan
salam()
Hasil yang diharapkan:
Halo, Ayu!
Selamat pagi, Budi!
Selamat pagi, Teman!Coba ubah: Ubah satu nilai pada contoh, lalu jelaskan pengaruhnya terhadap hasil.
11-10 – Keyword Arguments
Analogi Keyword Arguments: Saat memesan pizza custom, kamu bisa bilang, "Saya mau pizza, ukuran='besar', topping_utama='jamur', pinggiran='keju'." Kamu tidak harus menyebutkannya dalam urutan tertentu, yang penting jelas parameternya (ukuran, topping, pinggiran) dan nilainya.
Coba di IDE Unduh Sumberdef biodata(nama, umur, kota):
print(f"{nama} berusia {umur} tahun dan tinggal di {kota}.")
biodata(nama="Rina", umur=30, kota="Jakarta")
# Urutan tidak masalah dengan keyword arguments
biodata(kota="Bandung", nama="Andi", umur=25)
Hasil yang diharapkan:
Rina berusia 30 tahun dan tinggal di Jakarta.
Andi berusia 25 tahun dan tinggal di Bandung.Coba ubah: Ubah satu nilai pada contoh, lalu jelaskan pengaruhnya terhadap hasil.
11-11 – Fungsi Anonim: Lambda
Analogi Lambda: Bayangkan kamu butuh instruksi super singkat dan cepat, seperti catatan tempel kecil untuk tugas sekali jalan. Misalnya, "Gandakan angka ini!" atau "Ambil huruf pertamanya!". Kamu tidak perlu memberinya nama resmi atau prosedur panjang.
Coba di IDE Unduh Sumber# Fungsi biasa
def kuadrat_biasa(x):
return x * x
# Fungsi lambda yang setara
kuadrat_lambda = lambda x: x * x
print(kuadrat_biasa(6)) # 36
print(kuadrat_lambda(6)) # 36
# Contoh penggunaan umum lambda dengan fungsi lain (misal, sort)
poin = [(1, 2), (3, 1), (5, 4), (2, 0)]
# Sort berdasarkan elemen kedua dari setiap tuple
poin.sort(key=lambda item: item[1])
print(poin) # Output: [(2, 0), (3, 1), (1, 2), (5, 4)]
Hasil yang diharapkan:
36
36
[(2, 0), (3, 1), (1, 2), (5, 4)]Coba ubah: Ubah satu nilai pada poin dan periksa bagian hasil yang ikut berubah.
Studi Kasus
11-12 – Konversi mata uang dengan kurs contoh
Fungsi yang sama dipanggil dengan dua argumen rupiah. Nilai balik dipakai dalam f-string. Kurs disimpan sebagai parameter agar dapat diganti.
Coba di IDE Unduh Sumberdef konversi_ke_usd(rupiah, kurs=15000):
"""Hitung nilai dolar memakai kurs yang diberikan."""
return rupiah / kurs
print(f"USD {konversi_ke_usd(150000):.2f}")
print(f"USD {konversi_ke_usd(300000):.2f}")
Hasil yang diharapkan:
USD 10.00
USD 20.00Coba ubah: Berikan kurs=16000 dan bandingkan hasil konversi.
Rangkuman
Fungsi mengelompokkan pekerjaan dan dapat dipanggil berulang. Parameter menerima argumen; return mengembalikan hasil. Variabel lokal membantu memisahkan data antarbagian program.
Cek Pemahaman
Lima pertanyaan ini sama dengan pertanyaan di buku. Periksa jawaban di kuis untuk melihat skor dan pembahasan.
- Kata kunci untuk mendefinisikan fungsi adalah …
- Apa perbedaan parameter dan argumen?
- Apa fungsi return?
- Variabel yang dibuat di dalam fungsi biasanya …
- Jika fungsi selesai tanpa return yang memberikan nilai, hasilnya …
Latihan Mandiri
Latihan 11-L01 – Fungsi sapaan
Dasar. Buat fungsi sapa(nama) yang mengembalikan Halo, Ayu! ketika dipanggil dengan Ayu.
Kerjakan di IDE Unduh LatihanHasil yang diharapkan:
Halo, Ayu!
Lihat Petunjuk
Gunakan return dalam fungsi dan print di luar.
Lihat Solusi
def sapa(nama):
return f"Halo, {nama}!"
print(sapa("Ayu"))
Fungsi membuat pesan; pemanggil menentukan cara menampilkannya.
Coba Solusi di IDEUnduh SolusiLatihan 11-L02 – Luas persegi panjang
Penerapan. Buat luas(panjang, lebar), lalu cetak hasil untuk panjang 8 dan lebar 5.
Kerjakan di IDE Unduh LatihanHasil yang diharapkan:
40
Lihat Petunjuk
Nilai balik adalah hasil perkalian.
Lihat Solusi
def luas(panjang, lebar):
return panjang * lebar
print(luas(8, 5))
Kedua argumen dihubungkan dengan parameter sesuai urutannya.
Coba Solusi di IDEUnduh SolusiLatihan 11-L03 – Parameter default
Pengembangan. Buat harga_total(harga, jumlah=1). Cetak hasil untuk harga 5000 tanpa jumlah, lalu dengan jumlah 3.
Kerjakan di IDE Unduh LatihanHasil yang diharapkan:
5000
15000
Lihat Petunjuk
Default digunakan jika argumen itu tidak diberikan.
Lihat Solusi
def harga_total(harga, jumlah=1):
return harga * jumlah
print(harga_total(5000))
print(harga_total(5000, jumlah=3))
Argumen keyword menjelaskan parameter yang diisi.
Coba Solusi di IDEUnduh SolusiPengembangan
Modul dan Paket
Prasyarat: kerjakan setelah Bab 17.
Ketika programmu semakin besar, menyimpan semua code dalam satu file akan membuatnya sulit dikelola. Modularisasi adalah praktik memecah program menjadi beberapa file (modul) yang lebih kecil dan terorganisir. Setiap modul biasanya berisi fungsi, kelas, dan variabel yang terkait dengan tugas tertentu.
Kamu bisa menyimpan fungsi-fungsimu dalam sebuah file Python
(misalnya, kalkulator.py). Lalu, kamu bisa mengimpor
fungsi-fungsi tersebut di file Python lainnya (misalnya,
main.py) menggunakan pernyataan import.
Analogi Modularisasi: Bayangkan kamu seorang koki
handal dengan banyak resep (fungsi). – Menyimpan semua resep dalam satu
buku catatan super tebal (satu file besar) akan merepotkan. –
Modularisasi itu seperti kamu mengelompokkan resep-resepmu ke dalam
beberapa buku masak yang lebih kecil berdasarkan kategori: “Buku Resep
Kue”, “Buku Resep Masakan Utama”, “Buku Resep Minuman”. Ini adalah
modul-modul: resep_kue.py, masakan_utama.py. –
Ketika kamu ingin membuat kue, kamu tinggal ambil “Buku Resep Kue”
(import resep_kue) dan menggunakan resep di dalamnya.
Contoh:
File: kalkulator.py
#### Ini adalah modul kalkulator.py
def tambah(a, b):
"""Menjumlahkan dua angka."""
return a + b
def kurang(a, b):
"""Mengurangkan dua angka."""
return a - b
PI = 3.14159 # Contoh variabel dalam modul
File: main.py (dalam direktori yang
sama dengan kalkulator.py)
#### Mengimpor seluruh modul kalkulator
import kalkulator
hasil_tambah = kalkulator.tambah(10, 5)
print(f"Hasil tambah: {hasil_tambah}")
print(f"Nilai PI dari modul: {kalkulator.PI}")
Diagram Berbagai Cara Import Modul
Diagram ini menunjukkan berbagai strategi import dan cara penggunaannya:
flowchart TD
A[kalkulator.py<br/>def tambah a, b<br/>def kurang a, b<br/>PI = 3.14159] --> B{Cara Import?}
B -->|1| C[import kalkulator]
C --> C1[Akses: kalkulator.tambah 10, 5]
B -->|2| D[import kalkulator as kalk]
D --> D1[Akses: kalk.tambah 10, 5]
B -->|3| E[from kalkulator import tambah]
E --> E1[Akses langsung: tambah 10, 5]
B -->|4| F[from kalkulator import tambah as penjumlahan]
F --> F1[Akses: penjumlahan 10, 5]
B -->|5| G[from kalkulator import *<br/>tidak disarankan]
G --> G1[Akses langsung semua<br/>risiko konflik nama]
#### Cara lain: Mengimpor fungsi spesifik dari modul
from kalkulator import kurang
hasil_kurang = kurang(10, 3)
print(f"Hasil kurang: {hasil_kurang}")
#### Cara lain: Mengimpor semua dari modul
#### (kurang disarankan untuk proyek besar karena konflik nama)
#### from kalkulator import *
#### hasil_tambah_lagi = tambah(20, 7)
#### print(f"Hasil tambah lagi: {hasil_tambah_lagi}")
Ini membuat program jadi lebih terorganisir, rapi, dan mudah dikelola. Setiap modul bisa dikembangkan dan diuji secara independen.
Berbagai Cara Import di Python
Selain cara dasar di atas, Python menyediakan beberapa fleksibilitas dalam mengimpor modul dan isinya:
#### Misalkan kita memiliki modul bernama 'kalkulator.py'
#### seperti contoh sebelumnya.
#### 1. Import seluruh modul (cara standar)
#### Kamu perlu menggunakan nama modul sebagai prefix
#### saat memanggil fungsinya.
import kalkulator
hasil_1 = kalkulator.tambah(10, 5)
print(f"Hasil (import standar): {hasil_1}")
#### 2. Import dengan alias (nama samaran)
#### Berguna jika nama modul panjang atau ingin nama
#### yang lebih singkat.
import kalkulator as kalk
hasil_2 = kalk.kurang(10, 3)
print(f"Hasil (import dengan alias 'kalk'): {hasil_2}")
#### 3. Import item spesifik dari modul
#### Kamu bisa langsung menggunakan nama item
#### tanpa prefix modul.
from kalkulator import tambah, PI
hasil_3 = tambah(20, 7)
print(f"Hasil (from kalkulator import tambah): {hasil_3}")
print(f"Nilai PI (from kalkulator import PI): {PI}")
#### 4. Import item spesifik dengan alias
#### Berguna jika ingin mengganti nama item yang diimpor
#### atau menghindari konflik nama.
from kalkulator import tambah as penjumlahan
from kalkulator import kurang as pengurangan
hasil_4 = penjumlahan(100, 50)
hasil_5 = pengurangan(100, 25)
print(f"Hasil (from ... import tambah as penjumlahan):")
print(f" {hasil_4}")
print(f"Hasil (from ... import kurang as pengurangan):")
print(f" {hasil_5}")
#### 5. Import semua item dari modul
#### (gunakan dengan hati-hati!)
#### Mengimpor semua nama dari modul ke dalam
#### namespace saat ini.
#### Ini bisa menyebabkan konflik nama jika modul
#### memiliki nama yang sama dengan yang sudah ada.
#### Umumnya kurang direkomendasikan untuk proyek besar
#### karena mengurangi kejelasan.
#### from kalkulator import *
#### hasil_bintang = tambah(5, 5)
#### print(f"Hasil (from kalkulator import *):")
#### print(f" {hasil_bintang}")
Contoh Struktur Proyek dengan Package
Ketika proyek semakin besar, kamu mungkin ingin mengorganisir modul-modul ke dalam direktori yang disebut package. Package adalah cara untuk menstrukturkan namespace modul Python menggunakan “nama modul bertitik”.
Misalkan struktur proyekmu seperti ini:
proyek_saya/
|-- main_app.py
`-- utils/
|-- __init__.py
|-- matematika.py
`-- format_teks.py
utils/adalah sebuah package karena berisi file__init__.py. File ini bisa kosong, tetapi keberadaannya memberitahu Python bahwa direktoriutilsharus diperlakukan sebagai package.matematika.pydanformat_teks.pyadalah modul di dalam packageutils.
File: utils/matematika.py
#### utils/matematika.py
def kali(a, b):
return a * b
KONSTANTA_MAT = 1.618
File: utils/format_teks.py
#### utils/format_teks.py
def kapital_awal(teks):
return teks.capitalize()
File: main_app.py
#### main_app.py
#### Mengimpor dari modul dalam package
from utils.matematika import kali, KONSTANTA_MAT
from utils.format_teks import kapital_awal
#### Mengimpor seluruh modul dari package
import utils.matematika
import utils.format_teks as ft # dengan alias
angka1 = 10
angka2 = 5
hasil_kali = kali(angka1, angka2)
print(f"Hasil kali ({angka1}x{angka2}): {hasil_kali}")
print(f"Konstanta Matematika: {KONSTANTA_MAT}")
nama = "budi"
nama_kapital = kapital_awal(nama)
print(f"Nama '{nama}' menjadi '{nama_kapital}'")
#### Menggunakan modul yang diimpor dengan alias
#### (jika import utils.matematika)
hasil_kali_lagi = utils.matematika.kali(7, 3)
print(f"Hasil kali lagi: {hasil_kali_lagi}")
nama_lain = "SITI nurhaliza"
#### (jika import utils.format_teks as ft)
nama_lain_kapital = ft.kapital_awal(nama_lain)
print(f"Nama '{nama_lain}' menjadi '{nama_lain_kapital}'")
Tips Penting untuk Import
Prioritaskan Keterbacaan:
import moduldanfrom paket import modulumumnya lebih mudah dibaca dan dipahami daripadafrom modul import *.- Aliasing (
import numpy as np) sangat berguna untuk modul dengan nama panjang atau yang umum digunakan dengan alias tertentu. Namun, jangan membuat alias yang membingungkan.
Penanganan
ImportError: Kadang, modul yang ingin kamu impor mungkin belum terinstal atau tidak ada. Kamu bisa menangani ini dengantry-except:try: import modul_yang_mungkin_tidak_ada except ImportError: print("Modul 'modul_yang_mungkin_tidak_ada'") print("tidak ditemukan.") print("Pastikan sudah terinstal atau di PYTHONPATH.") # Kamu bisa menambahkan logika alternatif # atau keluar dari program # import sys # sys.exit(1)Hindari Circular Imports: Circular import terjadi ketika modul A mengimpor modul B, dan modul B juga mengimpor modul A (secara langsung atau tidak langsung). Ini bisa menyebabkan error atau perilaku tak terduga.
- Solusi: Salah satu cara mengatasinya adalah dengan
memindahkan salah satu
importke dalam fungsi atau metode yang membutuhkannya, bukan di level atas modul. Cara lain adalah dengan merestrukturisasi code untuk menghilangkan ketergantungan timbal balik.
# Contoh circular import yang dihindari # File: modul_a.py # from modul_b import fungsi_b # <-- Potensi circular jika modul_b import modul_a # def fungsi_a(): # print("Fungsi A dijalankan") # fungsi_b() # Solusi: import di dalam fungsi def fungsi_a_solusi(): # Import saat dibutuhkan from modul_b import fungsi_b print("Fungsi A (solusi) dijalankan") fungsi_b()- Solusi: Salah satu cara mengatasinya adalah dengan
memindahkan salah satu
Memahami berbagai cara import dan bagaimana mengelola
struktur proyek dengan package akan sangat membantumu saat membangun
aplikasi Python yang lebih besar dan kompleks.
Kalkulator dengan Modul
Prasyarat: kerjakan setelah Bab 17.
Buat program yang:
- Menampilkan menu operasi: Tambah, Kurang, Kali, Bagi, Keluar
- Menggunakan fungsi untuk setiap operasi
- Menggunakan
whileloop agar pengguna bisa mencoba berulang kali - Menangani kesalahan seperti pembagian dengan nol
Contoh:
def bagi(a, b):
if b == 0:
return "Tidak bisa dibagi nol"
return a / b
Modularisasi
- Simpan semua fungsi ke dalam file
fungsi_operasi.py - Di file utama, gunakan
from fungsi_operasi import ... - Pastikan semua fungsi berjalan dengan baik saat di-import
Referensi dan Materi Pendamping
- Fungsi di Python: def, Parameter, dan Pemanggilan
- return di Python: Mengembalikan Nilai dari Fungsi
- Argumen Default di Python: Parameter Opsional dan Keyword
Langkah Selanjutnya
Bab 12 membahas List dan Tuple: Koleksi Berurutan. Sebelum melanjutkan, pastikan kamu dapat menjelaskan tujuan belajar dan menyelesaikan tiga latihan inti bab ini.
Edisi September 2026. Nomor contoh, pertanyaan, dan latihan digunakan bersama pada buku dan halaman ini.
