Selamat Datang di Kurikulum Python!
Kurikulum ini dirancang khusus untuk Guru Informatika SMA yang ingin menguasai Python dari dasar hingga membuat aplikasi sederhana. Materi menggabungkan teori konsep, logika berpikir komputasional, dan praktik langsung dengan contoh konteks sekolah.
1. Teori: Variabel, Tipe Data, & Manajemen Memori
Apa itu Variabel?
Variabel adalah wadah untuk menyimpan data di memori komputer. Dalam Python, variabel dibuat saat Anda memberikan nilai ke sebuah nama.
# Contoh variabel sederhana
nama_guru = "Budi Santoso" # Tipe data string (teks)
nilai_ujian = 85 # Tipe data integer (bilangan bulat)
lulus = True # Tipe data boolean (True/False)
print(nama_guru)
print(type(nilai_ujian)) # Output: <class 'int'>
Tipe Data Dasar Python
| Tipe Data | Keterangan | Contoh |
|---|---|---|
| int | Bilangan bulat | umur = 35 |
| float | Bilangan desimal | rata_rata = 87.5 |
| str | Teks | nama = "Ani" |
| bool | True/False | hadir = True |
| list | Kumpulan data terurut, bisa diubah | siswa = ["Ani", "Budi"] |
| dict | Kumpulan data key-value | nilai = {"Ani": 90} |
| tuple | Kumpulan data terurut, tidak bisa diubah | hari = ("Senin",) |
Manajemen Memori Sederhana
Python mengelola memori secara otomatis. Setiap nilai adalah objek dengan alamat memori unik yang bisa dicek dengan fungsi id().
a = 10
b = a # b merujuk ke objek yang sama dengan a
print(id(a)) # Alamat memori a
print(id(b)) # Alamat memori b (sama dengan a)
print(id(a) == id(b)) # Output: True
c = 10 # Python mengoptimalkan bilangan kecil, jadi c mungkin merujuk ke objek yang sama
print(id(c) == id(a)) # Seringnya True untuk bilangan kecil
🎯 Tantangan Kode 1
Kerjakan tantangan berikut untuk melatih pemahaman Anda:
- Buat variabel
data_guruyang menyimpan nama Anda (string), usia (int), dan mata pelajaran yang diajar (string). Tampilkan tipe data masing-masing menggunakan fungsitype(). - Buat list bernama
daftar_kelasyang berisi 3 nama kelas (misal: "X IPA 1", "X IPA 2", "X IPS 1"). Cetak panjang list menggunakan fungsilen(). - Buat dictionary
info_sekolahdengan key "nama_sekolah", "alamat", "jumlah_siswa". Tampilkan semua nilai menggunakan perulangan for.
2. Teori: Kontrol Alur (Branching & Looping)
Branching (Percabangan)
Digunakan untuk membuat keputusan berdasarkan kondisi tertentu dengan if, elif, dan else.
nilai = 85
if nilai >= 90:
grade = "A"
elif nilai >= 80:
grade = "B"
elif nilai >= 70:
grade = "C"
else:
grade = "D"
print(f"Nilai: {nilai}, Grade: {grade}") # Output: Nilai: 85, Grade: B
Flowchart Branching:
Looping (Perulangan)
Digunakan untuk mengulang eksekusi kode: for (untuk iterasi sekuens) dan while (selama kondisi terpenuhi).
For Loop
# Mencetak angka 1 sampai 5
for i in range(1, 6):
print(i)
# Iterasi list siswa
daftar_siswa = ["Ani", "Budi", "Cici"]
for siswa in daftar_siswa:
print(f"Siswa: {siswa}")
Flowchart For Loop:
While Loop
# Program login sederhana
password_benar = "guru123"
password_input = ""
while password_input != password_benar:
password_input = input("Masukkan password: ")
print("Login berhasil!")
Flowchart While Loop:
🎯 Tantangan Kode 2
Kerjakan tantangan berikut:
- Buat program yang meminta input angka dari user, lalu cek apakah angka tersebut genap atau ganjil menggunakan if/else.
- Modifikasi program di atas untuk mencetak semua angka dari 1 sampai angka yang diinput menggunakan for loop.
- Buat program while loop yang meminta input nilai siswa, lalu hitung rata-rata nilai tersebut. Program berhenti jika user input "-1".
3. Teori: OOP (Analog Sistem Sekolah)
Konsep Dasar OOP
Object-Oriented Programming (OOP) memodelkan program sebagai kumpulan objek yang memiliki atribut (data) dan metode (fungsi). Analogi sekolah:
- Class: Cetak biru (template) untuk membuat objek, contoh: Class Siswa, Class Guru
- Object: Instance dari class, contoh: Siswa bernama "Ani", Guru bernama "Budi"
- Attribute: Data yang dimiliki objek, contoh: NIS, Nama, Kelas
- Method: Fungsi yang dimiliki objek, contoh: tampilkan_info(), mengajar()
Class Siswa
class Siswa:
def __init__(self, nis, nama, kelas):
self.nis = nis # Atribut NIS
self.nama = nama # Atribut Nama
self.kelas = kelas # Atribut Kelas
def tampilkan_info(self):
print(f"NIS: {self.nis}")
print(f"Nama: {self.nama}")
print(f"Kelas: {self.kelas}")
# Membuat objek Siswa
siswa1 = Siswa("12345", "Ani Suryani", "X IPA 1")
siswa1.tampilkan_info()
Class Guru
class Guru:
def __init__(self, nip, nama, mapel):
self.nip = nip # Atribut NIP
self.nama = nama # Atribut Nama
self.mapel = mapel # Atribut Mata Pelajaran
def mengajar(self):
print(f"Guru {self.nama} sedang mengajar mapel {self.mapel}")
# Membuat objek Guru
guru1 = Guru("98765", "Budi Santoso", "Informatika")
guru1.mengajar()
Inheritance (Pewarisan)
Class anak mewarisi atribut dan metode dari class induk.
class SiswaKelas12(Siswa): # Mewarisi Class Siswa
def __init__(self, nis, nama, kelas, jurusan):
super().__init__(nis, nama, kelas) # Memanggil constructor induk
self.jurusan = jurusan # Atribut tambahan
def tampilkan_jurusan(self):
print(f"Jurusan: {self.jurusan}")
# Membuat objek SiswaKelas12
siswa12 = SiswaKelas12("11111", "Budi", "XII IPA 1", "MIPA")
siswa12.tampilkan_info() # Method dari induk
siswa12.tampilkan_jurusan() # Method tambahan
🎯 Tantangan Kode 3
Kerjakan tantangan berikut:
- Buat Class
MataPelajarandengan atributkode_mapel,nama_mapel,guru_pengampu. Tambahkan methodinfo_mapel()yang menampilkan semua atribut. - Buat 2 objek MataPelajaran (misal: Informatika dan Matematika), lalu panggil method
info_mapel()untuk masing-masing objek. - Buat Class
GuruKelas(Siswa)(pewarisan dari Siswa) yang menambahkan atributwali_kelas. Override methodtampilkan_info()untuk menampilkan wali kelas juga.
4. Teori: Manipulasi Data (List, Dictionary, Tuple)
List (Daftar)
Terurut, bisa diubah (mutable), menyimpan data yang sering berubah.
daftar_siswa = ["Ani", "Budi", "Cici"] # List awal
# Menambah data
daftar_siswa.append("Dedi")
print(daftar_siswa) # ['Ani', 'Budi', 'Cici', 'Dedi']
# Mengubah data
daftar_siswa[1] = "Budi Santoso"
print(daftar_siswa[1]) # Budi Santoso
# Menghapus data
daftar_siswa.remove("Cici")
print(len(daftar_siswa)) # 3
# Use case: Daftar siswa yang sering bertambah/kurang
Tuple (Tupel)
Terurut, tidak bisa diubah (immutable), menyimpan data yang tetap/konstan.
hari_sekolah = ("Senin", "Selasa", "Rabu", "Kamis", "Jumat") # Tuple hari sekolah
print(hari_sekolah[0]) # Senin
# hari_sekolah[0] = "Senin Baru" # Error! Tuple tidak bisa diubah
# Use case: Data konstanta seperti hari sekolah, bulan, dll.
Dictionary (Kamus)
Menyimpan data key-value, cepat untuk pencarian berdasarkan key.
nilai_siswa = { # Key: Nama, Value: Nilai
"Ani": 90,
"Budi": 85,
"Cici": 92
}
# Menambah data
nilai_siswa["Dedi"] = 88
# Mengubah data
nilai_siswa["Ani"] = 95
# Mengakses data
print(nilai_siswa["Budi"]) # 85
# Iterasi dictionary
for nama, nilai in nilai_siswa.items():
print(f"{nama}: {nilai}")
# Use case: Menyimpan nilai siswa, data profil dengan NIS sebagai key
Kapan Menggunakan Masing-Masing?
| Data Structure | Karakteristik | Use Case Sekolah |
|---|---|---|
| List | Mutable, ordered, index-based | Daftar siswa kelas, daftar nilai ujian |
| Tuple | Immutable, ordered, index-based | Hari sekolah, urutan semester, konstanta |
| Dictionary | Mutable, key-value pairs | Nilai per siswa (NIS: nilai), profil guru |
🎯 Tantangan Kode 4
Kerjakan tantangan berikut:
- Buat dictionary
nilai_siswadengan 5 pasang nama-nilai siswa. Hitung rata-rata nilai dan tampilkan siswa dengan nilai tertinggi. - Buat list
jadwal_pelajaranuntuk hari Senin (mata pelajaran: Informatika, Matematika, Bahasa Indonesia). Tambahkan 1 mata pelajaran lagi di akhir list. - Buat tuple
kehadiranyang berisi status kehadiran 5 siswa ("Hadir", "Izin", "Hadir", "Sakit", "Hadir"). Hitung jumlah siswa yang hadir menggunakan perulangan.
Proyek 1: Otomatisasi Pengolahan Nilai CSV/Excel
Proyek ini membuat script Python untuk membaca file CSV nilai siswa, menghitung statistik, dan menyimpan hasilnya ke file baru.
Contoh Isi File nilai.csv
Nama,Nilai
Ani,90
Budi,85
Cici,92
Dedi,78
Eka,88
Script Python (menggunakan modul csv)
import csv
# Membaca file nilai.csv
data_nilai = []
with open('nilai.csv', mode='r') as file:
reader = csv.DictReader(file)
for row in reader:
# Konversi nilai ke integer
row['Nilai'] = int(row['Nilai'])
data_nilai.append(row)
# Menghitung statistik
total_nilai = sum(item['Nilai'] for item in data_nilai)
rata_rata = total_nilai / len(data_nilai)
nilai_tertinggi = max(data_nilai, key=lambda x: x['Nilai'])
nilai_terendah = min(data_nilai, key=lambda x: x['Nilai'])
print(f"Total Siswa: {len(data_nilai)}")
print(f"Rata-rata Nilai: {rata_rata:.2f}")
print(f"Nilai Tertinggi: {nilai_tertinggi['Nama']} ({nilai_tertinggi['Nilai']})")
print(f"Nilai Terendah: {nilai_terendah['Nama']} ({nilai_terendah['Nilai']})")
# Menyimpan rekap ke file baru
with open('rekap_nilai.csv', mode='w', newline='') as file:
writer = csv.writer(file)
writer.writerow(['Statistik', 'Nilai'])
writer.writerow(['Total Siswa', len(data_nilai)])
writer.writerow(['Rata-rata', f"{rata_rata:.2f}"])
writer.writerow(['Tertinggi', f"{nilai_tertinggi['Nama']} ({nilai_tertinggi['Nilai']})"])
writer.writerow(['Terendah', f"{nilai_terendah['Nama']} ({nilai_terendah['Nilai']})"])
print("Rekap nilai disimpan ke rekap_nilai.csv")
Bonus: Menggunakan Pandas untuk Excel
Untuk file Excel (.xlsx), gunakan library pandas (perlu diinstall: pip install pandas openpyxl).
import pandas as pd
# Membaca file Excel
df = pd.read_excel('nilai.xlsx')
# Menghitung kolom baru
df['Grade'] = df['Nilai'].apply(lambda x: 'A' if x >= 90 else 'B' if x >= 80 else 'C')
# Menyimpan ke Excel baru
df.to_excel('rekap_nilai.xlsx', index=False)
print("Rekap nilai Excel disimpan")
🎯 Tantangan Kode Proyek 1
Kerjakan tantangan berikut:
- Modifikasi script CSV di atas untuk menambahkan kolom "Grade" (A/B/C/D) berdasarkan nilai (>=90 A, >=80 B, >=70 C, lainnya D). Simpan ke file baru
rekap_dengan_grade.csv. - Tambahkan fitur pada script untuk membaca file nilai dari input user (minta nama file via input()), lalu tangani error jika file tidak ditemukan menggunakan try/except.
Proyek 2: Aplikasi Absensi Siswa Berbasis Teks
Aplikasi absensi sederhana dengan menu teks yang menyimpan data absensi siswa.
Full Code Example
import datetime
# Data penyimpanan: list of dictionaries
siswa_list = []
absensi_list = []
def tambah_siswa():
print("\n=== TAMBAH SISWA ===")
nis = input("Masukkan NIS: ")
nama = input("Masukkan Nama: ")
kelas = input("Masukkan Kelas: ")
# Cek apakah NIS sudah ada
for s in siswa_list:
if s['nis'] == nis:
print("NIS sudah terdaftar!")
return
siswa_list.append({'nis': nis, 'nama': nama, 'kelas': kelas})
print(f"Siswa {nama} berhasil ditambahkan!")
def catat_absensi():
print("\n=== CATAT ABSENSI ===")
if not siswa_list:
print("Belum ada data siswa. Tambahkan siswa terlebih dahulu.")
return
nis = input("Masukkan NIS siswa: ")
siswa = None
for s in siswa_list:
if s['nis'] == nis:
siswa = s
break
if not siswa:
print("Siswa tidak ditemukan!")
return
print(f"Siswa: {siswa['nama']} ({siswa['nis']})")
print("Status: 1. Hadir 2. Izin 3. Sakit")
status_pilihan = input("Pilih status (1-3): ")
status_map = {'1': 'Hadir', '2': 'Izin', '3': 'Sakit'}
status = status_map.get(status_pilihan, 'Tidak Diketahui')
tanggal = datetime.datetime.now().strftime("%d-%m-%Y")
absensi_list.append({
'nis': nis,
'nama': siswa['nama'],
'tanggal': tanggal,
'status': status
})
print(f"Absensi {siswa['nama']} pada {tanggal}: {status}")
def lihat_rekap():
print("\n=== REKAP ABSENSI ===")
if not absensi_list:
print("Belum ada data absensi.")
return
nis = input("Masukkan NIS (kosongkan untuk semua): ")
filter_absensi = [a for a in absensi_list if not nis or a['nis'] == nis]
if not filter_absensi:
print("Tidak ada data absensi.")
return
print(f"{'Tanggal':<12} {'NIS':<10} {'Nama':<20} {'Status':<10}")
print("-" * 52)
for a in filter_absensi:
print(f"{a['tanggal']:<12} {a['nis']:<10} {a['nama']:<20} {a['status']:<10}")
def main_menu():
while True:
print("\n=== APLIKASI ABSENSI SISWA ===")
print("1. Tambah Siswa")
print("2. Catat Absensi")
print("3. Lihat Rekap Absensi")
print("4. Keluar")
pilihan = input("Pilih menu (1-4): ")
if pilihan == '1':
tambah_siswa()
elif pilihan == '2':
catat_absensi()
elif pilihan == '3':
lihat_rekap()
elif pilihan == '4':
print("Terima kasih! Program selesai.")
break
else:
print("Pilihan tidak valid!")
# Menjalankan aplikasi
if __name__ == "__main__":
main_menu()
🎯 Tantangan Kode Proyek 2
Kerjakan tantangan berikut:
- Tambahkan fitur hapus data siswa (pilih menu 5) yang meminta NIS, lalu menghapus siswa dari
siswa_listdan absensi terkait dariabsensi_list. - Tambahkan fitur hitung persentase kehadiran per siswa. Jika memilih menu "Lihat Rekap", tambahkan opsi untuk menampilkan persentase hadir ((jumlah hadir / total absensi) * 100) untuk setiap siswa.
Proyek 3: Dashboard Prestasi Siswa dengan Flask
Flask adalah framework web mikro untuk Python. Proyek ini membuat dashboard sederhana untuk menampilkan prestasi siswa.
Instalasi Flask
pip install flask
Full Code Example
from flask import Flask, render_template_string
app = Flask(__name__)
# Data prestasi siswa (simulasi database)
prestasi_siswa = [
{'nama': 'Ani Suryani', 'prestasi': 'Juara 1 Olimpiade Matematika', 'tanggal': '15 Januari 2026'},
{'nama': 'Budi Santoso', 'prestasi': 'Juara 2 Lomba Debat', 'tanggal': '20 Februari 2026'},
{'nama': 'Cici Rahayu', 'prestasi': 'Best Presenter Science Fair', 'tanggal': '10 Maret 2026'},
{'nama': 'Ani Suryani', 'prestasi': 'Juara 3 Essay Competition', 'tanggal': '5 April 2026'}
]
# Template HTML inline
HTML_TEMPLATE = """
Dashboard Prestasi Siswa
🏆 Dashboard Prestasi Siswa
Nama Siswa
Prestasi
Tanggal
{% for p in prestasi %}
{{ p.nama }}
{{ p.prestasi }}
{{ p.tanggal }}
{% endfor %}
Statistik
Total Prestasi: {{ prestasi|length }}
Jumlah Siswa Berprestasi: {{ prestasi|map(attribute='nama')|unique|list|length }}
"""
@app.route('/')
def home():
return "Selamat Datang di Dashboard Prestasi
"
@app.route('/dashboard')
def dashboard():
return render_template_string(HTML_TEMPLATE, prestasi=prestasi_siswa)
if __name__ == '__main__':
app.run(debug=True)
Jalankan script dengan python nama_file.py, lalu buka http://localhost:5000/dashboard di browser.
🎯 Tantangan Kode Proyek 3
Kerjakan tantangan berikut:
- Tambahkan route
/tambah-prestasiyang menampilkan form HTML (nama, prestasi, tanggal) untuk menambahkan data prestasi baru. Saat form disubmit (method POST), tambahkan data ke listprestasi_siswa. - Modifikasi dashboard untuk menambahkan fitur filter prestasi berdasarkan nama siswa. Tambahkan dropdown di bagian atas dashboard untuk memilih siswa, lalu tampilkan hanya prestasi siswa terpilih.