Bagian Sepuluh: Enam Daftar Sepuluh Butir
Anda sudah sampai di ujung perjalanan, dan ini hadiah kecilnya: enam daftar pendek, masing-masing tepat sepuluh butir, yang enak dibaca ulang kapan saja, bahkan sambil menunggu kopi dingin. Tidak ada yang baru secara konsep; semuanya dipetik dari bab-bab sebelumnya, dengan nomor bab supaya Anda bisa kembali ke penjelasan lengkapnya.
Semua skrip bagian ini ada di folder kode/bab70/. Di versi web, Anda juga bisa mengunduh semuanya sekaligus (zip).
Daftar 1: Sepuluh kesalahan pemula Python, dan cara menghindarinya
Semuanya adalah jebakan nyata dari Bab 4 sampai 13. Skrip berikut sengaja melakukan kesalahan itu satu per satu dan menangkap error-nya, supaya Anda melihat pesan aslinya tanpa program berhenti.
01_kesalahan_pemula.py
# Bagian Sepuluh - Sepuluh kesalahan pemula, ditangkap supaya pesannya terlihat
def coba(nomor, aksi):
try:
hasil = aksi()
print(f"{nomor:>2}. tidak error, hasil = {hasil!r}")
except Exception as e:
print(f"{nomor:>2}. {type(e).__name__}: {e}")
def hitung_tanpa_return(pagi_kg, sore_kg):
pagi_kg + sore_kg
def jumlahkan():
total_kg = 1 + 2
bobot_teks = "500" # seperti hasil input(): selalu teks
pohon = {"jenis": "Jati", "diameter_cm": 32.5}
coba(1, lambda: prnt("halo")) # Bab 4
coba(2, lambda: bobot_teks + 10) # Bab 5
coba(3, lambda: compile("if bobot = 500:\n pass", "<contoh>", "exec")) # Bab 6
coba(4, lambda: 0.1 + 0.2 == 0.3) # Bab 6
coba(5, lambda: compile("if True:\nprint('x')", "<contoh>", "exec")) # Bab 7
coba(6, lambda: list(range(0, 1.5))) # Bab 8
coba(7, lambda: pohon["tinggi_m"]) # Bab 9
coba(8, lambda: hitung_tanpa_return(10, 5)) # Bab 10
coba(9, lambda: (jumlahkan(), total_kg)) # Bab 10
coba(10, lambda: open("data_tidak_ada.txt", encoding="utf-8")) # Bab 13 1. NameError: name 'prnt' is not defined
2. TypeError: can only concatenate str (not "int") to str
3. SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='? (<contoh>, line 1)
4. tidak error, hasil = False
5. IndentationError: expected an indented block after 'if' statement on line 1 (<contoh>, line 2)
6. TypeError: 'float' object cannot be interpreted as an integer
7. KeyError: 'tinggi_m'
8. tidak error, hasil = None
9. NameError: name 'total_kg' is not defined
10. FileNotFoundError: [Errno 2] No such file or directory: 'data_tidak_ada.txt'
| No | Kesalahan | Pesan yang muncul | Cara menghindari | Bab |
|---|---|---|---|---|
| 1 | Salah ketik nama (prnt) |
NameError |
periksa ejaan; traceback lengkap sering menyarankan nama yang mirip | 4, 5 |
| 2 | Menganggap input() memberi angka |
TypeError (teks + angka) |
ubah dengan int() atau float() |
5 |
| 3 | Memakai = padahal maksudnya == |
SyntaxError |
= menyimpan, == membandingkan |
6 |
| 4 | Membandingkan desimal dengan == |
False untuk 0.1 + 0.2 == 0.3 |
bandingkan dengan toleransi atau bulatkan | 6 |
| 5 | Lupa menjorok setelah if |
IndentationError |
menjorok empat spasi, konsisten | 7 |
| 6 | range() dengan angka desimal |
TypeError |
range hanya bilangan bulat |
8 |
| 7 | Meminta label yang tidak ada di dict | KeyError |
cek dulu dengan in atau pakai .get() |
9 |
| 8 | Lupa return |
hasilnya diam-diam None |
periksa: apakah fungsi mengembalikan nilai? | 10 |
| 9 | Memakai variabel lokal dari luar fungsi | NameError |
return hasilnya, tangkap di luar |
10 |
| 10 | Membuka berkas yang tidak ada | FileNotFoundError |
periksa jalur dengan pathlib, tangani dengan try |
13 |
Dua baris perlu dicermati: nomor 4 dan 8 tidak menghasilkan error sama sekali, dan justru itu yang paling licin. Python hanya diam dan memberi jawaban yang salah.
Daftar 2: Sepuluh kebiasaan yang membuat kode rapi dan aman
- Beri nama yang menjelaskan.
hitung_biomassalebih baik daripadah. Ikuti PEP 8 dan biarkanruffmemeriksa (Bab 19). - Satu fungsi, satu tugas, dan jangan memakai list kosong sebagai nilai bawaan (lihat contoh di bawah) (Bab 10).
- Buka berkas dengan
withdan tulisencoding="utf-8"secara eksplisit (Bab 13). - Satu environment per proyek, dengan dependensi tercatat (Bab 17).
- Tulis tes untuk hal yang penting, jalur sukses dan jalur gagal (Bab 18).
- Pakai type hint dan validasi data masuk dengan Pydantic (Bab 33, 34).
- Tangkap error yang spesifik, jangan
except:kosong, dan catat denganlogging(Bab 12). - Simpan rahasia di variabel lingkungan, bukan di kode; masukkan berkas rahasia ke
.gitignore(Bab 20, 49). - Pakai parameter pada perintah SQL, jangan menyambung teks pengguna (Bab 24, 49).
- Commit kecil dengan pesan yang jelas, dan baca ulang sebelum mengirim (Bab 20).
Tiga di antaranya (butir 2, 8, 9) bisa dibuktikan dengan skrip pendek:
02_tiga_kebiasaan.py
# Bagian Sepuluh - Tiga kebiasaan aman, dibuktikan dengan contoh
import os
import sqlite3
# 1. Jangan menyambung teks pengguna ke dalam perintah SQL; pakai parameter (?).
db = sqlite3.connect(":memory:")
db.execute("CREATE TABLE petugas (nama TEXT, peran TEXT)")
db.executemany("INSERT INTO petugas VALUES (?, ?)", [("Sari", "admin"), ("Budi", "tamu")])
masukan = "x' OR '1'='1" # isian jahil
rawan = db.execute(f"SELECT * FROM petugas WHERE nama = '{masukan}'").fetchall()
aman = db.execute("SELECT * FROM petugas WHERE nama = ?", (masukan,)).fetchall()
print("disambung langsung ->", len(rawan), "baris bocor")
print("pakai parameter ->", len(aman), "baris bocor")
# 2. Jangan memberi nilai bawaan berupa list kosong.
def tambah_buruk(item, daftar=[]):
daftar.append(item)
return daftar
def tambah_baik(item, daftar=None):
daftar = [] if daftar is None else daftar
daftar.append(item)
return daftar
tambah_buruk("A")
print("buruk, panggilan kedua:", tambah_buruk("B"))
tambah_baik("A")
print("baik, panggilan kedua: ", tambah_baik("B"))
# 3. Rahasia dibaca dari variabel lingkungan, tidak ditulis di kode.
kunci = os.environ.get("KUNCI_API_CONTOH")
print("kunci diatur:", "ya (tidak ditampilkan)" if kunci else "tidak; berhenti dengan pesan yang jelas")disambung langsung -> 2 baris bocor
pakai parameter -> 0 baris bocor
buruk, panggilan kedua: ['A', 'B']
baik, panggilan kedua: ['B']
kunci diatur: tidak; berhenti dengan pesan yang jelas
Pada baris pertama, teks jahil x' OR '1'='1 membocorkan 2 baris bila disambung langsung ke SQL, tetapi 0 baris bila lewat parameter. Pada bagian kedua, tambah_buruk mengingat isi dari pemanggilan sebelumnya (['A', 'B']) karena list kosong bawaan dibuat sekali saja; tambah_baik selalu mulai segar. Pada bagian ketiga, kunci tidak ada di lingkungan komputer ini, dan skrip menyatakannya terus terang tanpa menampilkan apa pun.
Jangan pernah menempelkan kunci API, kata sandi, atau token ke dalam kode, contoh, atau pesan. Bila sudah terlanjur terunggah ke repositori, anggap kunci itu bocor dan ganti (Bab 49).
Daftar 3: Sepuluh pustaka Python yang wajib dikenal
Dipilih dari yang dipakai di buku ini. Skrip berikut memeriksa apakah kesepuluhnya terpasang di komputer yang membangun buku ini.
03_pustaka_terpasang.py
# Bagian Sepuluh - Sepuluh pustaka yang wajib dikenal: apakah terpasang di sini?
from importlib.util import find_spec
PUSTAKA = [
("numpy", "numpy", 23),
("pandas", "pandas", 23),
("matplotlib", "matplotlib", 25),
("requests", "requests", 21),
("SQLAlchemy", "sqlalchemy", 24),
("pytest", "pytest", 18),
("Pydantic", "pydantic", 34),
("FastAPI", "fastapi", 36),
("GeoPandas", "geopandas", 38),
("scikit-learn", "sklearn", 25),
]
for nama, modul, bab in PUSTAKA:
ada = find_spec(modul) is not None
print(f"{nama:<13} (Bab {bab}): {'terpasang' if ada else 'TIDAK terpasang'}")numpy (Bab 23): terpasang
pandas (Bab 23): terpasang
matplotlib (Bab 25): terpasang
requests (Bab 21): terpasang
SQLAlchemy (Bab 24): terpasang
pytest (Bab 18): terpasang
Pydantic (Bab 34): terpasang
FastAPI (Bab 36): terpasang
GeoPandas (Bab 38): terpasang
scikit-learn (Bab 25): terpasang
| No | Pustaka | Fungsi singkat | Bab asal |
|---|---|---|---|
| 1 | numpy | larik angka dan hitungan cepat | 23 |
| 2 | pandas | tabel data (DataFrame), baca/tulis, agregasi | 23 |
| 3 | matplotlib | grafik | 25 |
| 4 | requests | mengambil data lewat HTTP/API | 21 |
| 5 | SQLAlchemy | bicara dengan basis data lewat Python | 24 |
| 6 | pytest | tes otomatis | 18 |
| 7 | Pydantic | validasi data dan pengaturan | 34 |
| 8 | FastAPI | membuat API web | 36 |
| 9 | GeoPandas | data spasial (peta) bergaya pandas | 38 |
| 10 | scikit-learn | machine learning klasik | 25, 54 |
Calon nomor sebelas yang juga layak dikenal: Polars dan DuckDB (Bab 50), Rasterio (Bab 39), dan PyTorch (Bab 55).
Daftar 4: Sepuluh sumber data gratis untuk kehutanan, pertanian, perikanan, dan peternakan
Cara kami memeriksa. Pada 10 Oktober 2026, kami membuka halaman resmi tiap sumber, mencatat apa yang tertulis di sana, dan bila halaman menyebut syarat atau lisensi, kami salin intinya. Skrip 04_periksa_tautan.py juga memastikan tiap alamat menjawab “200” (ada). Sumber yang tidak bisa kami buka atau baca tidak dimasukkan.
== Sumber data ==
200 FAOSTAT
200 Syarat pemakaian basis data FAO
200 Global Forest Watch (portal data)
200 NASA FIRMS (titik api)
200 NASA POWER (cuaca dan iklim)
200 SoilGrids (tanah)
200 Copernicus Data Space (Sentinel)
200 CHIRPS (curah hujan)
200 Global Fishing Watch (API)
200 FAO Gridded Livestock of the World
200 Satu Data Indonesia
200 BMKG Data Online
12 dari 12 menjawab 200 (ada)
== Sumber belajar ==
200 Tutorial Python resmi
200 Panduan pemula python.org
200 Exercism: jalur Python
200 HOWTO resmi Python
200 Apa yang Baru di Python
200 Unduh Python
200 Panduan pengguna pandas
200 Panduan pengguna scikit-learn
200 Tutorial FastAPI
200 Dokumentasi GeoPandas
200 Forum Python (Discourse)
200 Python Discord
200 PyCon ID 2026
200 Daftar konferensi PyCon
200 PyVideo
200 Planet Python
16 dari 16 menjawab 200 (ada)
Keluaran di atas diambil sekali (skrip butuh internet; ia tidak dijalankan ulang saat buku dibuat), dan menampilkan 12 alamat sumber data, termasuk satu halaman syarat FAO dan satu butir tambahan BMKG di bawah tabel.
| No | Sumber dan alamat | Yang disediakan (sesuai halaman, dibaca 2026-10-10) | Syarat atau lisensi |
|---|---|---|---|
| 1 | FAOSTAT, https://www.fao.org/faostat/ |
statistik pangan dan pertanian (judul halaman; rincian domain data tidak terbaca dari halaman depan, periksa di situs) | halaman syarat basis data FAO menyatakan CC BY 4.0, kecuali dinyatakan lain pada data tertentu atau data pihak ketiga |
| 2 | Global Forest Watch (portal data terbuka), https://data.globalforestwatch.org/ |
portal data terbuka kehutanan (hanya judul halaman yang terbaca; telusuri set datanya sendiri) | tiap dataset punya lisensinya sendiri (syarat layanan di globalnaturewatch.org/terms/) |
| 3 | NASA FIRMS, https://firms.modaps.eosdis.nasa.gov/ |
titik api dan anomali panas dari MODIS dan VIIRS; data global tiba dalam sekitar 3 jam; unduhan SHP, KML, TXT, layanan WMS; arsip tersedia | halaman depan tidak menyebut lisensi; ada tautan “Acknowledgements & Citation” dan “Disclaimer” yang perlu dibaca |
| 4 | NASA POWER, https://power.larc.nasa.gov/ |
lebih dari 300 parameter surya dan meteorologi; API dan akses data langsung | halaman depan tidak menyebut syarat pemakaian atau sitasi; baca dokumentasi POWER |
| 5 | SoilGrids (ISRIC), https://isric.org/explore/soilgrids |
peta sifat tanah global 250 m, enam kedalaman, dengan ketidakpastian per piksel | CC BY 4.0; catatan: API REST-nya sedang dijeda saat dibaca |
| 6 | Copernicus Data Space Ecosystem, https://dataspace.copernicus.eu/ |
akses gratis ke data misi Sentinel dan data Copernicus lain; bisa dijelajah lewat Copernicus Browser tanpa daftar, akun memberi fitur lebih lengkap | syarat ada di tautan “Terms and conditions” pada situsnya |
| 7 | CHIRPS (curah hujan), https://www.chc.ucsb.edu/data/chirps |
hujan gabungan satelit dan stasiun, 50°LS sampai 50°LU, resolusi 0,05°, 1981 sampai mendekati sekarang | pencipta melepas hak cipta (domain publik, Creative Commons); versi 2 berhenti diproduksi setelah Desember 2026, versi 3 tersedia |
| 8 | Global Fishing Watch (API), https://globalfishingwatch.org/our-apis/ |
upaya penangkapan, identitas kapal, kejadian (pertemuan, singgah, kunjungan pelabuhan), deteksi kapal dan infrastruktur lepas pantai | kunci API gratis lewat akun; wajib menyetujui syarat dan mencantumkan Global Fishing Watch; halaman itu tidak menyebut larangan komersial, tetapi baca syarat lengkapnya |
| 9 | FAO Gridded Livestock of the World, https://www.fao.org/livestock-systems/global-distributions/en/ |
peta sebaran ternak global: kerbau, sapi, ayam, bebek, kuda, kambing, babi, domba; versi keempat, dan set baru 2024 yang selaras dengan data FAOSTAT 2020 | halaman tidak menyebut lisensi; ada tautan “Terms and Conditions” FAO |
| 10 | Satu Data Indonesia, https://data.go.id/ |
portal data resmi pemerintah; saat dibaca tercantum 716.929 dataset dari kementerian dan pemerintah daerah | halaman depan tidak menyebut lisensi; dataset diberi label “Terbuka” atau “Terbatas”; periksa tiap dataset |
Satu butir tambahan yang juga terbuka dan terverifikasi: BMKG Data Online (https://data.bmkg.go.id/) menyediakan prakiraan cuaca tingkat desa/kelurahan untuk tiga hari, data gempa, dan peringatan dini cuaca; halaman itu tidak menyebut format teknis maupun lisensi.
Gratis bukan berarti bebas dipakai untuk apa saja. Banyak halaman depan tidak memuat lisensi; syaratnya ada di halaman lain atau per dataset. Catat sumber, tanggal akses, dan lisensinya (Bab 63) sebelum memakai data untuk laporan atau produk. Buku ini tidak mengunduh data besar dari sumber-sumber ini; contoh di buku memakai data tiruan.
Yang kami buang dari daftar. FishStat FAO (fao.org/fishery/en/fishstat) tidak bisa dibuka saat kami coba (galat server sementara), sehingga belum terverifikasi dan tidak dimasukkan. Beberapa situs lain (misalnya BPS dan GBIF) menolak pemeriksa otomatis kami dengan kode 403; itu belum membuktikan situsnya bermasalah, tetapi karena kami tidak bisa membacanya, kami tidak mencantumkannya. Coba buka sendiri di browser.
Daftar 5: Sepuluh ide proyek lanjutan dari proyek bersambung
Semuanya bisa dimulai dari kerangka Bab 69. Pilih satu, kecilkan cakupannya, selesaikan, baru berikutnya.
| No | Ide | Bahan dari buku |
|---|---|---|
| 1 | Peta titik api dan tutupan hutan untuk satu kabupaten | Bab 38, 40, 51 |
| 2 | Model hasil panen terhadap curah hujan | Bab 27, 54 |
| 3 | Peringatan dini kualitas air kolam dari data sensor | Bab 52, 58 |
| 4 | Kurva pertumbuhan ternak dan usulan ransum hemat biaya | Bab 27, 57, 59 |
| 5 | Mendeteksi dan menghitung pohon dari foto drone | Bab 56, 59 |
| 6 | Asisten tanya-jawab untuk petunjuk teknis (RAG) | Bab 60, 62 |
| 7 | Dasbor lintas sektor untuk penyuluh | Bab 42, 43 |
| 8 | Pipeline harian terjadwal: ambil, validasi, simpan, laporkan | Bab 41, 50 |
| 9 | Layanan pekerja terdistribusi untuk ribuan foto | Bab 66, 67 |
| 10 | Terbitkan paketnya sebagai pustaka dan etalase portofolio | Bab 45, 68 |
Daftar 6: Sepuluh cara terus belajar Python setelah buku ini
Tiap sumber di bawah dibuka dan diperiksa pada 10 Oktober 2026 (lihat keluaran skrip 04_periksa_tautan.py di atas, bagian “Sumber belajar”). Apa yang kami tulis tentang isinya berasal dari halaman itu sendiri bila disebut bertanda “(dibaca)”, dan selainnya baru terbukti ada, isinya belum kami telaah satu per satu.
| No | Cara | Alamat | Catatan |
|---|---|---|---|
| 1 | Baca Tutorial Python resmi | https://docs.python.org/3/tutorial/ |
pengantar untuk orang yang sudah memprogram, dari dasar sampai pustaka standar (dibaca) |
| 2 | Telusuri panduan pemula python.org | https://www.python.org/about/gettingstarted/ |
cara memasang dan daftar sumber belajar, pustaka, dan cara berkontribusi (dibaca) |
| 3 | Latih soal di Exercism | https://exercism.org/tracks/python |
jalur Python gratis, dengan umpan balik otomatis dan mentor (dibaca: 146 latihan dalam 17 konsep) |
| 4 | Pelajari HOWTO resmi per topik | https://docs.python.org/3/howto/ |
halaman ada; isi belum ditelaah |
| 5 | Akrabi dokumentasi pustaka pilihan Anda | pandas: https://pandas.pydata.org/docs/user_guide/; scikit-learn: https://scikit-learn.org/stable/user_guide.html; FastAPI: https://fastapi.tiangolo.com/tutorial/; GeoPandas: https://geopandas.org/en/stable/ |
halaman ada; isi belum ditelaah |
| 6 | Bertanya di forum resmi Python | https://discuss.python.org/ |
forum komunitas dengan kategori antara lain Python Help dan Packaging (dibaca) |
| 7 | Gabung Python Discord | https://www.pythondiscord.com/ |
komunitas daring yang menyambut pemula, dengan saluran bantuan dan acara (dibaca) |
| 8 | Hadiri PyCon Indonesia dan lihat daftar PyCon dunia | https://2026.pycon.id/ dan https://pycon.org/ |
PyCon ID 2026 berlangsung 8-9 Agustus 2026 di Jakarta (dibaca), jadi sudah lewat; cek edisi berikutnya |
| 9 | Tonton rekaman konferensi di PyVideo | https://pyvideo.org/ |
indeks video konferensi Python; saat dibaca memuat sekitar 21.700 ceramah dari 542 acara |
| 10 | Ikuti kabar lewat Planet Python dan Apa yang Baru | https://planetpython.org/ dan https://docs.python.org/3/whatsnew/ |
agregator blog Python (dibaca); catatan fitur tiap versi |
Bonus di luar daftar, dan yang paling ampuh, tidak perlu alamat: buat sesuatu yang Anda butuhkan sendiri, sekecil apa pun, lalu perbaiki sedikit-sedikit.
Halaman web berubah, pindah, dan kadang hilang. Bila sebuah tautan di bagian ini mati saat Anda membukanya, cari nama sumbernya di mesin pencari dan masuklah lewat situs resminya. Bila ada yang bertentangan dengan buku ini, percayai dokumentasi resmi versi terbaru dan periksa nomor versi Anda.
Selamat melanjutkan perjalanan. Kebun Anda baru saja dimulai.