Pendahuluan
Halo, teman-teman developer! Senang sekali kita bisa sampai di tahap akhir dari seri pembelajaran ini. Pada artikel sebelumnya, kita sudah menyelami dunia Object-Oriented Programming (OOP) di Python, mulai dari memahami apa itu class, bagaimana membuat object, hingga bagaimana menerapkan inheritance untuk membuat kode yang lebih efisien dan reusable.
Namun, sebuah konsep OOP yang canggih tidak akan berarti apa-apa tanpa pemahaman yang kuat tentang bagaimana logika dasar Python bekerja secara interaktif. Di artikel ini, kita akan melakukan “review” atau pengenalan kembali terhadap elemen-elemen fundamental Python—seperti tipe data, struktur kontrol, dan manipulasi input—namun dengan sudut pandang yang berbeda. Kita tidak lagi mempelajarinya secara teori kering, melainkan langsung menghubungkannya dengan proyek utama kita: CLI Expense Tracker.
Tujuan akhir dari artikel ini adalah menyatukan semua potongan puzzle yang telah kita pelajari di artikel #1 sampai #5. Kita akan melihat bagaimana variabel, list, dictionary, loop, dan logic if-else bekerja sama dengan Class yang sudah kita buat untuk menciptakan sebuah aplikasi pencatat pengastat pengeluaran yang utuh. Jadi, siapkan kopi Anda, dan mari kita mulai merakit kode!
Struktur Data: List dan Dictionary dalam Pencatatan Keuangan
Dalam membangun aplikasi Expense Tracker, tantangan pertama kita adalah: “Bagaimana cara menyimpan data transaksi yang banyak agar tidak hilang saat program berjalan?” Di sinilah kita membutuhkan struktur data yang tepat.
Dalam Python, dua struktur data yang paling sering digunakan adalah list dan dictionary. Untuk aplikasi kita, kita akan menggunakan list sebagai wadah utama (container) yang menampung objek-objek transaksi. Sedangkan di dalam setiap objek transaksi, kita bisa menggunakan dictionary atau atribut class untuk menyimpan detailnya.
Mari kita lihat contoh sederhana bagaimana Budi mencatat pengeluarannya untuk belanja di Tokopedia menggunakan struktur data ini.
# Contoh penggunaan list dan dictionary untuk mencatat pengeluaran
# Kita menggunakan list untuk menampung semua transaksi
daftar_pengeluaran = []
# Transaksi pertama: Budi membeli pulsa
transaksi_1 = {
"item": "Pulsa Telkomsel",
"nominal": 50000,
"kategori": "Komunikasi"
}
# Transaksi kedua: Siti membayar belanjaan di Tokopedia
transaksi_2 = {
"item": "Sepatu Running",
"nominal": 350000,
"kategori": "Fashion"
}
# Memasukkan data ke dalam list
daftar_pengeluaran.append(transaksi_1)
daftar_pengeluaran.append(transaksi_2)
# Menampilkan semua pengeluaran
print("--- Laporan Pengeluaran Budi & Siti ---")
for transaksi in daftar_pengeluaran:
print(f"Item: {transaksi['item']} | Harga: Rp{transaksi['nominal']:,}")
Pada kode di atas, perhatikan penggunaan f-string dengan format :,. Ini adalah fitur Python yang sangat berguna untuk membuat angka ribuan menjadi lebih mudah dibaca (misal: 350000 menjadi 350,000). Dalam konteks aplikasi kita, kemampuan mengelola list sangat krusical karena aplikasi akan terus menambah data ke dalam list tersebut selama program berjalan.
Kontrol Alur: Loop dan Kondisional untuk Menu Interaktif
Sebuah aplikasi CLI (Command Line Interface) yang baik harus memiliki menu yang interaktif. Pengguna harus bisa memilih: “Apakah ingin menambah pengeluaran?”, “Apakah ingin melihat semua laporan?”, atau “Apakah ingin keluar?”.
Untuk mencapai ini, kita membutuhkan dua konsep utama: while loop untuk menjaga program tetap berjalan, dan if-elif-else untuk menangani pilihan pengguna.
def tampilkan_menu():
print("\n=== Menu Expense Tracker ===")
print("1. Tambah Pengeluaran")
print("2. Lihat Semua Pengeluaran")
print("3. Keluar")
print("============================")
def main_program():
running = True
while running:
tampilkan_menu()
pilihan = input("Pilih menu (1/2/3): ")
if pilihan == '1':
print(">> Anda memilih menu Tambah Pengeluaran")
# Logika tambah data akan diletakkan di sini
elif pilihan == '2':
print(">> Anda memilih menu Lihat Pengeluaran")
# Logika tampilkan data akan diletakkan di sini
elif pilihan == '3':
print(">> Terima kasih telah menggunakan aplikasi! Sampai jumpa.")
running = False
else:
print(">> Pilihan tidak valid! Silakan coba lagi.")
# Menjalankan program
if __arg_name == "__main__":
main_program()
Dalam contoh di atas, while running: memastikan bahwa program tidak langsung berhenti setelah satu kali aksi. Program hanya akan berhenti jika variabel running diubah menjadi False (saat pengguna memilih menu 3). Penggunaan if-elif-else memberikan logika percabangan yang jelas bagi pengguna untuk bernavigasi di dalam aplikasi. Tanpa kontrol alur yang baik, aplikasi kita hanya akan menjadi skrip sekali jalan yang tidak interaktif.
Input Handling dan Type Casting: Menghindari Error Data
Salah satu bagian tersulit dalam membuat aplikasi berbasis teks adalah menangani input dari pengguna. Ingat, fungsi input() di Python selalu mengembalikan tipe data string. Padahal, untuk nominal uang, kita membutuhkan tipe data float atau int agar bisa dilakukan operasi matematika (seperti penjumlahan total pengeluaran).
Di sinilah kita perlu melakukan Type Casting atau konversi tipe data. Namun, kita juga harus waspada terhadap error jika pengguna memasukkan karakter non-angka (misalnya menulis “sepuluh ribu” alih-alih “10000”).
def tambah_data_manual():
try:
# Mengambil input dari user
nama_item = input("Masukkan nama barang: ")
# Konversi input string ke float untuk nominal
nominal_input = input("Masukkan nominal (Rp): ")
nominal = float(nominal_input)
print(arg_item_name)
print(f"Berhasil menambahkan: {nama_item} sebesar Rp{nominal:,.0f}")
except ValueError:
# Menangani jika user memasukkan teks pada input nominal
print("Error: Mohon masukkan angka saja untuk nominal uang!")
tambah_data_manual()
Pada kode di atas, kita menggunakan blok try-except. Ini adalah praktik best practice yang sangat penting. Jika float(nominal_input) gagal karena user memasukkan huruf, program tidak akan crash (berhenti paksa), melainkan akan menjalankan blok except dan memberikan pesan error yang ramah kepada pengguna.
Implementasi dalam Proyek
Sekarang, mari kita satukan semua konsep: OOP (dari artikel sebelumnya), List/Dictionary, Loop, dan Input Handling ke dalam satu struktur final untuk CLI Expense Tracker. Kita akan menggunakan Class Expense untuk merepresentasikan satu transaksi dan Class Tracker untuk mengelola koleksi transaksi tersebut.
class Expense:
def __init__(self, description, amount, category):
self.description = description
self.amount = amount
self.category = category
class ExpenseTracker:
def __init__(self):
self.expenses = []
def add_expense(self, description, amount, category):
new_expense = Expense(description, amount, category)
self.expenses.append(new_expense)
print(f"✅ Berhasil menambahkan: {description}")
def show_all(self):
if not self.expenses:
print("⚠️ Belum ada data pengeluaran.")
return
print("\n=== DAFTAR PENGELUARAN ===")
total = 0
for e in self.expenses:
print(f"[{e.category}] {e.description}: Rp{e.amount:,.0f}")
total += e.amount
print(f"---------------------------")
print(f"TOTAL PENGELUARAN: Rp{total:,.0f}")
print("===========================\n")
def main():
tracker = ExpenseTracker()
while True:
print("--- MENU TRACKER KEUANGAN ---")
print("1. Tambah Pengeluaran")
print("2. Lihat Semua Pengeluaran")
pilihan = input("Pilih menu (1/2) atau 'q' untuk keluar: ")
if pilihan.lower() == 'q':
print("Terima kasih telah menggunakan aplikasi ini!")
break
if pilihan == '1':
desc = input("Deskripsi pengeluaran: ")
try:
amt = float(input("Jumlah nominal (angka): "))
cat = input("Kategori (misal: Makan, Transport, Listrik): ")
tracker.add_expense(desc, amt, cat)
except ValueError:
print("❌ Error: Nominal harus berupa angka!")
elif pilihan == '2':
tracker.show_all()
else:
print("❌ Pilihan tidak valid!")
if __name__ == "__main__":
main()
Kesimpulan
Dalam tutorial ini, kita telah belajar bagaimana menggabungkan berbagai elemen pemrograman Python:
- Pemrograman Berorientasi Objek (OOP) untuk struktur data yang rapi.
- Struktur Data (List) untuk menyimpan kumpulan data secara dinamis.
- Control Flow (Loops & Conditionals) untuk membuat interaksi pengguna yang interaktif.
- Error Handling (Try-Except) untuk memastikan aplikasi tidak mudah crash.
Dengan menguasai kombinasi ini, Anda sudah memiliki fondasi yang sangat kuat untuk membangun aplikasi berbasis teks yang lebih kompleks, bahkan hingga ke level aplikasi web atau mobile di masa depan. Teruslah berlatih dan jangan takut untuk bereksperimen dengan kode Anda!