Studi Kasus Proyek Komprehensif
Implementasi nyata menggabungkan seluruh konsep: Aplikasi Manajemen Keuangan / Kasir POS Berbasis Terminal dengan penyimpanan file dan OOP.
- Mampu mengintegrasikan modul-modul logika ke dalam arsitektur aplikasi utuh.
- Membangun aplikasi CLI interaktif dengan menu navigasi perulangan.
- Menerapkan penyimpanan persisten berbasis JSON dan penanganan error.
1. Proyek 1: Aplikasi To-Do List dengan Penyimpanan JSON
Aplikasi manajemen daftar tugas harian lengkap dengan fitur Tambah, Lihat, Tandai Selesai, Hapus, dan simpan otomatis ke file todos.json.
import json
import os
FILE_STORAGE = "todos.json"
def muat_tugas():
if not os.path.exists(FILE_STORAGE):
return []
try:
with open(FILE_STORAGE, "r", encoding="utf-8") as f:
return json.load(f)
except Exception:
return []
def simpan_tugas(daftar):
with open(FILE_STORAGE, "w", encoding="utf-8") as f:
json.dump(daftar, f, indent=4)
def main():
tugas_list = muat_tugas()
while True:
print("\n=== APLIKASI TO-DO LIST ===")
print("1. Lihat Daftar Tugas")
print("2. Tambah Tugas Baru")
print("3. Tandai Tugas Selesai")
print("4. Hapus Tugas")
print("5. Keluar")
pilihan = input("Pilih menu (1-5): ").strip()
if pilihan == "1":
if not tugas_list:
print("[!] Belum ada tugas yang tersimpan.")
else:
print("\nDAFTAR TUGAS ANDA:")
for idx, t in enumerate(tugas_list, 1):
status = "[āļø Selesai]" if t["selesai"] else "[ā³ Tertunda]"
print(f"{idx}. {status} {t['judul']}")
elif pilihan == "2":
judul = input("Masukkan nama tugas baru: ").strip()
if judul:
tugas_list.append({"judul": judul, "selesai": False})
simpan_tugas(tugas_list)
print(f"[+] Tugas '{judul}' berhasil ditambahkan!")
elif pilihan == "3":
if not tugas_list:
print("[!] Tidak ada tugas untuk diselesaikan.")
continue
nomor = int(input("Nomor tugas yang selesai: "))
if 1 <= nomor <= len(tugas_list):
tugas_list[nomor - 1]["selesai"] = True
simpan_tugas(tugas_list)
print("[+] Status tugas diperbarui menjadi Selesai!")
elif pilihan == "4":
nomor = int(input("Nomor tugas yang ingin dihapus: "))
if 1 <= nomor <= len(tugas_list):
dihapus = tugas_list.pop(nomor - 1)
simpan_tugas(tugas_list)
print(f"[-] Tugas '{dihapus['judul']}' berhasil dihapus.")
elif pilihan == "5":
print("Terima kasih telah menggunakan aplikasi!")
break
else:
print("[X] Pilihan tidak valid!")
if __name__ == "__main__":
main()
2. Proyek 2: Mini Game Tebak Angka Acak
Game interaktif di mana komputer memilih angka rahasia antara 1 sampai 100 secara acak (menggunakan modul random), dan pemain diberi petunjuk "terlalu besar" atau "terlalu kecil" dengan batasan jumlah nyawa.
import random
def main_game():
angka_rahasia = random.randint(1, 100)
kesempatan = 7
skor = 100
print("========================================")
print("šÆ SELAMAT DATANG DI GAME TEBAK ANGKA šÆ")
print("Komputer telah memilih angka antara 1 - 100.")
print(f"Anda memiliki {kesempatan} kesempatan menebak!")
print("========================================")
while kesempatan > 0:
try:
tebakan = int(input(f"\n[Sisa Nyawa: {kesempatan}] Masukkan tebakan Anda: "))
except ValueError:
print("Masukan harus berupa angka bulat!")
continue
if tebakan == angka_rahasia:
print(f"\nš SELAMAT! Anda menebak dengan BENAR angka {angka_rahasia}!")
print(f"š Skor Akhir Anda: {skor} Poin")
return
elif tebakan < angka_rahasia:
print("š Terlalu KECIL! Coba angka yang lebih besar.")
else:
print("š Terlalu BESAR! Coba angka yang lebih kecil.")
kesempatan -= 1
skor -= 15
print(f"\nš GAME OVER! Kesempatan habis. Angka rahasianya adalah {angka_rahasia}.")
if __name__ == "__main__":
main_game()
3. Langkah Lanjut & Roadmap Belajar Python
Setelah menguasai seluruh materi dasar di portal ini, Anda siap melangkah ke spesialisasi tingkat lanjut:
š Web Backend
Bangun API & website modern dengan framework FastAPI, Flask, atau Django.
š Data & AI
Olah dan visualisasikan data dengan Pandas, NumPy, Matplotlib, dan Scikit-Learn.
ā” Otomasi & Bot
Buat skrip web scraping (BeautifulSoup, Selenium) dan bot otomatisasi tugas harian.
| Sintaks / Perintah | Keterangan Fungsi |
|---|---|
if __name__ == "__main__": |
Guard entry point standar memastikan skrip dieksekusi langsung |
from pathlib import Path |
Manipulasi path file lintas sistem operasi secara portabel |
import json |
Modul bawaan untuk membaca dan menyimpan data struktur JSON |
json.dump(data, f, indent=2) |
Menyimpan struktur data Python ke dalam file format JSON |
data = json.load(f) |
Membaca isi file JSON kembali menjadi list/dict Python |
import sys; sys.exit(0) |
Mengakhiri jalannya program dengan kode status exit tertentu |
Jobsheet 06: File I/O, Eksepsi & Mini Proyek Terpadu
Rancang dan jalankan mini proyek aplikasi kasir konsol atau sistem inventaris terpadu dari awal hingga akhir.
Menuliskan path file secara kaku (hardcoded C:\Users\...) yang dipastikan gagal dan memicu FileNotFoundError di komputer lain.
# Path absolut kaku (Pasti error di komputer teman / OS Linux / Web):
with open("C:\\Users\\Budi\\Documents\\data_produk.json", "r") as f:
data = f.read()
from pathlib import Path
# Menggunakan path relatif dinamis berbasis lokasi skrip:
BASE_DIR = Path(__file__).resolve().parent
file_path = BASE_DIR / "data_produk.json"
with open(file_path, "r", encoding="utf-8") as f:
data = f.read()
pathlib.Path atau os.path agar aplikasi portabel dan dapat dijalankan di lingkungan mana pun.
Pisahkan kode deklarasi fungsi/kelas dari eksekusi utama skrip agar kode modular dan dapat digunakan kembali.
# Kurang Pythonic (Semua kode berjalan di global namespace)
import math
print("=== APLIKASI KASIR SEDERHANA ===")
total_belanja = 0
# 100 baris logika bercampur langsung di root file...
# Jika file ini di-import oleh file lain, kode langsung berjalan liar!
# Pythonic (Entry Point Standar Industri)
def proses_transaksi():
# Logika bisnis terisolasi rapi
print("Memproses transaksi...")
def main():
print("=== APLIKASI KASIR SEDERHANA ===")
proses_transaksi()
if __name__ == "__main__":
main()
main() hanya dieksekusi ketika file dijalankan secara langsung sebagai skrip utama, bukan saat file diimpor sebagai modul oleh program lain.
Cek Pemahaman Mandiri
Uji pemahaman Anda terhadap konsep bab ini dengan feedback evaluasi instan.
Mengapa modularitas (memisahkan kode ke dalam fungsi dan class terpisah) sangat krusial dalam membangun proyek aplikasi besar?
š” Pembahasan: Modularitas membagi kompleksitas sistem menjadi bagian-bagian kecil yang mandiri (Separation of Concerns), sehingga mudah dikembangkan, diuji, dan diperbaiki tanpa merusak komponen lain.
Format data lokal standar apa yang paling umum dan mudah diintegrasikan dengan Python untuk penyimpanan data terstruktur non-database?
š” Pembahasan: Format JSON sangat mudah dibaca manusia dan memetakan struktur Dictionary serta List Python secara alami menggunakan fungsi json.dump() dan json.load().