2.12. Loop

Sebuah loop menjalankan blok kode yang sama berulang kali. Python memiliki dua bentuk: while, yang terus berjalan selama kondisi tetap benar, dan for, yang menelusuri item dari suatu urutan.

Side-by-side flowcharts. while: test the condition, run the body if true, repeat. for: take the next item from the iterable, run the body, repeat until exhausted.

while terus menguji kondisi; for menelusuri urutan sampai habis.

2.12.1. Loop while

Loop while menguji kondisinya sebelum setiap iterasi dan menjalankan tubuh hingga pengujian menjadi salah:

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

Output:

0
1
2
3
4

Jika kondisi benar pada awal dan tidak pernah menjadi salah, loop berjalan selamanya. while True: adalah idiom standar untuk loop utama, keluar secara eksplisit dengan break:

while True:
    step()
    if done():
        break

2.12.2. Loop for

Loop for menelusuri item dari iterable -- sebuah list, tuple, string, bytes, dict, atau apa pun yang mendukung iterasi:

for fruit in ["apple", "banana", "cherry"]:
    print(fruit)

Output:

apple
banana
cherry

Bentuk yang sama bekerja pada string, di mana setiap item adalah string satu karakter:

for letter in "OpenMV":
    print(letter)

Output:

O
p
e
n
M
V

Mengiterasi dict secara langsung menghasilkan kunci-kuncinya, dalam urutan penyisipan:

for key in {"a": 1, "b": 2}:
    print(key)

Output:

a
b

Setiap kali loop berjalan, variabel loop (fruit, letter, key) diikat ke item berikutnya. Setelah loop berakhir, variabel menyimpan nilai dari iterasi terakhir.

2.12.3. range

Untuk loop atas rentang numerik, gunakan range():

  • range(stop) -- 0, 1, ..., stop - 1.

  • range(start, stop) -- start, start + 1, ..., stop - 1.

  • range(start, stop, step) -- dengan langkah kustom (nilai negatif menghitung mundur).

for i in range(5):           # 0, 1, 2, 3, 4
    print(i)

for i in range(2, 8, 2):     # 2, 4, 6
    print(i)

for i in range(10, 0, -1):   # 10, 9, ..., 1
    print(i)

range() menghasilkan nilai secara malas -- tidak membangun daftar di memori. Untuk mendapatkan list yang sebenarnya, bungkus: list(range(10)).

2.12.4. enumerate

Ketika loop membutuhkan indeks dan item, enumerate() menghasilkan pasangan (index, item):

for i, name in enumerate(["a", "b", "c"]):
    print(i, name)
# 0 a
# 1 b
# 2 c

Mulai indeks dari sesuatu selain nol dengan memberikan argumen kedua: enumerate(items, start=1).

2.12.5. zip

Untuk menelusuri dua (atau lebih) iterable secara bersamaan, gunakan zip(). Fungsi ini menghasilkan satu tuple per posisi dan berhenti pada input terpendek:

names  = ["alice", "bob", "carol"]
scores = [88, 92, 70]

for name, score in zip(names, scores):
    print(name, score)

Output:

alice 88
bob 92
carol 70

2.12.6. Penugasan inline dengan :=

Operator walrus := adalah penugasan yang juga merupakan ekspresi. Ia mengikat nama dan mengevaluasi ke nilai yang sama pada saat yang bersamaan. Dalam loop while, ini menyederhanakan pola umum "baca, periksa, tubuh" menjadi satu baris:

# without walrus
value = next_value()
while value is not None:
    process(value)
    value = next_value()

# with walrus
while (value := next_value()) is not None:
    process(value)

Kedua bentuk melakukan hal yang sama. Gunakan := ketika duplikasi penugasan benar-benar mengganggu keterbacaan; jangan gunakan hanya untuk terlihat pintar. Tanda kurung diperlukan di sebagian besar posisi agar ekspresi tidak ambigu.