1. Pengenalan Python

Python adalah bahasa pemrograman interpreted, high-level, general-purpose yang menekankan pada keterbacaan kode dengan menggunakan indentasi yang signifikan.

Karakteristik Utama Python:

  • Interpreted - Tidak perlu kompilasi, langsung dijalankan
  • Dynamic typing - Tipe data ditentukan saat runtime
  • Indentation-based - Blok kode menggunakan indentasi, bukan kurung kurawal
  • Batteries included - Standard library yang sangat lengkap
  • Multi-paradigm - Mendukung OOP, functional, procedural
  • Easy to learn - Sintaks sederhana mirip bahasa Inggris
Tahukah kamu? Nama Python diambil dari acara televisi BBC "Monty Python's Flying Circus", bukan dari nama ular. Guido van Rossum adalah penggemar berat Monty Python.
Contoh program pertama: hello.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# Menampilkan teks ke console
print("Hello, World!")
print("Selamat belajar Python!")

# Variabel sederhana
nama = "Python"
tahun = 1991
print(f"{nama} dirilis tahun {tahun}")  # f-string (format string)

# Input dari user
nama_user = input("Siapa nama kamu? ")
print(f"Halo, {nama_user}! Selamat datang di Python.")
Tips: Python menggunakan print() untuk output dan input() untuk input. Tidak perlu ; di akhir baris. Indentasi (spasi/tab) sangat penting di Python!

2. Instalasi & Environment

Cara Install Python:

Windows
1. Download installer dari https://www.python.org/downloads/
2. Jalankan installer
3. PASTIKAN centang "Add Python to PATH"
4. Pilih "Install Now" atau kustomisasi
5. Verifikasi dengan membuka CMD dan ketik: python --version
Linux (Ubuntu/Debian)
sudo apt update
sudo apt install python3 python3-pip
python3 --version
macOS
# Via Homebrew
brew install python3

# Atau download installer dari python.org

Package Manager: pip

pip adalah package manager untuk Python, digunakan untuk menginstall library tambahan.

Perintah pip dasar
# Install package
pip install nama_package

# Install package versi tertentu
pip install nama_package==1.2.3

# Uninstall package
pip uninstall nama_package

# List installed packages
pip list

# Freeze requirements (untuk project)
pip freeze > requirements.txt

# Install dari requirements file
pip install -r requirements.txt

Virtual Environment:

Virtual environment digunakan untuk mengisolasi dependency setiap project.

Membuat virtual environment
# Buat virtual environment
python -m venv nama_env

# Aktifkan (Windows)
nama_env\Scripts\activate

# Aktifkan (Linux/macOS)
source nama_env/bin/activate

# Nonaktifkan
deactivate

IDE yang direkomendasikan:

PyCharm (Community Edition gratis)
VS Code dengan extension Python
Jupyter Notebook (untuk data science)
IDLE (bawaan Python)

3. Sintaks Dasar Python

Aturan dasar penulisan Python:

  • File Python berekstensi .py
  • Tidak perlu titik koma (;) di akhir statement
  • Blok kode menggunakan indentasi (biasanya 4 spasi), bukan kurung kurawal
  • Komentar: # untuk single line
  • Multi-line comment menggunakan triple quotes """ ... """
  • Case-sensitive (huruf besar/kecil dibedakan)
  • Dynamic typing - tidak perlu deklarasi tipe data
Penting: Indentasi di Python SANGAT PENTING. Indentasi yang salah akan menyebabkan error atau perilaku yang tidak diinginkan. Konsistenlah dengan jumlah spasi (biasanya 4 spasi, jangan campur dengan tab).
Contoh sintaks dasar
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
Ini adalah multi-line comment / docstring.
Bisa digunakan untuk dokumentasi modul, fungsi, atau class.
"""

# Ini komentar single line

# Variable assignment (tanpa deklarasi tipe)
nama = "Python"
versi = 3.11
tahun_rilis = 1991
is_populer = True

# Output ke console
print("Hello, World!")  # Ini juga komentar

# Input dari user
nama_user = input("Siapa nama Anda? ")

# Conditional dengan indentasi
if nama_user:
    print(f"Halo, {nama_user}!")
else:
    print("Halo, anonymous!")

# Fungsi sederhana dengan indentasi
def sapa(nama):
    """Fungsi untuk menyapa"""
    pesan = f"Halo, {nama}!"
    return pesan

# Memanggil fungsi
hasil = sapa("Budi")
print(hasil)

# Tidak perlu main function khusus, langsung dieksekusi
print("Program selesai")
Tips: Gunakan python nama_file.py untuk menjalankan program. Atau beri shebang #!/usr/bin/env python3 di Linux/macOS agar bisa langsung dijalankan.

4. Variabel & Tipe Data

Tipe data dasar di Python:

Tipe Kelas Contoh Deskripsi
intint10, -5, 1000000Integer (bilangan bulat)
floatfloat3.14, 2.5, -0.001Bilangan desimal
complexcomplex3+4j, 2jBilangan kompleks
strstr"hello", 'world'String (teks)
boolboolTrue, FalseBoolean (true/false)
NoneTypeNoneTypeNoneTidak ada nilai
listlist[1,2,3], ["a","b"]List (mutable, berurutan)
tupletuple(1,2,3), ("a","b")Tuple (immutable, berurutan)
dictdict{"nama":"Budi", "umur":20}Dictionary (key-value)
setset{1,2,3}, {"a","b"}Set (unik, tidak berurutan)

Aturan penamaan variabel:

  • Bisa huruf, angka, underscore (_)
  • Tidak boleh diawali angka
  • Case-sensitive (umur != Umur)
  • Tidak boleh menggunakan keyword Python (if, else, while, dll)
  • Konvensi: snake_case untuk variabel dan fungsi

Dynamic Typing:

Python adalah dynamic typing, artinya tipe data ditentukan saat runtime dan bisa berubah.

Contoh variabel dan tipe data
# Deklarasi variabel (tanpa tipe)
nama = "Budi"
umur = 20
tinggi = 175.5
menikah = False
hobi = None  # null

print(f"Nama: {nama}, tipe: {type(nama)}")
print(f"Umur: {umur}, tipe: {type(umur)}")
print(f"Tinggi: {tinggi}, tipe: {type(tinggi)}")
print(f"Menikah: {menikah}, tipe: {type(menikah)}")
print(f"Hobi: {hobi}, tipe: {type(hobi)}")

# Dynamic typing - variabel bisa berubah tipe
x = 10
print(f"x = {x}, tipe: {type(x)}")

x = "sepuluh"
print(f"x = {x}, tipe: {type(x)}")

x = 3.14
print(f"x = {x}, tipe: {type(x)}")

# Multiple assignment
a, b, c = 1, 2, 3
print(f"a={a}, b={b}, c={c}")

# Assignment dengan nilai sama
x = y = z = 100
print(f"x={x}, y={y}, z={z}")

# Konstanta (konvensi UPPER_CASE)
PI = 3.14159
MAX_USERS = 1000
# Tetap bisa diubah, tapi konvensi menunjukkan konstanta

# Type conversion (casting)
angka_str = "123"
angka_int = int(angka_str)
angka_float = float(angka_str)
print(f"String '{angka_str}' jadi int: {angka_int}, float: {angka_float}")

# Cek tipe data
print(isinstance(umur, int))  # True
print(isinstance(nama, str))  # True

# Mengambil input (selalu string)
usia_input = input("Masukkan usia: ")
usia = int(usia_input)  # konversi ke int
print(f"Tahun depan usia: {usia + 1}")
Tips: Gunakan type() untuk mengecek tipe data variabel. Gunakan isinstance() untuk mengecek apakah suatu variabel instance dari tipe tertentu.

5. Operator

Jenis-jenis operator di Python:

Aritmatika

+ tambah - kurang * kali / bagi (float) // floor division % modulus ** pangkat

Perbandingan

== sama dengan != tidak sama > lebih besar < lebih kecil >= lebih besar sama dengan <= lebih kecil sama dengan

Logika

and AND or OR not NOT

Penugasan

= assignment += a += b -= a -= b *= a *= b /= a /= b //= a //= b %= a %= b **= a **= b

Keanggotaan

in ada di dalam not in tidak ada di dalam

Identitas

is object yang sama is not object berbeda

Bitwise

& AND | OR ^ XOR ~ NOT << left shift >> right shift
Contoh operator
# Operator Aritmatika
a, b = 10, 3
print(f"{a} + {b} = {a + b}")
print(f"{a} - {b} = {a - b}")
print(f"{a} * {b} = {a * b}")
print(f"{a} / {b} = {a / b}")        # 3.3333...
print(f"{a} // {b} = {a // b}")       # 3 (floor division)
print(f"{a} % {b} = {a % b}")         # 1 (modulus)
print(f"{a} ** {b} = {a ** b}")       # 1000 (10^3)

# Operator Perbandingan (menghasilkan boolean)
print(f"{a} == {b}: {a == b}")
print(f"{a} != {b}: {a != b}")
print(f"{a} > {b}: {a > b}")
print(f"{a} < {b}: {a < b}")

# Operator Logika
x, y = True, False
print(f"x and y: {x and y}")
print(f"x or y: {x or y}")
print(f"not x: {not x}")

# Operator Keanggotaan
list_buah = ["apel", "jeruk", "mangga"]
print("apel" in list_buah)        # True
print("durian" not in list_buah)  # True

# Operator Identitas
list1 = [1, 2, 3]
list2 = [1, 2, 3]
list3 = list1
print(f"list1 is list2: {list1 is list2}")  # False (objek berbeda)
print(f"list1 is list3: {list1 is list3}")  # True (objek sama)
print(f"list1 == list2: {list1 == list2}")  # True (nilai sama)

# Operator Ternary (conditional expression)
umur = 18
status = "dewasa" if umur >= 17 else "anak-anak"
print(f"Status: {status}")

# Operator Walrus (:=) - Python 3.8+
# Assignment dalam expression
if (n := len([1, 2, 3, 4, 5])) > 3:
    print(f"Panjang list adalah {n}, lebih dari 3")

# Operator Bitwise
a, b = 5, 3  # 5 = 0101, 3 = 0011
print(f"{a} & {b} = {a & b}")   # 1 (0001)
print(f"{a} | {b} = {a | b}")   # 7 (0111)
print(f"{a} ^ {b} = {a ^ b}")   # 6 (0110)
print(f"~{a} = {~a}")           # -6 (komplemen dua)
print(f"{a} << 1 = {a << 1}")   # 10 (1010)
print(f"{a} >> 1 = {a >> 1}")   # 2 (0010)
Catatan: Python tidak memiliki ++ dan -- operator. Gunakan i += 1 untuk increment.

6. String

String di Python adalah urutan karakter yang immutable (tidak bisa diubah setelah dibuat).

Cara membuat string:

str1 = 'Hello'           # petik satu
str2 = "World"           # petik dua
str3 = '''Multi-line     # triple quotes
string'''

Escape characters:

\n newline \t tab \\ backslash \' petik satu \" petik dua

String methods umum:

  • upper(), lower() - ubah huruf besar/kecil
  • strip() - hapus whitespace di awal/akhir
  • split() - pecah string menjadi list
  • join() - gabung list menjadi string
  • replace() - ganti substring
  • find() - cari posisi substring
  • startswith(), endswith() - cek awal/akhir
Contoh string manipulation
# String literals
s1 = 'Hello'
s2 = "World"
s3 = '''This is a
multi-line
string'''
s4 = """Also multi-line
with double quotes"""

print(s1, s2)
print(s3)

# Concatenation
gabung = s1 + " " + s2
print(gabung)  # Hello World

# Repetition
garis = "-" * 20
print(garis)

# String indexing (0-based)
teks = "Python"
print(f"teks[0] = {teks[0]}")    # P
print(f"teks[-1] = {teks[-1]}")  # n (indeks negatif dari belakang)

# Slicing [start:end:step]
print(f"teks[1:4] = {teks[1:4]}")    # yth (indeks 1-3)
print(f"teks[:3] = {teks[:3]}")      # Pyt (dari awal)
print(f"teks[3:] = {teks[3:]}")      # hon (sampai akhir)
print(f"teks[::-1] = {teks[::-1]}")  # nohtyP (reverse)

# String methods
kalimat = "  Hello, Python Programming!  "
print(f"upper: '{kalimat.upper()}'")
print(f"lower: '{kalimat.lower()}'")
print(f"strip: '{kalimat.strip()}'")
print(f"replace: '{kalimat.replace('Python', 'Java')}'")

# Split dan Join
data = "apel,jeruk,mangga,durian"
buah_list = data.split(',')
print(f"split: {buah_list}")

gabung_ulang = " - ".join(buah_list)
print(f"join: {gabung_ulang}")

# Cek string
email = "user@example.com"
print(f"email contains '@': {'@' in email}")
print(f"email startswith 'user': {email.startswith('user')}")
print(f"email endswith '.com': {email.endswith('.com')}")

# Format string (beberapa cara)
nama = "Budi"
umur = 20

# 1. f-string (Python 3.6+) - RECOMMENDED
print(f"Nama: {nama}, Umur: {umur}")

# 2. format() method
print("Nama: {}, Umur: {}".format(nama, umur))

# 3. % formatting (old style)
print("Nama: %s, Umur: %d" % (nama, umur))

# 4. Template string (jarang)
from string import Template
t = Template("Nama: $nama, Umur: $umur")
print(t.substitute(nama=nama, umur=umur))

# String length
print(f"Panjang string: {len(kalimat)}")

# Escape characters
print("Line 1\nLine 2")  # newline
print("Column 1\tColumn 2")  # tab
print("She said, \"Hello\"")  # petik dalam string

# Raw string (ignore escape)
print(r"Line 1\nLine 2")  # \n tidak di-escape

# Multiline string
multiline = """
Baris 1
Baris 2
Baris 3
"""
print(multiline)

7. List & Tuple

List

List adalah urutan item yang mutable (bisa diubah). List menggunakan kurung siku [].

buah = ["apel", "jeruk", "mangga"]

List methods:

  • append() - tambah item di akhir
  • insert() - tambah di posisi tertentu
  • remove() - hapus item pertama yang match
  • pop() - hapus dan return item di indeks
  • index() - cari indeks item
  • sort() - urutkan list
  • reverse() - balik urutan

Tuple

Tuple mirip list, tapi immutable (tidak bisa diubah). Tuple menggunakan kurung biasa ().

koordinat = (10, 20)
Kapan pakai tuple? Gunakan tuple untuk data yang tidak boleh berubah, seperti koordinat, konfigurasi, atau sebagai key di dictionary.
Contoh List
# Membuat list
buah = ["apel", "jeruk", "mangga"]
angka = [1, 2, 3, 4, 5]
campuran = ["teks", 123, 3.14, True]
list_dalam_list = [[1,2], [3,4], [5,6]]

print(f"buah: {buah}")
print(f"angka: {angka}")
print(f"campuran: {campuran}")

# Akses item (indexing)
print(f"buah[0]: {buah[0]}")
print(f"buah[-1]: {buah[-1]}")  # item terakhir

# Slicing list
print(f"angka[1:4]: {angka[1:4]}")
print(f"angka[:3]: {angka[:3]}")
print(f"angka[::2]: {angka[::2]}")  # step 2

# Mengubah item (karena mutable)
buah[1] = "durian"
print(f"setelah diubah: {buah}")

# List methods
buah.append("nanas")
print(f"after append: {buah}")

buah.insert(1, "strawberry")
print(f"after insert: {buah}")

buah.remove("apel")
print(f"after remove: {buah}")

item_terakhir = buah.pop()
print(f"pop: {item_terakhir}, sisa: {buah}")

angka.sort()
print(f"sorted ascending: {angka}")

angka.sort(reverse=True)
print(f"sorted descending: {angka}")

angka.reverse()
print(f"reversed: {angka}")

# List comprehension
kuadrat = [x**2 for x in range(1, 6)]
print(f"kuadrat 1-5: {kuadrat}")

genap = [x for x in range(1, 11) if x % 2 == 0]
print(f"bilangan genap 1-10: {genap}")

# Operasi list
list1 = [1, 2, 3]
list2 = [4, 5, 6]
gabung = list1 + list2
print(f"concatenation: {gabung}")

repeat = [0] * 5
print(f"repetition: {repeat}")

# Cek keberadaan
print(f"apakah 3 ada di list1? {3 in list1}")
print(f"apakah 10 ada di list1? {10 in list1}")

# Panjang list
print(f"panjang buah: {len(buah)}")

# Iterasi list
for item in buah:
    print(f"- {item}")

for i, item in enumerate(buah):
    print(f"{i}: {item}")

# Copy list (hati-hati)
list_asli = [1, 2, 3]
list_reference = list_asli  # ini referensi, bukan copy
list_copy = list_asli.copy()  # copy benar
list_slicing = list_asli[:]  # copy dengan slicing

list_asli[0] = 99
print(f"asli: {list_asli}")
print(f"reference: {list_reference}")  # ikut berubah
print(f"copy: {list_copy}")  # tidak berubah
Contoh Tuple
# Membuat tuple
point = (10, 20)
warna = (255, 128, 0)
campuran = ("teks", 123, True)
kosong = ()
single = (5,)  # koma penting untuk tuple satu elemen

print(f"point: {point}")
print(f"warna: {warna}")
print(f"campuran: {campuran}")

# Akses item (sama seperti list)
print(f"point[0]: {point[0]}")
print(f"point[-1]: {point[-1]}")

# Slicing
print(f"warna[1:]: {warna[1:]}")

# Tuple immutable - tidak bisa diubah!
# point[0] = 5  # ERROR!

# Tuple bisa berisi mutable object
t = ([1,2], [3,4])
t[0].append(99)  # ini OK, yang diubah isi list, bukan tuple
print(f"t: {t}")

# Packing and unpacking
koordinat = 100, 200  # tuple packing
x, y = koordinat  # tuple unpacking
print(f"x={x}, y={y}")

# Swap variable pakai tuple
a, b = 5, 10
a, b = b, a
print(f"a={a}, b={b}")

# Return multiple values dari function
def get_dimensions():
    return 1920, 1080

width, height = get_dimensions()
print(f"{width}x{height}")

# Tuple methods
t = (1, 2, 3, 2, 4, 2)
print(f"count 2: {t.count(2)}")
print(f"index of 3: {t.index(3)}")

# Kapan pakai tuple vs list
# - Gunakan tuple untuk data yang tidak berubah (immutable)
# - Gunakan list untuk data yang berubah

# Tuple sebagai key dictionary (list tidak bisa)
lokasi = {(40.7128, -74.0060): "New York", (51.5074, -0.1278): "London"}
print(lokasi[(40.7128, -74.0060)])

# Named tuple (seperti struct sederhana)
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(10, 20)
print(f"p.x={p.x}, p.y={p.y}")

8. Dictionary & Set

Dictionary

Dictionary adalah struktur data key-value (mapping). Menggunakan kurung kurawal {}.

siswa = {"nama": "Budi", "umur": 20}

Dictionary methods:

  • keys() - semua keys
  • values() - semua values
  • items() - semua pasangan (key, value)
  • get() - ambil value (aman, tidak error jika key tidak ada)
  • update() - update dengan dictionary lain
  • pop() - hapus key dan return value

Set

Set adalah kumpulan item unik (tidak ada duplikat) dan tidak berurutan.

angka = {1, 2, 3, 4, 5}

Set operations:

  • union() atau | - gabungan
  • intersection() atau & - irisan
  • difference() atau - - selisih
  • symmetric_difference() atau ^ - irisan terbalik
Contoh Dictionary
# Membuat dictionary
siswa = {
    "nama": "Budi",
    "umur": 20,
    "jurusan": "Informatika",
    "nilai": [85, 90, 78]
}

print(f"siswa: {siswa}")

# Akses value
print(f"nama: {siswa['nama']}")
print(f"umur: {siswa['umur']}")

# get() - aman (tidak error jika key tidak ada)
print(f"alamat: {siswa.get('alamat', 'tidak ada')}")

# Mengubah value
siswa["umur"] = 21
print(f"setelah diubah: {siswa}")

# Menambah key baru
siswa["alamat"] = "Jakarta"
print(f"setelah ditambah: {siswa}")

# Hapus key
del siswa["nilai"]
print(f"setelah dihapus: {siswa}")

# pop() - hapus dan return value
jurusan = siswa.pop("jurusan")
print(f"jurusan yang dihapus: {jurusan}")
print(f"sisa: {siswa}")

# Dictionary methods
print(f"keys: {list(siswa.keys())}")
print(f"values: {list(siswa.values())}")
print(f"items: {list(siswa.items())}")

# Iterasi dictionary
for key, value in siswa.items():
    print(f"{key}: {value}")

# Cek key
print(f"apakah ada key 'nama'? {'nama' in siswa}")
print(f"apakah ada key 'umur'? {'umur' in siswa}")

# Dictionary comprehension
kuadrat = {x: x**2 for x in range(1, 6)}
print(f"kuadrat: {kuadrat}")

# Nested dictionary
mahasiswa = {
    "budi": {"umur": 20, "ipk": 3.5},
    "ani": {"umur": 21, "ipk": 3.8},
    "citra": {"umur": 19, "ipk": 3.9}
}

print(f"IPK Budi: {mahasiswa['budi']['ipk']}")

# Merge dictionaries (Python 3.9+)
d1 = {"a": 1, "b": 2}
d2 = {"c": 3, "d": 4}
d3 = d1 | d2  # union operator
print(f"merged: {d3}")

# update()
d1.update(d2)
print(f"after update: {d1}")

# Default dictionary
from collections import defaultdict
dd = defaultdict(int)  # default value 0 untuk int
dd["a"] += 1
dd["b"] += 2
print(f"defaultdict: {dict(dd)}")
Contoh Set
# Membuat set
angka = {1, 2, 3, 4, 5}
buah = {"apel", "jeruk", "mangga"}
campuran = {1, "teks", 3.14, True}

print(f"angka: {angka}")
print(f"buah: {buah}")

# Set otomatis menghilangkan duplikat
duplikat = {1, 2, 2, 3, 3, 3, 4}
print(f"duplikat: {duplikat}")  # {1, 2, 3, 4}

# Membuat set dari list
list_angka = [1, 2, 2, 3, 3, 4]
set_dari_list = set(list_angka)
print(f"set dari list: {set_dari_list}")

# Menambah item
buah.add("durian")
print(f"after add: {buah}")

# Menambah multiple items
buah.update(["nanas", "strawberry"])
print(f"after update: {buah}")

# Menghapus item
buah.remove("apel")  # error jika tidak ada
buah.discard("apel")  # aman, tidak error
buah.pop()  # hapus item acak
buah.clear()  # hapus semua

# Set operations
A = {1, 2, 3, 4, 5}
B = {4, 5, 6, 7, 8}

print(f"A: {A}")
print(f"B: {B}")
print(f"Union (A | B): {A | B}")
print(f"Intersection (A & B): {A & B}")
print(f"Difference (A - B): {A - B}")
print(f"Difference (B - A): {B - A}")
print(f"Symmetric diff (A ^ B): {A ^ B}")

# Cek subset/superset
C = {1, 2, 3}
print(f"C subset A? {C.issubset(A)}")
print(f"A superset C? {A.issuperset(C)}")
print(f"Disjoint? {A.isdisjoint(B)}")  # False (ada irisan)

# Set comprehension
genap = {x for x in range(1, 11) if x % 2 == 0}
print(f"genap: {genap}")

# Frozenset (immutable set)
fs = frozenset([1, 2, 3])
# fs.add(4)  # ERROR! frozenset tidak bisa diubah

# Menghapus duplikat dari list
nama = ["budi", "ani", "budi", "citra", "ani"]
unik = list(set(nama))
print(f"nama unik: {unik}")

# Mencari item yang sama di dua list
list1 = [1, 2, 3, 4, 5]
list2 = [4, 5, 6, 7, 8]
sama = set(list1) & set(list2)
print(f"item yang sama: {sama}")

9. Control Flow (Percabangan)

if-elif-else

if kondisi1:
    # kode
elif kondisi2:
    # kode
else:
    # kode

Python tidak memiliki switch statement seperti C/Java. Gunakan if-elif-else atau match-case (Python 3.10+).

match-case (Python 3.10+)

Mirip switch di bahasa lain, tapi lebih powerful (pattern matching).

Tips: Di Python, kondisi tidak perlu tanda kurung, tapi bisa ditambahkan untuk kejelasan.
Contoh if-elif-else
# if-elif-else dasar
nilai = 85

if nilai >= 90:
    grade = 'A'
    print("Excellent!")
elif nilai >= 80:
    grade = 'B'
    print("Good job!")
elif nilai >= 70:
    grade = 'C'
    print("Not bad")
elif nilai >= 60:
    grade = 'D'
    print("Need improvement")
else:
    grade = 'E'
    print("Failed")

print(f"Grade: {grade}")

# Multiple kondisi dengan and/or
umur = 20
memiliki_sim = True

if umur >= 17 and memiliki_sim:
    print("Boleh mengemudi")
elif umur >= 17 and not memiliki_sim:
    print("Belum punya SIM")
else:
    print("Belum cukup umur")

# Ternary operator
status = "dewasa" if umur >= 17 else "anak-anak"
print(f"Status: {status}")

# Truthy and Falsy values
# Falsy: None, False, 0, 0.0, '' (string kosong), [], {}, set(), ()
nama = ""
if nama:
    print(f"Halo, {nama}")
else:
    print("Nama tidak diisi")

# Nested if
x = 10
y = 5

if x > 0:
    if y > 0:
        print("x dan y positif")
    else:
        print("x positif, y negatif")
else:
    print("x negatif")

# Menggunakan in untuk multiple checks
huruf = 'a'
if huruf in 'aeiou':
    print(f"{huruf} adalah vokal")
else:
    print(f"{huruf} adalah konsonan")

# Short-circuit evaluation
def divide(a, b):
    if b != 0 and a/b > 10:
        return "Besar"
    return "Kecil"

print(divide(20, 2))
Contoh match-case (Python 3.10+)
# match-case dasar (seperti switch)
def get_day_name(day):
    match day:
        case 1:
            return "Senin"
        case 2:
            return "Selasa"
        case 3:
            return "Rabu"
        case 4:
            return "Kamis"
        case 5:
            return "Jumat"
        case 6:
            return "Sabtu"
        case 7:
            return "Minggu"
        case _:  # default case
            return "Hari tidak valid"

print(get_day_name(3))

# Match dengan multiple patterns
def check_value(x):
    match x:
        case 0:
            print("Nol")
        case 1 | 2 | 3:  # multiple patterns
            print("Kecil")
        case 4 | 5 | 6:
            print("Sedang")
        case _:
            print("Besar")

check_value(2)

# Match dengan kondisi (guard)
def process_number(x):
    match x:
        case x if x < 0:
            print(f"{x} negatif")
        case x if x == 0:
            print("Nol")
        case x if x > 0:
            print(f"{x} positif")

process_number(-5)

# Match dengan tuple (destructuring)
point = (10, 20)
match point:
    case (0, 0):
        print("Origin")
    case (0, y):
        print(f"X=0, Y={y}")
    case (x, 0):
        print(f"X={x}, Y=0")
    case (x, y):
        print(f"X={x}, Y={y}")

# Match dengan object
class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

p = Point(10, 20)
match p:
    case Point(x=0, y=0):
        print("Origin")
    case Point(x=x, y=y):
        print(f"Point at ({x}, {y})")

# Match dengan list
items = ["apple", 5, 3.14]
match items:
    case [str(name), int(quantity), float(price)]:
        print(f"Product: {name}, Qty: {quantity}, Price: {price}")
    case _:
        print("Format tidak sesuai")

10. Perulangan (Loops)

for loop

for loop di Python digunakan untuk iterasi over sequence (list, tuple, string, range, dll).

for item in sequence:
    # kode

while loop

while kondisi:
    # kode

Kontrol loop:

  • break - keluar dari loop
  • continue - skip iterasi saat ini
  • else pada loop - dijalankan jika loop selesai tanpa break
Contoh for loop
# For loop dengan range
print("range(5):")
for i in range(5):  # 0-4
    print(i, end=" ")
print()

print("\nrange(1, 6):")
for i in range(1, 6):  # 1-5
    print(i, end=" ")
print()

print("\nrange(1, 10, 2):")  # step 2
for i in range(1, 10, 2):
    print(i, end=" ")
print()

# For loop dengan list
buah = ["apel", "jeruk", "mangga", "durian"]
print("\nDaftar buah:")
for buah_item in buah:
    print(f"- {buah_item}")

# For loop dengan enumerate (dapat index)
print("\nDengan index:")
for i, buah_item in enumerate(buah):
    print(f"{i}: {buah_item}")

# For loop dengan string
kata = "Python"
print("\nKarakter dalam 'Python':")
for char in kata:
    print(char, end=" ")
print()

# For loop dengan dictionary
siswa = {"nama": "Budi", "umur": 20, "jurusan": "Informatika"}
print("\nIterasi dictionary:")
for key, value in siswa.items():
    print(f"{key}: {value}")

# For loop dengan zip (iterasi multiple sequences)
nama = ["Budi", "Ani", "Citra"]
umur = [20, 21, 19]
for n, u in zip(nama, umur):
    print(f"{n} berumur {u} tahun")

# Nested for loop
print("\nTabel perkalian 3x3:")
for i in range(1, 4):
    for j in range(1, 4):
        print(f"{i*j:4}", end="")
    print()
Contoh while loop dan kontrol
# While loop dasar
print("While loop:")
counter = 1
while counter <= 5:
    print(f"Counter: {counter}")
    counter += 1

# While dengan input user
print("\nTebak angka (0 untuk berhenti):")
angka = -1
while angka != 0:
    angka = int(input("Masukkan angka: "))
    if angka != 0:
        print(f"Anda memasukkan {angka}")

# Break
print("\nBreak contoh:")
for i in range(1, 11):
    if i == 5:
        break
    print(i, end=" ")
print("\nLoop berhenti di 5")

# Continue
print("\nContinue contoh (skip angka genap):")
for i in range(1, 11):
    if i % 2 == 0:
        continue
    print(i, end=" ")
print()

# Else pada loop
print("\nLoop dengan else:")
for i in range(1, 4):
    print(i)
else:
    print("Loop selesai tanpa break")

print("\nLoop dengan break dan else:")
for i in range(1, 4):
    if i == 2:
        break
    print(i)
else:
    print("Tidak dijalankan karena break")

# Infinite loop (hati-hati!)
# while True:
#     print("Forever...")

# while dengan kondisi kompleks
import random
target = random.randint(1, 10)
tebakan = 0
percobaan = 0

print("\nGame tebak angka (1-10):")
while tebakan != target:
    tebakan = int(input("Tebakan Anda: "))
    percobaan += 1
    if tebakan < target:
        print("Terlalu kecil")
    elif tebakan > target:
        print("Terlalu besar")
print(f"Benar! Anda menebak dalam {percobaan} percobaan")

# List comprehension (for loop dalam list)
kuadrat = [x**2 for x in range(1, 6)]
print(f"\nList comprehension: {kuadrat}")

# Generator expression (hemat memory)
genap = (x for x in range(1, 11) if x % 2 == 0)
print("Generator:", end=" ")
for num in genap:
    print(num, end=" ")
print()

11. Functions

Definisi fungsi:

def nama_fungsi(parameter1, parameter2):
    """Docstring (opsional)"""
    # body
    return nilai

Jenis parameter:

  • Positional arguments - berdasarkan posisi
  • Keyword arguments - berdasarkan nama parameter
  • Default parameters - nilai default jika tidak diberikan
  • *args - variable-length positional arguments
  • **kwargs - variable-length keyword arguments

Return value:

Fungsi bisa mengembalikan nilai dengan return. Jika tidak ada return, mengembalikan None.

Contoh fungsi dasar
# Fungsi sederhana
def sapa():
    """Fungsi untuk menyapa"""
    print("Halo, selamat datang!")

sapa()  # panggil fungsi

# Fungsi dengan parameter
def sapa_orang(nama):
    print(f"Halo, {nama}!")

sapa_orang("Budi")
sapa_orang("Ani")

# Fungsi dengan return value
def tambah(a, b):
    return a + b

hasil = tambah(5, 3)
print(f"5 + 3 = {hasil}")

# Multiple return values
def operasi_dasar(a, b):
    tambah = a + b
    kurang = a - b
    kali = a * b
    bagi = a / b
    return tambah, kurang, kali, bagi  # return tuple

t, k, kali, b = operasi_dasar(10, 3)
print(f"10+3={t}, 10-3={k}, 10*3={kali}, 10/3={b:.2f}")

# Default parameter
def pangkat(angka, pangkat=2):
    return angka ** pangkat

print(f"3^2 = {pangkat(3)}")
print(f"3^3 = {pangkat(3, 3)}")

# Keyword arguments
def biodata(nama, umur, kota):
    print(f"Nama: {nama}")
    print(f"Umur: {umur}")
    print(f"Kota: {kota}")

biodata(umur=20, nama="Budi", kota="Jakarta")  # urutan bisa diubah

# *args (arbitrary positional arguments)
def jumlahkan(*args):
    """Menjumlahkan semua argumen"""
    total = 0
    for angka in args:
        total += angka
    return total

print(f"jumlah(1,2,3) = {jumlahkan(1, 2, 3)}")
print(f"jumlah(1,2,3,4,5) = {jumlahkan(1, 2, 3, 4, 5)}")

# **kwargs (arbitrary keyword arguments)
def print_info(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")

print_info(nama="Budi", umur=20, pekerjaan="Developer")

# Kombinasi
def complex_func(a, b, *args, **kwargs):
    print(f"a={a}, b={b}")
    print(f"args: {args}")
    print(f"kwargs: {kwargs}")

complex_func(1, 2, 3, 4, 5, x=10, y=20)
Fungsi lanjutan
# Lambda (anonymous function)
kuadrat = lambda x: x**2
print(f"kuadrat 5: {kuadrat(5)}")

# Lambda dengan multiple arguments
tambah = lambda a, b: a + b
print(f"tambah 3,5: {tambah(3, 5)}")

# Fungsi sebagai parameter
def apply_func(func, value):
    return func(value)

print(apply_func(lambda x: x*2, 10))
print(apply_func(lambda x: x**3, 3))

# Fungsi di dalam fungsi (inner function)
def luar(x):
    def dalam(y):
        return y * x
    return dalam

kali_2 = luar(2)
kali_3 = luar(3)
print(f"kali_2(5) = {kali_2(5)}")
print(f"kali_3(5) = {kali_3(5)}")

# Decorator sederhana
def decorator(func):
    def wrapper(*args, **kwargs):
        print("Sebelum fungsi dijalankan")
        hasil = func(*args, **kwargs)
        print("Setelah fungsi dijalankan")
        return hasil
    return wrapper

@decorator
def say_hello(nama):
    print(f"Halo, {nama}!")

say_hello("Budi")

# Fungsi rekursif
def faktorial(n):
    if n <= 1:
        return 1
    return n * faktorial(n - 1)

print(f"5! = {faktorial(5)}")

# Fungsi fibonacci
def fibonacci(n):
    if n <= 1:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

print("Fibonacci 0-5:")
for i in range(6):
    print(f"fib({i}) = {fibonacci(i)}")

# Fungsi dengan type hints (Python 3.5+)
def greet(nama: str, umur: int) -> str:
    return f"{nama} berumur {umur} tahun"

print(greet("Budi", 20))

# Docstring
def hitung_luas_persegi_panjang(panjang, lebar):
    """
    Menghitung luas persegi panjang.
    
    Args:
        panjang (float): panjang persegi
        lebar (float): lebar persegi
    
    Returns:
        float: luas persegi panjang
    """
    return panjang * lebar

help(hitung_luas_persegi_panjang)  # menampilkan docstring

12. Modules & Packages

Module

Module adalah file Python (.py) yang berisi fungsi, class, dan variabel yang bisa diimpor.

Cara import module:

import math
from math import sqrt, pi
import numpy as np
from mymodule import *  # tidak direkomendasikan

Package

Package adalah folder yang berisi module-module Python dan file __init__.py.

Struktur package:

mypackage/
    __init__.py
    module1.py
    module2.py
    subpackage/
        __init__.py
        module3.py

Standard Library populer:

  • math - fungsi matematika
  • random - generate angka random
  • datetime - tanggal dan waktu
  • os - operasi sistem
  • sys - system-specific parameters
  • json - bekerja dengan JSON
  • re - regular expression
  • collections - data structures tambahan
Contoh modules dan packages
# Import module standar
import math
import random
import datetime
import os
import sys
import json

# math module
print(f"pi = {math.pi}")
print(f"sqrt(16) = {math.sqrt(16)}")
print(f"sin(90) = {math.sin(math.radians(90))}")

# random module
print(f"Random 0-1: {random.random()}")
print(f"Random int 1-10: {random.randint(1, 10)}")
print(f"Random choice: {random.choice(['apel', 'jeruk', 'mangga'])}")

# datetime module
sekarang = datetime.datetime.now()
print(f"Sekarang: {sekarang}")
print(f"Tanggal: {sekarang.strftime('%d/%m/%Y')}")
print(f"Waktu: {sekarang.strftime('%H:%M:%S')}")

# os module
print(f"Current directory: {os.getcwd()}")
print(f"Files: {os.listdir('.')[:5]}")  # 5 file pertama

# sys module
print(f"Python version: {sys.version}")
print(f"Platform: {sys.platform}")

# json module
data = {"nama": "Budi", "umur": 20, "hobi": ["coding", "membaca"]}
json_str = json.dumps(data, indent=2)
print(f"JSON:\n{json_str}")

data_kembali = json.loads(json_str)
print(f"Data kembali: {data_kembali}")

# Import dengan alias
import math as m
print(f"pi (alias): {m.pi}")

# Import fungsi spesifik
from math import sqrt, pow
print(f"sqrt(25): {sqrt(25)}")
print(f"pow(2,3): {pow(2, 3)}")

# Membuat module sendiri
# Buat file mymodule.py:
"""
# mymodule.py
def halo(nama):
    return f"Halo, {nama}!"

PI = 3.14159
"""

# Import module sendiri
# import mymodule
# print(mymodule.halo("Budi"))
# print(mymodule.PI)

# __name__ == "__main__"
if __name__ == "__main__":
    print("File ini dijalankan langsung")
else:
    print("File ini diimpor sebagai module")

# Membuat package sederhana
"""
mypackage/
    __init__.py
    matematika.py
    string_util.py
"""

# isi __init__.py (bisa kosong)
# from .matematika import tambah, kali
# from .string_util import upper, lower

# Install package dengan pip
# pip install requests
# pip install numpy pandas matplotlib

# Contoh import third-party package
try:
    import requests
    response = requests.get("https://api.github.com")
    print(f"Status code: {response.status_code}")
except ImportError:
    print("requests tidak terinstall. Install dengan: pip install requests")

# Mengetahui lokasi module
import math
print(f"Lokasi module math: {math.__file__}")

# Mengetahui fungsi dalam module
print(dir(math)[:10])  # 10 fungsi pertama dalam math

# Reload module
import importlib
import mymodule
importlib.reload(mymodule)
Selamat! Anda telah menyelesaikan materi dasar Python. Untuk melanjutkan, pelajari:
  • Object-Oriented Programming (OOP) di Python
  • File I/O
  • Exception Handling
  • Generators dan Decorators
  • Context Managers (with statement)
  • Multithreading & Multiprocessing
  • Web Development dengan Flask/Django
  • Data Science dengan NumPy, Pandas, Matplotlib