BAB 7: Resep Bernama: Fungsi
Studi kasus: "Meter persegi ke hektare, lagi dan lagi" #
Data dari lapangan selalu dalam meter persegi, tetapi Kepala Seksi hanya mau melihat hektare. Anda menulis luas / 10000 di belasan tempat. Lalu Kepala Seksi mengubah aturan: pembulatan dua desimal. Anda harus mencari dan mengubah belasan baris itu. Ada cara yang lebih cerdas: tulis satu resep bernama, lalu panggil namanya di mana pun dibutuhkan.
Konsep: fungsi dalam tiga kalimat #
Sebuah fungsi adalah resep yang diberi nama: Anda memberinya bahan, ia mengerjakan langkah-langkahnya, lalu mengembalikan hasil. Bayangkan mesin pengubah satuan: masukkan 40.000 meter persegi, keluar 4,0 hektare. Anda menulis resepnya satu kali, memanggilnya berkali-kali, dan bila aturan berubah, Anda hanya mengubah satu tempat.

Istilah baru di bagian ini:
- Fungsi: resep bernama, dibuat dengan kata
def. - Parameter: nama bahan yang diterima fungsi, ditulis di dalam kurung saat fungsi dibuat.
- Argumen: bahan sungguhan yang Anda berikan saat memanggil fungsi.
return: perintah untuk mengembalikan hasil ke pemanggil.
Membuat dan memanggil fungsi #
def ke_hektar(meter_persegi):
return meter_persegi / 10000
print("40000 m2 =", ke_hektar(40000), "ha")
print("125000 m2 =", ke_hektar(125000), "ha")Penjelasannya:
def ke_hektar(meter_persegi):membuat fungsi bernamake_hektardengan satu parameter. Titik dua dan baris yang menjorok mengikuti aturan yang sama sepertiifdanfor.return meter_persegi / 10000menghitung hasil dan mengirimkannya kembali.ke_hektar(40000)memanggil fungsi. Angka40000adalah argumen. Hasilnya langsung dipakai olehprint.
40000 m2 = 4.0 ha
125000 m2 = 12.5 haParameter bawaan dan docstring #
Parameter boleh punya nilai bawaan. Bila pemanggil tidak memberi nilainya, nilai bawaan dipakai. Tepat di bawah def, Anda boleh menulis docstring: catatan tiga tanda kutip yang menjelaskan fungsi.
def ke_hektar(meter_persegi, desimal=2):
"""Mengubah meter persegi menjadi hektare, dibulatkan sesuai desimal."""
return round(meter_persegi / 10000, desimal)
print(ke_hektar(125437))
print(ke_hektar(125437, 4))
print(ke_hektar(meter_persegi=125437, desimal=0))Penjelasannya:
desimal=2memberi nilai bawaan dua desimal.- Pemanggilan pertama tidak memberi
desimal, jadi dipakai nilai bawaan. - Pemanggilan kedua memberi
4, dan menggantikan nilai bawaan. - Pemanggilan ketiga menyebut nama parameter (
meter_persegi=...). Cara ini disebut argumen bernama, membuat panggilan lebih mudah dibaca.
12.54
12.5437
13.0Skrip Buku B2 b2_05_kalkulasi.py memakai pola yang sama: fungsi tambah(lyr, nama, tipe, rumus, panjang=0, presisi=0) punya dua parameter bawaan dan satu docstring.
Menerima argumen bernama sebanyak apa pun: kwargs #
Kadang fungsi harus meneruskan banyak pilihan yang berbeda-beda ke perkakas lain. Awalan ** pada parameter menampung semua argumen bernama ke dalam sebuah kamus.
def jalankan(nama_alat, **param):
print("Alat:", nama_alat)
print("Pilihan:", param)
jalankan("buffer", INPUT="sungai", JARAK=50)Penjelasannya: **param menangkap INPUT="sungai" dan JARAK=50 ke dalam kamus param. Nama param bebas, tetapi kebiasaannya kwargs (singkatan keyword arguments).
Alat: buffer
Pilihan: {'INPUT': 'sungai', 'JARAK': 50}Skrip Buku B2 b2_04_topologi.py memakai pola ini: def jalankan(alg, **param): return processing.run(alg, param). Fungsi kecil itu hanya meneruskan pilihan ke alat QGIS.
Fungsi tanpa nama: lambda #
Kadang Anda butuh fungsi sangat pendek, dipakai sekali saja. Lambda adalah fungsi satu baris tanpa nama.
petak = [("P-01", 4.0), ("P-02", 8.0), ("P-03", 2.5)]
terbesar = max(petak, key=lambda p: p[1])
print(terbesar)
urut = sorted(petak, key=lambda p: -p[1])
print([kode for kode, ha in urut])Penjelasannya:
lambda p: p[1]berarti "diberip, kembalikan isi nomor 1 darip", yaitu luasnya.key=memberi tahumaxatausortedkriteria apa yang dipakai untuk membandingkan.- Tanda minus pada
-p[1]membalik urutan, sehingga yang terbesar di depan.
('P-02', 8.0)
['P-02', 'P-01', 'P-03']Pola max(..., key=lambda x: x["VOL_HA"]) dan sorted(..., key=lambda x: -x["VOL_HA"]) Anda temui di skrip Buku B2 untuk mencari petak bervolume tertinggi.
Skrip yang dibedah: fungsi di b1_00 #
Tujuan. Mengubah satuan luas lewat sebuah fungsi.
Bahan. Tidak ada. Skrip ini tidak memakai QGIS.
Skrip (bagian kelima):
# 5. Fungsi: resep yang diberi nama supaya bisa dipakai berulang kali
def ke_hektar(meter_persegi):
return meter_persegi / 10000
print("40000 m2 =", ke_hektar(40000), "ha")Penjelasan baris demi baris. Nomor baris dihitung dari potongan di atas.
| Baris | Tulisan | Artinya |
|---|---|---|
| 1 | # 5. Fungsi: ... | Komentar. |
| 2 | def ke_hektar(meter_persegi): | Buat fungsi bernama ke_hektar. Ia menerima satu bahan bernama meter_persegi. |
| 3 | return meter_persegi / 10000 | Bagi bahan dengan 10000, lalu kembalikan hasilnya. |
| 6 | print("40000 m2 =", ke_hektar(40000), "ha") | Panggil fungsi dengan argumen 40000, lalu tampilkan hasilnya di tengah kalimat. |
Hasil.
40000 m2 = 4.0 haBagian yang boleh diubah.
- Isi hitungan (baris 3): ganti
10000untuk satuan lain. Contoh:/ 1000000untuk kilometer persegi. - Nama fungsi dan parameter (baris 2): boleh diganti, asal semua pemanggilnya ikut diganti.
- Argumen (baris 6): ganti
40000dengan luas lain, atau panggil berkali-kali.
Jebakan.
- Argumen kurang. Memanggil
ke_hektar()tanpa isi menghasilkanTypeError: ke_hektar() missing 1 required positional argument: 'meter_persegi'. - Lupa
return. Fungsi tanpareturnmengembalikanNone(artinya "tidak ada nilai"). Hasilprintakan berbunyiNone. - Memanggil sebelum membuat. Fungsi harus dibuat (
def) di baris yang lebih atas daripada tempat dipanggil. - Mencampur teks dengan angka.
"luas: " + ke_hektar(40000)menghasilkanTypeError: can only concatenate str (not "float") to str. Pakai koma diprint, atau ubah angka ke teks denganstr(...).
Latihan variasi. Tulis fungsi ke_meter_persegi(hektare) yang kebalikannya, lalu coba dengan 4 hektare.
Contoh jawaban:
def ke_meter_persegi(hektare):
return hektare * 10000
print("4 ha =", ke_meter_persegi(4), "m2")4 ha = 40000 m2Cek paham #
- Apa beda parameter dan argumen?
- Mengapa fungsi dengan
returnlebih berguna daripada yang hanyaprint? - Apa yang ditampung
**param?
Jawaban.
- Parameter adalah nama bahan saat fungsi dibuat. Argumen adalah nilai sungguhan saat fungsi dipanggil.
- Hasil yang dikembalikan bisa dipakai lagi untuk perhitungan atau disimpan. Hasil
printhanya tampil di layar. - Semua argumen bernama yang tidak punya parameter sendiri, dalam bentuk kamus.
Kesalahan umum #
- Menulis
deftetapi tidak pernah memanggilnya. Perbaikan: panggil fungsi dengan nama dan tanda kurung. - Menaruh
printpadahal butuhreturn. Perbaikan: pakaireturnbila hasilnya mau dipakai lagi. - Lupa menjorok isi fungsi. Perbaikan: empat spasi, sama seperti
ifdanfor.
Ringkasan dan latihan #
- Fungsi adalah resep bernama:
def nama(parameter):lalu isi yang menjorok. returnmengembalikan hasil. Parameter boleh punya nilai bawaan.**parammenampung argumen bernama dalam kamus.lambdaadalah fungsi satu baris.
Latihan. Tulis fungsi kategori(luas_ha) yang mengembalikan "besar" bila lebih dari 5 hektare, "sedang" bila lebih dari 2, dan "kecil" bila tidak. Uji dengan tiga angka berbeda.
Tabel perbandingan: fungsi biasa dan lambda #
| Hal | Fungsi def | lambda |
|---|---|---|
| Nama | Ada | Tidak ada |
| Panjang | Beberapa baris | Satu baris |
| Cocok untuk | Resep yang dipakai berulang | Kriteria pendek, misalnya key= |