2Python untuk AI

Control Flow

4 jam13 min baca
Tujuan

Kuasai if/else, loop, dan teknik mengontrol alur program — fondasi logika programming.

02 — Control Flow

Estimasi: 4 jam Tujuan: Kuasai if/else, loop, dan teknik mengontrol alur program — fondasi logika programming.


Kenapa Materi Ini Penting?

Semua program AI/ML pada akhirnya adalah pipeline keputusan: "kalau confidence > 0.8, klasifikasikan sebagai class A; ulang training sampai loss < threshold; iterasi semua batch dalam dataset". Tanpa control flow, kode kamu cuma sequential script yang tidak bisa adaptive.

Loop dan kondisi adalah otot fundamental programming. Library AI seperti PyTorch punya training loop, sklearn punya cross-validation loop, LangChain punya agent loop. Semua dimulai dari for dan if yang kamu pelajari di sini.

Analogi besar: control flow itu seperti resep masakan dengan langkah kondisional — "kalau garam sudah cukup, lanjut; kalau belum, tambah lagi; ulangi cicipi sampai pas". Itu if/else dan loop dalam kehidupan nyata.


Peta Konsep

flowchart TD
    A[🎯 Control Flow] --> B[🔀 Percabangan]
    A --> C[🔁 Perulangan]
    A --> D[🚪 Keluar Loop]

    B --> B1[if / elif / else]
    B --> B2[ternary]
    B --> B3[match-case]

    C --> C1[while]
    C --> C2[for]
    C --> C3[nested loop]

    D --> D1[break]
    D --> D2[continue]
    D --> D3[pass]

Bagian 1 — If/Else

Diagram Alur If/Elif/Else

Cara Membaca Diagram

Diagram ini bercabang. Mulai dari atas, tiap node bertanda ? adalah cek kondisi. Edge "Ya" pergi ke aksi (print), edge "Tidak" lanjut ke kondisi berikutnya. Semua jalur akhirnya berkumpul di "Selesai".

Walkthrough Step-by-Step

  1. Mulai dengan nilai (misal nilai = 75).
  2. Cek nilai >= 90? — kalau ya, print "A" dan selesai. Kalau tidak, lanjut.
  3. Cek nilai >= 80? — kalau ya, print "B" dan selesai.
  4. Cek nilai >= 70? — kalau ya, print "C" (jalur ini yang aktif untuk 75).
  5. Kalau semua False, jatuh ke else → print "D".
  6. Penting: Python evaluasi top-to-bottom, branch pertama yang True dijalankan, sisanya di-skip.

Analogi Sehari-hari

Mirip antrian klasifikasi rapor di sekolah. Guru pegang nilai siswa, pertanyaan demi pertanyaan: "≥90? Masuk grup A". Tidak? "≥80? Masuk B". Begitu seterusnya. Siswa yang sudah di-grup, langsung keluar antrian — tidak perlu cek kondisi lain.

Diagram statis Mermaid sebagai fallback:

flowchart TD
    Start([Mulai]) --> Q1{nilai >= 90?}
    Q1 -->|Ya| A[Print A]
    Q1 -->|Tidak| Q2{nilai >= 80?}
    Q2 -->|Ya| B[Print B]
    Q2 -->|Tidak| Q3{nilai >= 70?}
    Q3 -->|Ya| C[Print C]
    Q3 -->|Tidak| D[Print D]
    A --> End([Selesai])
    B --> End
    C --> End
    D --> End

Bentuk Dasar

nilai = 75

if nilai >= 90:
    print("A")
elif nilai >= 80:
    print("B")
elif nilai >= 70:
    print("C")
else:
    print("D")

Aturan Python:

  • Tidak ada kurung kurawal {} — Python pakai indentasi
  • 4 spasi (atau 1 tab) wajib konsisten
  • Kondisi diakhiri :

Kondisi Kompleks

umur = 25
sim = True

if umur >= 18 and sim:
    print("Boleh nyetir")

if umur < 17 or umur > 65:
    print("Mungkin perlu pendamping")

if not sim:
    print("Bikin SIM dulu")

Nested If

nilai = 85
hadir = True

if hadir:
    if nilai >= 75:
        print("Lulus")
    else:
        print("Remedial")
else:
    print("Tidak hadir, otomatis gagal")

Ternary Operator (Inline If)

# Cara biasa
if umur >= 18:
    status = "dewasa"
else:
    status = "anak"

# Ternary
status = "dewasa" if umur >= 18 else "anak"

Pythonic tapi jangan dipakai untuk kondisi kompleks. Kalau lebih dari 1 ternary nested, ubah ke if/else biasa.

Match-Case (Python 3.10+, Mirip Switch)

def deskripsi_hari(hari):
    match hari:
        case "Senin" | "Selasa" | "Rabu" | "Kamis" | "Jumat":
            return "Hari kerja"
        case "Sabtu" | "Minggu":
            return "Akhir pekan"
        case _:
            return "Hari tidak valid"

Bagian 2 — While Loop

Diagram Alur While

Cara Membaca Diagram

Loop punya 4 fase: start (init)cek kondisibodyupdate → kembali ke cek. Edge dashed adalah "loop kembali". Node break keluar total, continue skip ke iterasi berikutnya.

Walkthrough Step-by-Step

  1. Mulai — initialize counter, misal i = 0.
  2. Cek Kondisii < 5?. Kalau True, masuk body.
  3. Body — eksekusi print(i). Bisa juga break (keluar) atau continue (skip ke cek).
  4. Updatei += 1. Wajib! Tanpa update = infinite loop.
  5. Kembali ke Cek Kondisi. Loop sampai False.
  6. Keluar saat kondisi False.

Analogi Sehari-hari

While loop = mengisi gelas air. "Selama gelas belum penuh (cek kondisi), tuangkan air (body), cek lagi". Kalau lupa cek (lupa update), air tumpah selamanya. break = berhenti tuang karena ada panggilan telpon. continue = skip tuang ronde ini (gelas terlalu kotor) tapi tetap di posisi.

Diagram statis Mermaid sebagai fallback:

flowchart TD
    Start([Mulai]) --> Init[i = 0]
    Init --> Cond{i < 5?}
    Cond -->|Ya| Body[print i<br/>i += 1]
    Body --> Cond
    Cond -->|Tidak| End([Selesai])

Analogi: while loop = "selama X belum penuh, terus tuangkan air". Berhenti saat kondisi jadi False.

Bentuk Dasar

i = 0
while i < 5:
    print(i)
    i += 1

# Output: 0 1 2 3 4

Pattern Umum

1. Loop sampai input valid:

while True:
    umur = input("Umur (>=18): ")
    if umur.isdigit() and int(umur) >= 18:
        break
    print("Tidak valid, coba lagi")

2. Counter dengan break:

percobaan = 0
max_percobaan = 3

while percobaan < max_percobaan:
    password = input("Password: ")
    if password == "rahasia123":
        print("Berhasil login")
        break
    percobaan += 1
else:
    print("Akun terkunci")

Trik: while-else jarang dipakai tapi powerful. else jalan kalau loop selesai tanpa break.

Hindari Infinite Loop

# BAHAYA — i tidak pernah berubah
while i < 10:
    print(i)

# Bener — pastikan kondisi loop berubah
while i < 10:
    print(i)
    i += 1

Bagian 3 — For Loop

For loop di Python bukan seperti C/Java (for(i=0; i<n; i++)). Python for = iterasi atas sequence.

Diagram: For Loop = Pengambilan Otomatis

flowchart LR
    L[📋 Iterable<br/>list, range, str] --> I{Masih ada item?}
    I -->|Ya| T[Ambil item berikutnya]
    T --> B[Eksekusi body loop]
    B --> I
    I -->|Tidak| E([Keluar loop])

Analogi: for loop = "untuk setiap kue di dalam toples, makan satu". Python ambil satu per satu sampai habis. Kamu tidak perlu hitung index manual seperti di bahasa lain.

Iterasi atas List

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

for item in buah:
    print(item)

Iterasi atas String

for huruf in "Python":
    print(huruf)
# Output: P y t h o n

Range — Membuat Sequence Angka

range(5)         # 0, 1, 2, 3, 4
range(2, 8)      # 2, 3, 4, 5, 6, 7
range(0, 10, 2)  # 0, 2, 4, 6, 8 (step 2)
range(10, 0, -1) # 10, 9, 8, ..., 1 (mundur)

# Contoh
for i in range(5):
    print(i ** 2)  # 0 1 4 9 16

Enumerate — Index + Value

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

# Cara jelek (anti-pattern)
for i in range(len(buah)):
    print(i, buah[i])

# Cara Python (pakai enumerate)
for i, item in enumerate(buah):
    print(i, item)

# Output:
# 0 apel
# 1 pisang
# 2 mangga

Zip — Iterasi Paralel

nama = ["Budi", "Ani", "Cici"]
umur = [25, 30, 28]

for n, u in zip(nama, umur):
    print(f"{n} berumur {u}")

Iterasi Dictionary

data = {"nama": "Budi", "umur": 25, "kota": "Bandung"}

# Loop key
for key in data:
    print(key)

# Loop value
for value in data.values():
    print(value)

# Loop key + value
for key, value in data.items():
    print(f"{key}: {value}")

Bagian 4 — Break, Continue, Pass

Diagram: Beda Break vs Continue

flowchart TD
    Start([for i in range 10]) --> Cond{i memenuhi syarat?}
    Cond -->|break| Out([🚪 Keluar loop total])
    Cond -->|continue| Skip[⏭️ Skip ke iterasi berikutnya]
    Cond -->|tidak| Body[Jalankan body]
    Skip --> Cond
    Body --> Cond

Analogi:

  • break = berhenti makan total (keluar dari ruang makan)
  • continue = skip kue ini, ambil kue berikutnya (tetap di ruang makan)
  • pass = diam, tidak ngapa-ngapain (placeholder kosong)

Break — Keluar dari Loop

for i in range(100):
    if i == 5:
        break
    print(i)
# Output: 0 1 2 3 4

Continue — Skip ke Iterasi Berikutnya

for i in range(10):
    if i % 2 == 0:
        continue
    print(i)
# Output: 1 3 5 7 9 (hanya ganjil)

Pass — Tidak Ngapa-ngapain

# Placeholder kalau belum mau implement
def fungsi_baru():
    pass

if x > 10:
    pass  # nanti diisi
else:
    print("kecil")

pass mencegah error saat block kosong (Python butuh minimal 1 statement).


Bagian 5 — Nested Loop

# Tabel perkalian
for i in range(1, 4):
    for j in range(1, 4):
        print(f"{i}x{j}={i*j}", end="\t")
    print()

# Output:
# 1x1=1   1x2=2   1x3=3
# 2x1=2   2x2=4   2x3=6
# 3x1=3   3x2=6   3x3=9

Hati-hati: nested loop = O(n²) atau lebih. Untuk data besar, ini lambat. Di Fase 4 kita ganti ke vectorized operation pakai NumPy.

Break Hanya Keluar Loop Terdekat

for i in range(3):
    for j in range(3):
        if i == 1 and j == 1:
            break  # cuma break loop dalam
        print(i, j)

Kalau mau keluar dari nested loop sekaligus, pakai flag atau function (return langsung keluar).


Bagian 6 — Idiom Pythonic untuk Loop

Loop with Index dan Counter

items = ["a", "b", "c"]

# Ada 3 cara, urut dari paling jelek ke paling Pythonic:

# JELEK
i = 0
while i < len(items):
    print(i, items[i])
    i += 1

# OK
for i in range(len(items)):
    print(i, items[i])

# PYTHONIC ✅
for i, item in enumerate(items):
    print(i, item)

Reverse Iteration

# JELEK
for i in range(len(items) - 1, -1, -1):
    print(items[i])

# PYTHONIC ✅
for item in reversed(items):
    print(item)

Loop dengan Filter

nilai = [85, 60, 75, 90, 55]

# JELEK
for n in nilai:
    if n >= 70:
        print(f"{n} lulus")

# PYTHONIC (kalau cuma filter)
lulus = [n for n in nilai if n >= 70]   # list comprehension (file 04)
print(lulus)

Bagian 7 — Common Pitfalls

Pitfall 1: Modifikasi List Saat Loop

# ❌ BAHAYA
data = [1, 2, 3, 4, 5]
for item in data:
    if item % 2 == 0:
        data.remove(item)  # MODIFIKASI saat iterate

# Hasil tidak benar! Item ke-skip.

# ✅ BENAR — buat list baru
data = [1, 2, 3, 4, 5]
data = [item for item in data if item % 2 != 0]

Pitfall 2: Off-by-One Error

# Mau cetak 1 sampai 10
for i in range(10):       # 0-9, BUKAN 1-10
    print(i)

# Bener
for i in range(1, 11):    # 1-10
    print(i)

range(n) = 0 sampai n-1. Selalu ingat.

Pitfall 3: Equal vs Identity

# Cek None — pakai 'is', BUKAN '=='
x = None

if x == None:        # bekerja, tapi tidak Pythonic
    pass

if x is None:        # ✅ benar
    pass

Common Mistakes & FAQ

❌ Mistake 1: Lupa increment di while

i = 0
while i < 5:
    print(i)   # infinite loop! i tidak pernah berubah

Fix: selalu update variable kondisi:

i = 0
while i < 5:
    print(i)
    i += 1

❌ Mistake 2: Pakai range(len()) padahal ada enumerate

# Anti-pattern
for i in range(len(items)):
    print(i, items[i])

# Pythonic
for i, item in enumerate(items):
    print(i, item)

❌ Mistake 3: Modifikasi list saat iterasi

data = [1, 2, 3, 4, 5]
for x in data:
    if x % 2 == 0:
        data.remove(x)   # SKIP item — bug!
print(data)   # [1, 3, 5]? Belum tentu, tergantung versi

Fix: bikin list baru atau iterasi atas copy:

data = [x for x in data if x % 2 != 0]
# atau
for x in data[:]:   # iterate atas copy
    ...

❌ Mistake 4: Bingung scope di nested loop

for i in range(3):
    for j in range(3):
        if found:
            break   # cuma break inner loop
    # i tetap lanjut

Fix: pakai flag atau bungkus dalam function (return langsung keluar semua loop):

def find():
    for i in range(3):
        for j in range(3):
            if condition:
                return (i, j)

FAQ

Q: Kapan pakai for vs while? A:

  • for = kalau tahu jumlah iterasi atau punya iterable (list, range, file).
  • while = kalau berhenti tergantung kondisi runtime (input user, state berubah).

Q: else di loop itu apa fungsinya? A: else jalan kalau loop selesai tanpa break. Useful untuk pattern "search and not found":

for x in data:
    if x == target:
        print("ketemu")
        break
else:
    print("tidak ketemu")

Q: Kenapa range(10) cuma 0-9, bukan 0-10? A: Konvensi Python: end exclusive. Konsisten dengan slicing lst[0:10] (10 element). Kalau mau 1-10 inclusive, pakai range(1, 11).

Q: Match-case (Python 3.10+) menggantikan if/elif? A: Tidak total. Match-case shines untuk structural pattern matching (cek tipe + struktur), bukan sekadar nilai. Untuk perbandingan biasa, if/elif tetap clean.


Cek Pemahaman

  • Bisa bedakan if/elif/else?
  • Tahu kapan pakai for vs while?
  • Hafal pattern enumerate dan zip?
  • Tahu beda break, continue, pass?
  • Bisa iterasi dict dengan items()?
  • Bisa hindari modifikasi list saat loop?

Challenge 2.2

Challenge 1 — FizzBuzz Klasik

Print 1-100. Tapi:

  • Kelipatan 3 → "Fizz"
  • Kelipatan 5 → "Buzz"
  • Kelipatan 3 dan 5 → "FizzBuzz"
  • Lainnya → angka itu sendiri

Klasik wawancara programming. Wajib bisa.

Challenge 2 — Tebak Angka

Komputer pilih angka random 1-100. User tebak.

  • Setiap tebakan, kasih clue "lebih besar" / "lebih kecil"
  • Hitung berapa kali tebak
  • Maksimal 7 percobaan
import random
target = random.randint(1, 100)

Challenge 3 — Prime Number Checker

Cek apakah suatu angka prima:

  • Input: angka N
  • Output: True/False

Bonus: print semua prima dari 1 sampai 100.

Challenge 4 — Bintang Piramida

Print piramida bintang sesuai input N:

N = 5
    *
   ***
  *****
 *******
*********

Challenge 5 — Kalkulator Sederhana with Loop

Bikin calculator yang loop sampai user ketik "exit":

Operator (+, -, *, /, exit): +
Angka 1: 5
Angka 2: 3
Hasil: 8

Operator (...): exit
Bye!

Challenge 6 — Word Counter

Input: kalimat Output: jumlah kata, jumlah huruf (excluding spaces), kata terpanjang

Challenge 7 — Average Calculator

Loop input angka. User ketik "done" untuk berhenti. Output: jumlah angka, sum, average, min, max.

Angka (atau 'done'): 10
Angka: 20
Angka: 15
Angka: done
Total: 3 angka
Sum: 45
Avg: 15.0
Min: 10, Max: 20

Selanjutnya: 03-functions.md — function adalah blok bangunan utama coding profesional.