🐍 Python Learning Hub

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:

  1. Buat variabel data_guru yang menyimpan nama Anda (string), usia (int), dan mata pelajaran yang diajar (string). Tampilkan tipe data masing-masing menggunakan fungsi type().
  2. Buat list bernama daftar_kelas yang berisi 3 nama kelas (misal: "X IPA 1", "X IPA 2", "X IPS 1"). Cetak panjang list menggunakan fungsi len().
  3. Buat dictionary info_sekolah dengan 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:

[Start] ↓ Input Nilai ↓ Nilai >= 90? ├─ Ya → Grade = "A" → Tampilkan Grade → [End] └─ Tidak → Nilai >= 80? ├─ Ya → Grade = "B" → Tampilkan Grade → [End] └─ Tidak → Nilai >= 70? ├─ Ya → Grade = "C" → Tampilkan Grade → [End] └─ Tidak → Grade = "D" → Tampilkan Grade → [End]

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:

[Start] ↓ i = 1 ↓ i <= 5? ├─ Ya → Cetak i → i = i + 1 → Ulangi pengecekan └─ Tidak → [End]

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:

[Start] ↓ Input Password ↓ Password == "guru123"? ├─ Ya → Login Berhasil → [End] └─ Tidak → Ulangi Input Password

🎯 Tantangan Kode 2

Kerjakan tantangan berikut:

  1. Buat program yang meminta input angka dari user, lalu cek apakah angka tersebut genap atau ganjil menggunakan if/else.
  2. Modifikasi program di atas untuk mencetak semua angka dari 1 sampai angka yang diinput menggunakan for loop.
  3. 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:

  1. Buat Class MataPelajaran dengan atribut kode_mapel, nama_mapel, guru_pengampu. Tambahkan method info_mapel() yang menampilkan semua atribut.
  2. Buat 2 objek MataPelajaran (misal: Informatika dan Matematika), lalu panggil method info_mapel() untuk masing-masing objek.
  3. Buat Class GuruKelas(Siswa) (pewarisan dari Siswa) yang menambahkan atribut wali_kelas. Override method tampilkan_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:

  1. Buat dictionary nilai_siswa dengan 5 pasang nama-nilai siswa. Hitung rata-rata nilai dan tampilkan siswa dengan nilai tertinggi.
  2. Buat list jadwal_pelajaran untuk hari Senin (mata pelajaran: Informatika, Matematika, Bahasa Indonesia). Tambahkan 1 mata pelajaran lagi di akhir list.
  3. Buat tuple kehadiran yang 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:

  1. 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.
  2. 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:

  1. Tambahkan fitur hapus data siswa (pilih menu 5) yang meminta NIS, lalu menghapus siswa dari siswa_list dan absensi terkait dari absensi_list.
  2. 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

{% for p in prestasi %} {% endfor %}
Nama Siswa Prestasi Tanggal
{{ p.nama }} {{ p.prestasi }} {{ p.tanggal }}

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

Lihat Dashboard

" @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:

  1. Tambahkan route /tambah-prestasi yang menampilkan form HTML (nama, prestasi, tanggal) untuk menambahkan data prestasi baru. Saat form disubmit (method POST), tambahkan data ke list prestasi_siswa.
  2. 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.