September 28, 2026
Dasar Python untuk Developer.
Python 3.14 untuk developer yang datang dari bahasa lain: venv & pip, struktur proyek, tipe data, f-string, comprehension, fungsi, dan modul.
Catatan ini ditulis untuk developer yang sudah bisa bahasa lain (PHP, JavaScript) dan ingin cepat produktif di Python. Contoh-contohnya diambil dari proyek skripsi saya, Price Prediction System — pipeline ETL harga beras Jawa Timur yang berakhir di dashboard Streamlit. Versi acuan: Python 3.14 (rilis stabil terbaru saat ini 3.14.x).
1. Instalasi & Virtual Environment
Jangan pernah pip install ke Python sistem. Setiap proyek punya virtual environment (venv) sendiri, sehingga versi library antar proyek tidak bentrok.
python3 --version # pastikan 3.11+ (pandas 3 butuh >= 3.11)
python3 -m venv .venv # buat venv di folder proyek
source .venv/bin/activate # macOS/Linux
# .venv\Scripts\activate # Windows (PowerShell/cmd)
python -m pip install --upgrade pip
pip install pandas streamlit sqlalchemy pymysql python-dotenv
pip freeze > requirements.txt # kunci dependensi
pip install -r requirements.txt # pasang ulang di mesin lain
deactivate # keluar dari venv
Kalau belum terbiasa dengan terminal, baca dulu Pengantar Command Line .
| Perintah | Fungsi |
|---|---|
python -m venv .venv | Membuat environment terisolasi |
pip install x | Memasang paket dari PyPI |
pip list / pip show x | Melihat paket terpasang / detail paket |
pip freeze | Mencetak versi persis semua paket |
python -m modul | Menjalankan modul sebagai skrip (pakai sys.path proyek) |
Tips: tambahkan
.venv/dan__pycache__/ke.gitignore. Yang di-commit cukuprequirements.txt(ataupyproject.toml).
2. Struktur Proyek
Struktur proyek skripsi saya (disederhanakan) — setiap folder berisi __init__.py sehingga bisa di-import sebagai package:
price-prediction/
├── .env # kredensial DB — JANGAN di-commit
├── requirements.txt
├── config/settings.py # baca .env → konstanta
├── database/connection.py
├── etl/ # extract.py, transform.py, load.py, run_etl.py
├── analytics/daily/ # stats.py, outlier.py, ...
└── app/ # Streamlit: Home.py + pages/
Konfigurasi dibaca dari environment, bukan di-hardcode:
# config/settings.py
import os
from dotenv import load_dotenv
load_dotenv() # baca file .env di root proyek
DB_HOST = os.getenv("DB_HOST", "127.0.0.1")
DB_PORT = int(os.getenv("DB_PORT", "3306"))
DB_NAME = os.getenv("DB_NAME", "harga_komoditas")
DB_USER = os.getenv("DB_USER", "root")
DB_PASSWORD = os.getenv("DB_PASSWORD", "")
Jalankan modul dari root proyek dengan python -m etl.run_etl, bukan python etl/run_etl.py — cara kedua membuat import config gagal karena root proyek tidak masuk sys.path.
3. Tipe Data Inti
Python bertipe dinamis tapi kuat: "1" + 1 error, tidak otomatis dikonversi seperti di JavaScript.
| Tipe | Contoh | Mutable? | Catatan |
|---|---|---|---|
int | 15000 | tidak | presisi tak terbatas |
float | 0.5 | tidak | IEEE 754, hati-hati untuk uang |
str | "Beras Medium" | tidak | Unicode |
bool | True, False | tidak | huruf kapital |
None | None | — | setara null |
list | [1, 2, 3] | ya | array dinamis |
tuple | ("3507", 27) | tidak | cocok untuk data tetap |
dict | {"kota": "Malang"} | ya | urutan insert dipertahankan |
set | {"SES", "DES"} | ya | unik, tanpa urutan |
harga = [15200, 15300, None, 15450]
kota = {"kode": "3507", "nama": "Kab. Malang"}
kota["provinsi"] = "Jawa Timur" # tambah key
print(kota.get("pulau", "-")) # aman bila key tidak ada
kode, jumlah = ("3507", 27) # unpacking
valid = [h for h in harga if h is not None]
print(len(valid), sum(valid) / len(valid))
Truthiness: 0, "", [], {}, dan None bernilai False. Untuk cek None gunakan is None, bukan == None.
4. String & f-string
f-string adalah cara standar memformat string. Format spec setelah : sangat berguna untuk angka:
harga = 15234.567
nama = "Beras Premium"
print(f"{nama}: Rp {harga:,.0f}") # Beras Premium: Rp 15,235
print(f"{nama:<15}|{harga:>12.2f}") # rata kiri/kanan
print(f"MAPE = {0.0197:.2%}") # MAPE = 1.97%
print(f"{harga=}") # harga=15234.567 (debug)
# Format Rupiah ala Indonesia: tukar koma jadi titik
def format_rupiah(n: float) -> str:
return "Rp " + f"{n:,.0f}".replace(",", ".")
print(format_rupiah(15234.567)) # Rp 15.235
Method string yang sering dipakai: strip(), split(), join(), replace(), lower(), startswith(). Untuk membersihkan teks harga dari API, saya memakai regex:
import re
def clean_harga(val: str) -> int | None:
angka = re.sub(r"[^\d]", "", val or "") # 'Rp 15.000' -> '15000'
return int(angka) if angka else None
print(clean_harga("Rp 15.000"), clean_harga("")) # 15000 None
Python 3.14 juga memperkenalkan template string (
t"...", PEP 750) yang menghasilkan objekTemplate, bukanstr. Berguna untuk library yang perlu escaping (HTML, SQL); untuk kebutuhan sehari-hari f-string tetap pilihan utama.
5. Comprehension
Comprehension membuat list/dict/set dari iterable dalam satu ekspresi — biasanya lebih cepat dan lebih mudah dibaca daripada for + append.
harga_harian = {"2025-01-01": 15200, "2025-01-02": 15350, "2025-01-03": 15100}
# list comprehension dengan filter
naik = [h for h in harga_harian.values() if h > 15200]
# dict comprehension: harga dalam ribuan
ribuan = {tgl: h / 1000 for tgl, h in harga_harian.items()}
# set comprehension
bulan = {tgl[:7] for tgl in harga_harian}
# generator expression: tidak membuat list di memori
total = sum(h for h in harga_harian.values())
# pasangan berurutan dengan zip → perubahan harian
vals = list(harga_harian.values())
delta = [b - a for a, b in zip(vals, vals[1:])]
print(naik, bulan, total, delta) # [15350] {'2025-01'} 45650 [150, -250]
Kalau comprehension mulai butuh dua if dan dua for, pecah menjadi loop biasa.
6. Fungsi
def mape(actual: list[float], forecast: list[float]) -> float:
"""Mean Absolute Percentage Error dalam persen."""
if len(actual) != len(forecast):
raise ValueError("Panjang data tidak sama")
errors = [abs((a - f) / a) for a, f in zip(actual, forecast) if a != 0]
return sum(errors) / len(errors) * 100
def ses(data: list[float], alpha: float = 0.5) -> list[float]:
"""Single Exponential Smoothing sederhana."""
hasil = [data[0]]
for x in data[1:]:
hasil.append(alpha * x + (1 - alpha) * hasil[-1])
return hasil
aktual = [15200, 15300, 15250, 15400]
# nilai smoothing hari ini = ramalan untuk hari berikutnya (one-step-ahead)
ramalan = ses(aktual, alpha=0.5)[:-1]
print(round(mape(aktual[1:], ramalan), 2)) # 0.54
Poin penting:
- Type hint (
list[float],int | None) tidak dicek saat runtime — gunakanmypy/pyrightuntuk mengeceknya. - Keyword argument membuat pemanggilan jelas:
ses(data, alpha=0.3). *argsdan**kwargsmenampung argumen posisi/keyword tambahan.- Fungsi adalah objek: bisa dikirim sebagai argumen (
sorted(kota, key=lambda k: k["nama"])).
Metode SES/DES yang lebih lengkap (termasuk memilih α) dibahas di Forecasting Harga dengan Exponential Smoothing .
7. Modul & Import
Setiap file .py adalah modul. Folder dengan __init__.py adalah package.
# analytics/daily/outlier.py
def detect_spike(df, threshold_pct=5):
...
# app/pages/1_Analitik_Harian.py
from analytics.daily.outlier import detect_spike # import absolut (disarankan)
import pandas as pd # alias konvensional
Pola if __name__ == "__main__": membuat file bisa di-import dan dijalankan langsung:
# etl/run_etl.py
def main() -> None:
print("ETL jalan...")
if __name__ == "__main__":
main()
Library standar yang layak dikenal: pathlib (path file), datetime, json, csv, logging, re, itertools, collections (Counter, defaultdict), dan dataclasses.
from dataclasses import dataclass
from pathlib import Path
@dataclass
class Komoditas:
id: int
nama: str
satuan: str = "kg"
beras = Komoditas(27, "Beras Medium")
print(beras) # Komoditas(id=27, nama='Beras Medium', satuan='kg')
print(Path("export") / "harga.csv") # export/harga.csv
Setelah dasar ini, lanjut ke Pandas untuk mengolah data tabular.
Kesalahan Umum
| Kesalahan | Akibat | Perbaikan |
|---|---|---|
pip install tanpa venv aktif | Paket masuk Python sistem, bentrok antar proyek | Selalu source .venv/bin/activate dulu; cek dengan which python |
Default argument mutable: def f(x=[]) | List yang sama dipakai ulang di setiap panggilan | Pakai def f(x=None) lalu x = x or [] |
Menjalankan python etl/run_etl.py | ModuleNotFoundError untuk package proyek | python -m etl.run_etl dari root |
Commit file .env | Kredensial bocor ke repo | Masukkan ke .gitignore, sediakan .env.example |
float untuk uang | Error pembulatan (0.1 + 0.2 != 0.3) | Simpan dalam int rupiah atau decimal.Decimal |
Menamai file pandas.py / streamlit.py | Import library asli tertutup file sendiri | Hindari nama yang sama dengan library |
| Indentasi campur tab & spasi | TabError | Konsisten 4 spasi; atur editor |
except: kosong | Semua error (termasuk Ctrl+C) tertelan | Tangkap exception spesifik, mis. except ValueError: |

Hey! I’m Fanny, the software engineer tending to this digital garden. You can read more about me, or subscribe by email.