Lewati ke isi
Profil penulisSeri Buku GIS Kehutanan dan Pertanian/ PY

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.

Ilustrasi 7.1: Fungsi sebagai resep bernama
Skema fungsi ke_hektar: masukan 40000 meter persegi, fungsi membagi dengan 10000, keluaran 4.0 hektare

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 #

PYTHONUnduh berkas
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 bernama ke_hektar dengan satu parameter. Titik dua dan baris yang menjorok mengikuti aturan yang sama seperti if dan for.
  • return meter_persegi / 10000 menghitung hasil dan mengirimkannya kembali.
  • ke_hektar(40000) memanggil fungsi. Angka 40000 adalah argumen. Hasilnya langsung dipakai oleh print.
HASIL
40000 m2 = 4.0 ha
125000 m2 = 12.5 ha

Parameter 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.

PYTHONUnduh berkas
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=2 memberi 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.
HASIL
12.54
12.5437
13.0

Skrip 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.

PYTHONUnduh berkas
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).

HASIL
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.

PYTHONUnduh berkas
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 "diberi p, kembalikan isi nomor 1 dari p", yaitu luasnya.
  • key= memberi tahu max atau sorted kriteria apa yang dipakai untuk membandingkan.
  • Tanda minus pada -p[1] membalik urutan, sehingga yang terbesar di depan.
HASIL
('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):

PYTHONUnduh berkas
# 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.

BarisTulisanArtinya
1# 5. Fungsi: ...Komentar.
2def ke_hektar(meter_persegi):Buat fungsi bernama ke_hektar. Ia menerima satu bahan bernama meter_persegi.
3return meter_persegi / 10000Bagi bahan dengan 10000, lalu kembalikan hasilnya.
6print("40000 m2 =", ke_hektar(40000), "ha")Panggil fungsi dengan argumen 40000, lalu tampilkan hasilnya di tengah kalimat.

Hasil.

HASIL
40000 m2 = 4.0 ha

Bagian yang boleh diubah.

  • Isi hitungan (baris 3): ganti 10000 untuk satuan lain. Contoh: / 1000000 untuk kilometer persegi.
  • Nama fungsi dan parameter (baris 2): boleh diganti, asal semua pemanggilnya ikut diganti.
  • Argumen (baris 6): ganti 40000 dengan luas lain, atau panggil berkali-kali.

Jebakan.

  • Argumen kurang. Memanggil ke_hektar() tanpa isi menghasilkan TypeError: ke_hektar() missing 1 required positional argument: 'meter_persegi'.
  • Lupa return. Fungsi tanpa return mengembalikan None (artinya "tidak ada nilai"). Hasil print akan berbunyi None.
  • Memanggil sebelum membuat. Fungsi harus dibuat (def) di baris yang lebih atas daripada tempat dipanggil.
  • Mencampur teks dengan angka. "luas: " + ke_hektar(40000) menghasilkan TypeError: can only concatenate str (not "float") to str. Pakai koma di print, atau ubah angka ke teks dengan str(...).

Latihan variasi. Tulis fungsi ke_meter_persegi(hektare) yang kebalikannya, lalu coba dengan 4 hektare.

Contoh jawaban:

PYTHONUnduh berkas
def ke_meter_persegi(hektare):
    return hektare * 10000


print("4 ha =", ke_meter_persegi(4), "m2")
HASIL
4 ha = 40000 m2

Cek paham #

  1. Apa beda parameter dan argumen?
  2. Mengapa fungsi dengan return lebih berguna daripada yang hanya print?
  3. Apa yang ditampung **param?

Jawaban.

  1. Parameter adalah nama bahan saat fungsi dibuat. Argumen adalah nilai sungguhan saat fungsi dipanggil.
  2. Hasil yang dikembalikan bisa dipakai lagi untuk perhitungan atau disimpan. Hasil print hanya tampil di layar.
  3. Semua argumen bernama yang tidak punya parameter sendiri, dalam bentuk kamus.

Kesalahan umum #

  • Menulis def tetapi tidak pernah memanggilnya. Perbaikan: panggil fungsi dengan nama dan tanda kurung.
  • Menaruh print padahal butuh return. Perbaikan: pakai return bila hasilnya mau dipakai lagi.
  • Lupa menjorok isi fungsi. Perbaikan: empat spasi, sama seperti if dan for.

Ringkasan dan latihan #

  • Fungsi adalah resep bernama: def nama(parameter): lalu isi yang menjorok.
  • return mengembalikan hasil. Parameter boleh punya nilai bawaan.
  • **param menampung argumen bernama dalam kamus. lambda adalah 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 #

HalFungsi deflambda
NamaAdaTidak ada
PanjangBeberapa barisSatu baris
Cocok untukResep yang dipakai berulangKriteria pendek, misalnya key=