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

  1. Beri nama yang menjelaskan. hitung_biomassa lebih baik daripada h. Ikuti PEP 8 dan biarkan ruff memeriksa (Bab 19).
  2. Satu fungsi, satu tugas, dan jangan memakai list kosong sebagai nilai bawaan (lihat contoh di bawah) (Bab 10).
  3. Buka berkas dengan with dan tulis encoding="utf-8" secara eksplisit (Bab 13).
  4. Satu environment per proyek, dengan dependensi tercatat (Bab 17).
  5. Tulis tes untuk hal yang penting, jalur sukses dan jalur gagal (Bab 18).
  6. Pakai type hint dan validasi data masuk dengan Pydantic (Bab 33, 34).
  7. Tangkap error yang spesifik, jangan except: kosong, dan catat dengan logging (Bab 12).
  8. Simpan rahasia di variabel lingkungan, bukan di kode; masukkan berkas rahasia ke .gitignore (Bab 20, 49).
  9. Pakai parameter pada perintah SQL, jangan menyambung teks pengguna (Bab 24, 49).
  10. 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.

PeringatanAWAS

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.

CatatanINGAT

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.

TipTIPS

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.