Ada jarak yang aneh antara “tahu Python” dan “boleh menggunakan Python”. Ramai orang menonton berpuluh-puluh video, menyalin contoh, dan berasa faham — lalu keliru apabila perlu menulis sesuatu dari kosong. Buku ini dibuat untuk menutup jarak itu.
Pendekatannya mudah: belajar dengan menjalankan. Setiap contoh dalam buku ini boleh terus dijalankan di dalam pelayar, di tempat itu juga. Anda tidak perlu memasang Python, tidak perlu menyediakan editor, tidak perlu menunggu sebarang proses. Baca, jalankan, ubah, jalankan semula — rasai sendiri apa yang berubah.
Buku ini melalui tiga bahagian yang berurutan:
Setiap bab mempunyai corak yang sama: penerangan ringkas yang padat, contoh yang boleh dijalankan, kemudian latihan beserta penyelesaian yang boleh dibuka. Jangan langkau latihan. Membaca membuatkan anda mengenali; menulis dan menjalankan yang membuatkan anda mampu.
Catatan jujur. Tidak semua perkara boleh dijalankan di dalam pelayar. Bab yang memerlukan fail di komputer anda, pakej dari internet, rangkaian, atau atur cara yang berjalan lama akan menandakannya dengan jelas, dan mengarahkan anda ke persekitaran yang sesuai. Itu bukan kelemahan — itu sebahagian daripada belajar tahu di mana sesuatu patut dijalankan.
Selamat membaca, dan selamat berkarya.
— RWID
Buku ini bukan buku biasa: ia mempunyai Python di dalamnya. Setiap contoh kod boleh terus dijalankan, tanpa memasang apa-apa.
Bar atas pembaca mempunyai Makmal. Di dalamnya ada Makmal Python: interpreter Python yang tertanam dalam buku ini, tempat anda mencuba kod tanpa meninggalkan halaman. Untuk projek yang lebih besar, buka IDE penuh, editor lengkap dalam tetingkapnya sendiri tempat anda menyimpan dan menjalankan fail anda.
Di atas setiap blok kod ada dua butang:
Saranku. Jangan hanya menekan Jalankan. Ubah dahulu nombornya, tukar namanya, rosakkan dengan sengaja — kemudian lihat apa yang berlaku. Kesilapan ialah guru yang paling pantas.
Python dalam pelayar itu nyata, tetapi ia hidup di dalam kotak pasir (sandbox). Ia tidak boleh menyentuh fail di komputer anda, memasang pakej dari internet, atau membuka rangkaian. Jadi sebahagian topik — dengan jujur — tidak boleh dijalankan di sini. Bab sebegitu menandakannya dengan jelas:
Perlu persekitaran setempat. Ini tidak boleh dijalankan dalam pelayar. Ikuti panduannya, dan jalankan di Python setempat + VS Code atau Google Colab.
Panduan lengkap memasang Python setempat ada di Lampiran C. Ringkasnya:
| ✅ Berjalan di sini | ⚠️ Terhad di sini | ❌ Perlu persekitaran setempat |
|---|---|---|
| Python tulen & stdlib asas | Pengiraan/saiz besar | Baca-tulis fail di komputer anda |
| NumPy, pandas, Matplotlib | Tanpa rangkaian sebenar | pip install sebarang pakej |
| scikit-learn (skala kecil) | Storan tidak kekal | requests, socket, pangkalan data |
HTML melalui rwid.show_html | GUI (tkinter/turtle), os/subprocess | |
multiprocessing, pelayan (Flask/FastAPI) |
Bahagian I dan satu bab pembuka Bahagian II boleh dibaca percuma. Untuk membuka keseluruhan buku — hingga projek akhir — aktifkan dengan 25 melalui butang di hujung bab sampel terakhir, atau dari aplikasi Books / Kedai.
Selamat menjelajah. Mulakan dari halaman seterusnya.
Klik tajuk untuk melompat. Bab bertanda kunci perlu diaktifkan ( 25).
Setiap perjalanan bermula dari satu baris. Dalam Python, baris itu ialah print(). Mari kita jalankan yang paling mudah dahulu, kemudian membedah apa yang sebenarnya berlaku.
print("Halo, dunia!")
Satu baris, satu arahan. print() ialah fungsi: ia menerima sesuatu di dalam tanda kurungan, lalu memaparkannya ke skrin. Teks yang diapit tanda petikan — seperti "Halo, dunia!" — dipanggil string.
Anda boleh memaparkan lebih daripada satu perkara serentak, dipisahkan koma:
print("Nama saya", "Eko")
print("2 + 3 =", 2 + 3)
Perhatikan: "Nama saya" dan "Eko" dipisahkan ruang secara automatik, manakala 2 + 3 benar-benar dikira dahulu menjadi 5, barulah dicetak.
Baris yang bermula dengan # diabaikan oleh Python. Kita menggunakannya untuk menerangkan mengapa, bukan apa.
# Ini komen: Python tidak menjalankannya.
print("Halo") # komen boleh di hujung baris juga
Kod yang baik berbicara melalui namanya; komen digunakan apabila sebabnya tidak jelas daripada kod itu sendiri.
Cuba jalankan kod berikut. Sengaja salah, supaya anda mengenali wajah ralat:
print("Halo"
Python akan berhenti dan melaporkan SyntaxError. Ini bukan bencana — ini Python memberitahu bahawa ada tanda kurungan yang belum ditutup. Membaca mesej ralat ialah kemahiran utama. Biasanya baris terakhir mesej itulah intipatinya.
print("Halo")
Bandingkan: satu huruf tambahan, dan semuanya berjalan.
Python membaca atur cara dari atas ke bawah. Setiap print() dijalankan secara berurutan:
print("Satu")
print("Dua")
print("Tiga")
Kita akan membincangkan pemboleh ubah secara tuntas dalam bab seterusnya, tetapi satu contoh kecil di sini akan membantu:
nama = "Eko"
tahun_lahir = 1990
print("Hai,", nama)
print("Usia pada 2026:", 2026 - tahun_lahir)
Tanda = memberi nama kepada sesuatu nilai. Selepas nama = "Eko", di mana-mana kita menulis nama, Python menggantikannya dengan "Eko".
17 * 24.panjang = 8 dan lebar = 5, kemudian paparkan luas segi empat tepatnya.SyntaxError, jalankan, dan baca mesej ralatnya. Kemudian betulkan.# 1
print("Eko")
print("Yogyakarta")
# 2
print(17 * 24)
# 3
panjang = 8
lebar = 5
print("Luas:", panjang * lebar)
# 4 — kesilapan lazim: kurungan tidak ditutup
# print("Halo"
print("Halo")
print() memaparkan nilai ke skrin.# memulakan komen yang diabaikan Python.Dalam bab seterusnya kita berkenalan dengan lebih serius dengan pemboleh ubah dan jenis data.
Pemboleh ubah ialah cara kita memberi nama kepada sesuatu supaya boleh digunakan semula. Python tidak menuntut kita mengisytiharkan jenis — ia meneka daripada nilai — tetapi memahami jenis data tetap wajib, kerana jenis menentukan apa yang boleh dan tidak boleh dilakukan.
umur = 25
nama = "Siti"
tinggi = 1.68
menikah = False
Empat baris, empat jenis asas: int (25), str ("Siti"), float (1.68), dan bool (False). Untuk melihat jenis sesuatu, gunakan type():
print(type(25)) # <class 'int'>
print(type(1.68)) # <class 'float'>
print(type("Siti")) # <class 'str'>
print(type(False)) # <class 'bool'>
int ialah nombor bulat; float ialah nombor berperpuluhan. Pembahagian sentiasa menghasilkan float:
print(10 / 3) # 3.3333333333333335
print(10 // 3) # 3 (pembahagian bulat)
print(10 % 3) # 1 (baki bahagi)
print(2 ** 10) # 1024 (kuasa)
Operator // dan % ialah sahabat harian: satu untuk membahagi rata, satu untuk baki. Bersama-sama, kedua-duanya boleh memecahkan nombor kepada digit:
menit = 145
print(menit // 60, "jam", menit % 60, "menit") # 2 jam 25 menit
String boleh digabungkan dengan + dan diulang dengan *:
depan = "Eko"
belakang = "Wibowo"
print(depan + " " + belakang)
print("ha" * 3) # hahaha
print(len("Python")) # 6
Kita akan menggali string dengan lebih dalam dalam Bab 7. Buat masa ini, cukup ingat bahawa string ialah deretan aksara, dan len() mengira panjangnya.
bool hanya mempunyai dua nilai: True dan False. Nilai ini muncul daripada perbandingan:
print(5 > 3) # True
print(5 == 5) # True (perhatikan: == untuk membandingkan, = untuk mengisi)
print(5 != 5) # False
Perangkap klasik.
=mengisi pemboleh ubah;==membandingkan. Tertukar satu tanda ini ialah salah satu kesilapan paling kerap bagi pemula.
Kadangkala kita perlu menukar jenis. Fungsi int(), float(), dan str() melakukannya:
nomor = "42" # ini string, bukan nombor
print(nomor + "5") # 425 (bercantum, bukan menjumlah!)
print(int(nomor) + 5) # 47 (sekarang benar-benar dijumlahkan)
print(str(100) + "!") # 100!
print(int(3.9)) # 3 (dipotong, bukan dibundarkan)
Cara paling selesa mencetak nilai campuran ialah f-string — string berawalan f yang boleh memuatkan ungkapan di dalam {}:
nama = "Eko"
umur = 36
print(f"Hai {nama}, usiamu {umur} tahun.")
print(f"Setahun lagi: {umur + 1}")
print(f"Pi sekitar {3.14159:.2f}") # 2 digit selepas titik perpuluhan
f-string akan terus muncul sepanjang buku ini. Kuasainya mulai sekarang.
Kadangkala sesuatu pemboleh ubah belum mempunyai nilai. Dalam Python, “belum ada” diwakili oleh None:
hasil = None
print(hasil) # None
print(hasil is None) # True
None berbeza daripada 0, berbeza daripada "". Ia benar-benar “tiada”.
200 minit."7" dan 3; jumlahkan sebagai nombor, kemudian paparkan hasilnya.berat = 72.5 (kg) dan tinggi = 1.75 (m), kemudian kira indeks jisim badan berat / tinggi ** 2 dan paparkan dengan 1 digit selepas titik perpuluhan.# 1
depan = "Eko"
belakang = "Wibowo"
tahun = 1990
print(f"{depan} {belakang}, lahir {tahun}.")
# 2
total = 200
print(f"{total // 60} jam {total % 60} menit")
# 3
print(int("7") + 3)
# 4
berat = 72.5
tinggi = 1.75
imt = berat / tinggi ** 2
print(f"IMT: {imt:.1f}")
int, float, str, bool, dan None.// membahagi bulat, % mengambil baki, ** memangkatkan.= mengisi, == membandingkan.Mengapa kod Python yang baik terasa ringkas dan senang dibaca? Kerana ia menggunakan idiom — cara menulis yang sudah lazim dalam kalangan Pythonista. Bab ini mengajarkan komprehensi dan sejumlah tabiat yang menjadikan kod lebih pendek, jelas, dan pythonik.
Cara lama mengisi sebuah list:
kuadrat = []
for x in range(1, 6):
kuadrat.append(x ** 2)
print(kuadrat)
Komprehensi memadatkannya menjadi satu baris:
kuadrat = [x ** 2 for x in range(1, 6)]
print(kuadrat) # [1, 4, 9, 16, 25]
genap = [x for x in range(10) if x % 2 == 0]
print(genap) # [0, 2, 4, 6, 8]
Coraknya: [ungkapan for item in iterable], ditapis secara pilihan dengan if.
Untuk dict, gunakan {kunci: nilai for ...}; untuk set, {...}:
panjang = {kota: len(kota) for kota in ["jakarta", "bali", "medan"]}
print(panjang)
unik = {huruf.lower() for huruf in "Halo Dunia" if huruf != " "}
print(sorted(unik))
enumerate memberi nombor urutan; zip berjalan atas dua list serentak:
buah = ["apel", "mangga", "jeruk"]
for nomor, nama in enumerate(buah, start=1):
print(f"{nomor}. {nama}")
nama = ["Eko", "Siti"]
umur = [36, 25]
for n, u in zip(nama, umur):
print(f"{n} berusia {u} tahun")
Kedua-duanya mengembalikan iterator, jadi jimat memori. zip berhenti pada list yang terpendek.
Syarat ringkas boleh ditulis dalam satu baris; unpacking membongkar urutan ke beberapa pemboleh ubah:
umur = 20
print("dewasa" if umur >= 18 else "anak")
a, b = 1, 2
a, b = b, a # tukar tanpa pemboleh ubah bantu
print(a, b)
kepala, *ekor = [1, 2, 3, 4]
print(kepala, ekor) # 1 [2, 3, 4]
f-string boleh mengatur format nombor dan penjajaran:
nilai = 1234567.891
print(f"{nilai:,.2f}") # 1,234,567.89
print(f"{0.87:.1%}") # 87.0%
print(f"{42:05d}") # 00042
print(f"{'kanan':>10}|")
print(f"{'kiri':<10}|")
Operator walrus := memberi nilai sambil menguji:
data = [1, 2, 3, 4, 5, 6]
if (n := len(data)) > 3:
print(f"ada {n} item")
from collections import Counter
kata = "susu roti susu teh roti susu".split()
print(Counter(kata).most_common(2))
pengguna = {"nama": "Eko"}
print(pengguna.get("kota", "tidak diketahui"))
harga = {"beras": 12000, "gula": 15000, "minyak": 18000}, cipta dict baharu berisi harga selepas diskaun 10%.zip + komprehensi dict untuk memadankan ["a", "b", "c"] dengan [1, 2, 3].["Nasi Goreng", "Mie Ayam", "Sate"] menggunakan enumerate.hasil = []
for x in range(1, 11):
if x % 3 == 0:
hasil.append(x * x)
# 1
print([x ** 2 for x in range(1, 11) if x % 2 == 1])
# 2
harga = {"beras": 12000, "gula": 15000, "minyak": 18000}
print({nama: int(bayar * 0.9) for nama, bayar in harga.items()})
# 3
kunci = ["a", "b", "c"]
nilai = [1, 2, 3]
print({k: v for k, v in zip(kunci, nilai)})
# 4
for nomor, item in enumerate(["Nasi Goreng", "Mie Ayam", "Sate"], start=1):
print(f"{nomor}. {item}")
# 5
print([x * x for x in range(1, 11) if x % 3 == 0])
enumerate memberi nombor; zip berjalan atas beberapa urutan serentak.a if syarat else b untuk syarat ringkas.* menampung bakinya.:= memberi nilai sekali gus menguji.Dalam bab seterusnya kita memecahkan atur cara menjadi modul dan pakej yang boleh diimport.