2.13. Kontrol loop¶
Dua kata kunci mengubah cara loop berjalan:
break-- keluar dari loop segera.continue-- lewati sisa iterasi saat ini dan mulai yang berikutnya.
Keduanya berlaku untuk loop terdalam tempat mereka berada.
2.13.1. break¶
Gunakan break untuk menghentikan loop segera setelah suatu kondisi terpenuhi. Pola klasik "cari dan hentikan":
found = None
for item in items:
if matches(item):
found = item
break
if found is not None:
print("found:", found)
Dalam loop while True:, break adalah cara loop berakhir:
while True:
line = next_line()
if line == "quit":
break
process(line)
2.13.2. continue¶
Gunakan continue untuk melewati sisa bagian tubuh dan melanjutkan ke iterasi berikutnya. Berguna untuk memfilter item di dalam loop:
for n in numbers:
if n < 0:
continue # skip negatives
print(n)
Efek yang sama dapat ditulis sebagai blok if di sekitar sisa tubuh. continue terkadang lebih jelas ketika kondisi lewat lebih mudah dinyatakan di depan daripada kondisi simpan.
Di dalam loop, continue memainkan peran yang sama dengan return awal dalam fungsi: lewati kasus yang tidak Anda tangani dan jaga agar pekerjaan utama tetap datar pada indentasi luar. Pola loop filter-dan-proses adalah bentuk kanoniknya:
for item in items:
if item is None:
continue
if not item.is_valid():
continue
process(item)
Baris process(item) yang diindentasi adalah pekerjaan sebenarnya; setiap guard di atas menjelaskan secara persis item mana yang dilewati.
2.13.3. else pada loop¶
Baik for maupun while menerima blok else opsional. Blok ini berjalan ketika loop selesai tanpa menekan break. Penggunaan paling umum adalah loop pencarian yang menginginkan fallback jika tidak ada yang ditemukan:
for item in items:
if matches(item):
print("found:", item)
break
else:
print("no match")
Jika break dipicu, blok else dilewati. Baca konstruk ini sebagai "for X in Y: ...; atau-else, jika kita tidak pernah keluar, lakukan Z."
2.13.4. Pola loop umum¶
Beberapa pola sering muncul dalam skrip nyata:
Polling -- tunggu hingga suatu kondisi menjadi benar sebelum melanjutkan. Tubuh menggunakan
pass, pernyataan no-op Python; setiap blok yang diindentasi harus mengandung setidaknya satu pernyataan, danpassadalah cara untuk mengatakan "tidak melakukan apa-apa di sini":while not ready(): pass proceed()
Mesin status -- satu loop
while True:yang memilih apa yang harus dilakukan berdasarkan variabel status. Berguna ketika pekerjaan terbagi dengan jelas menjadi beberapa fase bernama:state = "header" for line in lines: if state == "header": if line.startswith("---"): state = "body" elif state == "body": print(line)
Mengakumulasi -- membangun hasil sambil menelusuri urutan:
total = 0 for x in samples: total += x mean = total / len(samples)
Banyak loop akumulasi memiliki ekuivalen satu baris menggunakan fungsi bawaan. Gunakan fungsi bawaan ketika ada yang berlaku:
sum()-- menjumlahkan setiap item dalam iterable.any()--Truejika setidaknya satu item bernilai truthy.all()--Truehanya ketika setiap item bernilai truthy.sorted()-- daftar baru dengan item dalam urutan.len()-- jumlah item (di mana iterable mengetahui panjangnya).
>>> samples = [3, 1, 4, 1, 5, 9, 2, 6] >>> sum(samples) 31 >>> sum(samples) / len(samples) # mean 3.875 >>> max(samples) 9 >>> min(samples) 1 >>> sorted(samples) [1, 1, 2, 3, 4, 5, 6, 9] >>> any([False, False, True]) True >>> all([True, True, False]) False
Versi fungsi bawaan lebih pendek, lebih jelas, dan biasanya lebih cepat daripada menulis loop yang sama secara manual.