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 .

PerintahFungsi
python -m venv .venvMembuat environment terisolasi
pip install xMemasang paket dari PyPI
pip list / pip show xMelihat paket terpasang / detail paket
pip freezeMencetak versi persis semua paket
python -m modulMenjalankan modul sebagai skrip (pakai sys.path proyek)

Tips: tambahkan .venv/ dan __pycache__/ ke .gitignore. Yang di-commit cukup requirements.txt (atau pyproject.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.

TipeContohMutable?Catatan
int15000tidakpresisi tak terbatas
float0.5tidakIEEE 754, hati-hati untuk uang
str"Beras Medium"tidakUnicode
boolTrue, Falsetidakhuruf kapital
NoneNone—setara null
list[1, 2, 3]yaarray dinamis
tuple("3507", 27)tidakcocok untuk data tetap
dict{"kota": "Malang"}yaurutan insert dipertahankan
set{"SES", "DES"}yaunik, 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 objek Template, bukan str. 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 — gunakan mypy/pyright untuk mengeceknya.
  • Keyword argument membuat pemanggilan jelas: ses(data, alpha=0.3).
  • *args dan **kwargs menampung 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

KesalahanAkibatPerbaikan
pip install tanpa venv aktifPaket masuk Python sistem, bentrok antar proyekSelalu source .venv/bin/activate dulu; cek dengan which python
Default argument mutable: def f(x=[])List yang sama dipakai ulang di setiap panggilanPakai def f(x=None) lalu x = x or []
Menjalankan python etl/run_etl.pyModuleNotFoundError untuk package proyekpython -m etl.run_etl dari root
Commit file .envKredensial bocor ke repoMasukkan ke .gitignore, sediakan .env.example
float untuk uangError pembulatan (0.1 + 0.2 != 0.3)Simpan dalam int rupiah atau decimal.Decimal
Menamai file pandas.py / streamlit.pyImport library asli tertutup file sendiriHindari nama yang sama dengan library
Indentasi campur tab & spasiTabErrorKonsisten 4 spasi; atur editor
except: kosongSemua error (termasuk Ctrl+C) tertelanTangkap 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.

Comments