Program yang Tangguh · Pelajaran 11 dari 11
Proyek: buku nilai kelas
12 menit baca · BelajarCode
Kita akan membuat buku nilai sederhana: menyimpan nilai beberapa mapel untuk setiap siswa, menghitung rata-rata, membuat peringkat, lalu menyimpan dan memuatnya kembali dari file CSV.
Rancangan data
Data disimpan dalam dictionary bersarang: kunci luar adalah nama siswa, isinya dictionary nilai per mapel.
{
"Andi": {"mtk": 80, "ipa": 75, "inggris": 88},
"Bela": {"mtk": 95, "ipa": 90, "inggris": 85},
}Programnya
1import csv234def tambah_nilai(buku, nama, mapel, nilai):5 if not 0 <= nilai <= 100:6 raise ValueError(f"nilai {nilai} untuk {nama} tidak valid")7 buku.setdefault(nama, {})[mapel] = nilai8910def rata_rata(nilai_siswa):11 return sum(nilai_siswa.values()) / len(nilai_siswa)121314def peringkat(buku):15 return sorted(buku, key=lambda nama: rata_rata(buku[nama]), reverse=True)161718def simpan(buku, nama_file):19 with open(nama_file, "w", newline="", encoding="utf-8") as f:20 penulis = csv.writer(f)21 for nama, mapel in buku.items():22 for m, n in mapel.items():23 penulis.writerow([nama, m, n])242526def muat(nama_file):27 buku = {}28 with open(nama_file, encoding="utf-8") as f:29 for nama, mapel, nilai in csv.reader(f):30 tambah_nilai(buku, nama, mapel, int(nilai))31 return buku323334buku = {}35data = [36 ("Andi", "mtk", 80), ("Andi", "ipa", 75), ("Andi", "inggris", 88),37 ("Bela", "mtk", 95), ("Bela", "ipa", 90), ("Bela", "inggris", 85),38 ("Citra", "mtk", 70), ("Citra", "ipa", 105), ("Citra", "inggris", 92),39]40for nama, mapel, nilai in data:41 try:42 tambah_nilai(buku, nama, mapel, nilai)43 except ValueError as e:44 print("Dilewati:", e)4546simpan(buku, "buku_nilai.csv")47buku_dimuat = muat("buku_nilai.csv")4849print("Peringkat kelas:")50for posisi, nama in enumerate(peringkat(buku_dimuat), start=1):51 print(f"{posisi}. {nama:<6} {rata_rata(buku_dimuat[nama]):.2f}")Dilewati: nilai 105 untuk Citra tidak valid Peringkat kelas: 1. Bela 90.00 2. Andi 81.00 3. Citra 81.00
Hal penting dari proyek ini
buku.setdefault(nama, {})mengembalikan dictionary nilai milik siswa, dan membuatnya dulu jika belum ada.- Validasi dilakukan di satu tempat, yaitu
tambah_nilai. Data dari mana pun, termasuk dari file, melewati pemeriksaan yang sama. - Fungsi
simpandanmuatadalah pasangan. Data yang disimpan lalu dimuat menghasilkan buku nilai yang sama. - Andi dan Citra punya rata-rata sama.
sortedmempertahankan urutan semula untuk nilai yang sama, sehingga Andi tetap di atas karena datanya dimasukkan lebih dulu.
Uji fungsi satu per satu
Sebelum menggabungkan, uji setiap fungsi dengan contoh kecil. Misalnya, pastikan rata_rata({"a": 80, "b": 90}) menghasilkan 85.0. Kesalahan jauh lebih mudah ditemukan saat fungsinya masih kecil.
Cek pemahaman
Kenapa validasi nilai diletakkan di dalam fungsi tambah_nilai, bukan di tempat data dimasukkan?
Latihan
Rata-rata per mapel
Tambahkan fungsi rata_per_mapel(buku) yang mengembalikan dictionary berisi rata-rata setiap mapel untuk seluruh kelas. Uji dengan data Andi dan Bela di atas.
Pembahasan
1def rata_per_mapel(buku):2 kumpulan = {}3 for nilai_siswa in buku.values():4 for mapel, nilai in nilai_siswa.items():5 kumpulan.setdefault(mapel, []).append(nilai)6 return {m: sum(n) / len(n) for m, n in kumpulan.items()}78buku = {9 "Andi": {"mtk": 80, "ipa": 75, "inggris": 88},10 "Bela": {"mtk": 95, "ipa": 90, "inggris": 85},11}12for mapel, rata in rata_per_mapel(buku).items():13 print(f"{mapel}: {rata:.1f}")mtk: 87.5 ipa: 82.5 inggris: 86.5
Nilai dikumpulkan dulu per mapel dalam list, baru dirata-ratakan dengan dictionary comprehension.
Jalankan contoh kode di pelajaran ini tanpa instalasi lewat compiler Python online.