Ekstrakurikuler CSSE: Computer Science & Software Engineering (Python)
upper/lower/strip/replace, split/join, f-string, cek isi dengan in/find/count, dan challenge perbaiki input user (strip + title).count() untuk menghitung kemunculan huruf (main tebak frekuensi huruf nama), dan method chain seperti nama.strip().title().upper() dirangkai satu baris.
upper(), lower(), dan strip() untuk mengubah bentuk huruf & membersihkan spasi tepi.replace() dan menyimpan hasilnya ke variabel baru.split() dan merekatkannya kembali dengan join().+ (concatenation).in, find(), dan len().Hari ini siswa menempuh barisan ke-13 dari 17 — 76% perjalanan:
| Waktu | Blok | Aktivitas |
|---|---|---|
| 10' | Pembuka | Cover, tujuan sesi, rekap Sesi 12 (def, return vs print, mesin mini) |
| 10' | Demo | Memproses nama & teks: input kotor " budi " diubah jadi rapi di depan kelas |
| 25' | Materi 1 | String = deretan karakter: indexing & slicing; method upper/lower/strip/replace; sifat immutable |
| 30' | Praktik | Teks diubah UPPER/lower, ganti kata; split & join; cek isi dengan in/find |
| 15' | Challenge | Perbaiki input user: strip + title + hitung panjang (penilaian sesi ini) |
| 10' | Penutup | Pembahasan singkat challenge, rangkuman 5 poin, preview Sesi 14 |
String = rangkaian gerbong kereta. Tiap karakter satu gerbong, bernomor mulai dari 0 — persis loker list di Sesi 11. nama[0] = gerbong depan, nama[-1] = gerbong terakhir, nama[0:3] = rangkaian tiga gerbong pertama (batas stop tetap garis finis yang tidak diinjak). Keuntungan besar: kalian tidak belajar sistem baru — indexing list tinggal dipindah ke string. Bedanya cuma satu: isi gerbong adalah karakter, bukan angka.
Ini konsep paling penting hari ini (catatan pengajar kurikulum). String itu ditulis dengan spidol permanen: begitu dibuat, isinya tidak bisa dihapus atau diganti. nama[0] = "B" langsung ditolak Python. Lalu bagaimana cara "mengubah"? Fotokopi kertasnya, koreksi di salinan, simpan salinan itu: nama = nama.upper(). Konsekuensi yang wajib dipahami: semua method string mengembalikan string baru — teks.upper() yang tidak disimpan akan hilang lenyap. Kontras dengan list (Sesi 11): nilai.append(95) mengubah list langsung, tapi nama.upper() tidak mengubah apa pun kalau hasilnya dibuang.
nama.upper() yang dicetak sendirian lalu siswa bertanya "kok nggak berubah?". Jangan jawab langsung — minta mereka bandingkan dengan nilai.append(95) dari Sesi 11: append mengubah aslinya, upper tidak. Dari sini lahir kebiasaan: hasil method string selalu disimpan.
split() = gunting: kalimat dipotong di tiap spasi, hasilnya list kata — kalimat kini jadi benda yang bisa diloop, dihitung, diurutkan (alat Sesi 11 semua jalan). join() = lem: list kata direkatkan kembali jadi satu kalimat dengan lem pilihanmu ("-", " ", ", "). Berdua mereka jembatan dua arah antara string dan list. Pola sehari-hari yang realistis: nama lengkap "Budi Santoso" di-split jadi ["Budi", "Santoso"] — dari situ bisa diambil inisial, dihitung jumlah katanya, atau disusun ulang.
TypeError saat nama[0] = "B" = alarm spidol permanen: "ini tidak bisa diganti, fotokopi saja". AttributeError saat nama.append(...) = alarm salah alat: string bukan list — kalau butuh list, gunting dulu dengan split(). Dan find() yang mengembalikan -1 bukan error — itu cara Python bilang "tidak ketemu" (kayak nomor loker yang memang tidak ada isinya). Semua alarm hari ini mengarah ke satu pemahaman: string dan list adalah benda berbeda dengan aturan berbeda.
input() apa adanya mengandung spasi tak terlihat. Demo kecil yang kuat: print(len(input())) lalu ketik nama diikuti spasi — panjangnya lebih besar dari dugaan. Dari situ strip() terasa kebutuhan, bukan hafalan.
Minta siswa menulis dan menjalankan (dasar kode.py):
teks = " Python itu seru "
bersih = teks.strip()
print(bersih) # Python itu seru - spasi tepi hilang
print(bersih[0]) # P - karakter pertama
print(bersih[0:6]) # Python - slicing, batas stop tidak ikut
print(bersih[-4:]) # seru - empat karakter terakhir
print(len(bersih)) # 15
Diskusikan: kenapa perlu strip() dulu sebelum ambil [0]? Kalau tidak, teks[0] = spasi — karakter tak terlihat yang sering bikin bingung.
print(bersih.upper()) # PYTHON ITU SERU
print(bersih.lower()) # python itu seru
print(bersih.replace("seru", "menyenangkan"))
print(bersih) # Python itu seru - ASLINYA TIDAK BERUBAH
Moment kunci: baris terakhir. Setelah tiga method di atasnya, bersih masih asli. Minta siswa buktikan sendiri, lalu simpan hasilnya: baru = bersih.replace("seru", "menyenangkan") — baru terpakai. Ini penemuan immutable yang harus terjadi di tangan mereka, bukan dari ceramah.
kata = bersih.split()
print(kata) # ['Python', 'itu', 'seru']
print(kata[0]) # Python
print("-".join(kata)) # Python-itu-seru
print(" ".join(kata)) # Python itu seru - kembali seperti semula
Tantangan cepat: hitung berapa kata dalam kalimat (len(kata)), lalu cetak tiap kata satu per satu dengan loop — gunting dulu, sisanya alat Sesi 11. Lanjut cek isi: "Python" in teks, teks.find("itu"), teks.count("t").
Tulis bersama-sama program kecil di depan kelas:
nama_kotor = input("Masukkan nama: ") # diketik: " budi sanTOso "
nama_rapi = nama_kotor.strip().title()
print("Halo,", nama_rapi) # Halo, Budi Santoso
Tunjukkan efek tanpa strip(): " budi" dan "budi" dianggap string berbeda saat dibandingkan. Ini fondasi challenge.
Program penilaian sesi ini: membersihkan nama user. Ketikan user acak — spasi berlebih, huruf kapital kacau. Output yang diharapkan:
Masukkan nama: budi sanTOso
Nama rapi : Budi Santoso
Panjang : 12
Huruf kecil: budi santoso
Awalan 'b'? True
Yakni: strip().title() untuk kebersihan, len() untuk panjang, lower() untuk versi kecil, startswith("b") atau nama_rapi[0].lower() == "b" untuk cek awalan. Tambahan untuk yang cepat: proses tiga nama dalam list pakai loop (jembatan ke kode.py bagian kumulatif).
Bedah solusi challenge: minta satu siswa membacakan chain method-nya dan menjelaskan kenapa urutan strip() dulu baru title() penting. Tutup dengan rangkuman 5 poin + preview Sesi 14.
Kode lengkap per bagian ada di kode.py. Berikut solusi utuh mandiri yang bisa dijalankan (dasar kode.py + challenge penilaian), dengan output harapan di komentar:
# ============ SESI 13 - STRING MANIPULATION ============
# String = deretan karakter, immutable - hasil method selalu string BARU.
# --- BAGIAN 1: indexing & slicing (kode.py) ---
teks = " Python itu seru "
bersih = teks.strip() # spasi di kedua tepi dipotong
print(bersih) # Python itu seru
print(bersih[0:6]) # Python
print(bersih[-4:]) # seru
# --- BAGIAN 2: ubah bentuk (hasil disimpan ke variabel baru!) ---
huruf_besar = bersih.upper()
huruf_kecil = bersih.lower()
print(huruf_besar) # PYTHON ITU SERU
print(huruf_kecil) # python itu seru
ganti = bersih.replace("seru", "menyenangkan")
print(ganti) # Python itu menyenangkan
# --- BAGIAN 3: split & join (gunting & lem) ---
kata = bersih.split()
print(kata) # ['Python', 'itu', 'seru']
print("-".join(kata)) # Python-itu-seru
# --- BAGIAN 4: cek isi ---
print("Python" in teks) # True
print(bersih.find("itu")) # 7 (posisi karakter pertama)
print(bersih.count("t")) # 2
# --- BAGIAN 5: challenge - perbaiki input user (penilaian) ---
nama_kotor = input("Masukkan nama: ") # contoh diketik: " budi sanTOso "
nama_rapi = nama_kotor.strip().title()
print("Nama rapi :", nama_rapi) # Budi Santoso
print("Panjang :", len(nama_rapi)) # 12
print("Huruf kecil:", nama_rapi.lower()) # budi santoso
print("Awalan 'b'?", nama_rapi[0].lower() == "b") # True
# --- BAGIAN 6: case kumulatif - format daftar siswa (kode.py) ---
nama = ["budi", "ani", "cici"]
for item in nama:
label = item.strip().title()
print(f"Siswa: {label}")
# Siswa: Budi
# Siswa: Ani
# Siswa: Cici
# --- BAGIAN 7: bukti immutable ---
print(label) # Cici - aslinya tetap
print(label.upper()) # CICI - hanya hasil cetakannya
Contoh jalannya bagian challenge:
Masukkan nama: budi sanTOso
Nama rapi : Budi Santoso
Panjang : 12
Huruf kecil: budi santoso
Awalan 'b'? True
Kunci pembahasan: setiap hasil method disimpan ke variabel (huruf_besar, nama_rapi) karena string tidak pernah berubah sendiri; strip().title() dirangkai karena hasil kiri menjadi bahan kanan; dan bagian 7 adalah bukti visual immutable yang wajib ditunjukkan ke kelas.
| Masalah | Penyebab | Tindakan Perbaikan |
|---|---|---|
nama.upper() "tidak berfungsi" — teks tetap kecil |
String immutable (catatan pengajar kurikulum): hasil method dibuang karena tidak disimpan ke variabel. | Analogi fotokopi: nama = nama.upper() — koreksi disimpan di salinan. Cek posisi: ada tanda = atau hasilnya langsung di-print. |
TypeError: 'str' object does not support item assignment |
Mencoba nama[0] = "B" — string tidak bisa diganti per karakter (beda dengan list). |
Bangun string baru: nama = "B" + nama[1:], atau pakai method (replace/title) lalu simpan hasilnya. |
AttributeError: 'str' object has no attribute 'append' |
Memperlakukan string seperti list: nama.append("x"). |
Tegaskan dua benda berbeda: string bisa + (concatenation) atau join; kalau butuh list, gunting dulu dengan split(). |
IndexError: string index out of range |
Mengakses teks[50] padahal string pendek — aturan loker Sesi 11 tetap berlaku. |
Cek len(teks) dulu; indeks terakhir = len(teks) - 1. Perhatikan: strip() mengubah panjang, jadi hitung setelah dibersihkan. |
| Nama user selalu "tidak cocok" saat dibandingkan | Spasi tak terlihat & kapitalisasi acak dari input() tidak dibersihkan (" budi " ≠ "budi"). |
Polakan ritual input: input(...).strip() minimum, .title() untuk tampilan. Demo len(input()) untuk membuktikan spasi terhitung. |
split(" ") menghasilkan string kosong '' di list |
Dua spasi beruntun: "budi ani".split(" ") memotong di spasi kosong juga. |
Pakai split() tanpa argument — Python otomatis membersihkan spasi beruntun. |
upper/lower/strip/replace dan menyimpan hasilnya ke variabel.split() dan merekatkan dengan join() di dua arah.in/find() dan panjangnya dengan len().strip() sebagai kebiasaan di setiap input() teks, bukan sekadar ikut contoh.Tiga minggu terakhir kalian mengumpulkan alat: list (keranjang data), fungsi (mesin mini), string (pembersih teks). Minggu depan semuanya dirakit jadi satu: Mini Project 2 — aplikasi berbasis menu yang beneran dipakai: Todo List atau Kasir Warung Mini. Program dengan menu yang terus menyala, menerima perintah, dan datanya hidup selama aplikasi jalan.
while True:
print("1. Lihat 2. Tambah 3. Hapus 4. Keluar")
pilih = input("Pilih menu: ").strip()
if pilih == "4":
print("Sampai jumpa!")
break
Pola menu sederhana ini adalah kerangka Mini Project 2 minggu depan — dan pemanasan langsung untuk Final Project (Sesi 16-17). Simpan baik-baik list, fungsi, dan kebiasaan strip() kalian.