2.12. Döngüler

Bir döngü, aynı kod bloğunu tekrar tekrar çalıştırır. Python’ın iki biçimi vardır: bir koşul doğru kaldığı sürece devam eden while ve bir dizinin öğeleri arasında gezen for.

Yan yana akış şemaları. while: koşulu test et, doğruysa gövdeyi çalıştır, tekrarla. for: yinelenebilirden bir sonraki öğeyi al, gövdeyi çalıştır, tükenene kadar tekrarla.

while bir koşulu test etmeye devam eder; for bir diziyi tükenene kadar gezer.

2.12.1. while döngüleri

Bir while döngüsü, her yinelemeden önce koşulunu test eder ve test yanlış olana kadar gövdeyi çalıştırır:

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

Çıktı:

0
1
2
3
4

Koşul başlangıçta doğruysa ve hiçbir zaman yanlış olmazsa, döngü sonsuza kadar çalışır. while True: bir ana döngü için standart deyimdir ve açıkça break ile çıkılır:

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

2.12.2. for döngüleri

Bir for döngüsü, bir yinelenebilirin öğeleri arasında gezer – bir liste, demet, dize, bayt, sözlük veya yinelemeyi destekleyen başka herhangi bir şey:

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

Çıktı:

apple
banana
cherry

Aynı şekil, her öğenin tek karakterlik bir dize olduğu bir dizede de çalışır:

for letter in "OpenMV":
    print(letter)

Çıktı:

O
p
e
n
M
V

Bir sözlüğü doğrudan yinelemek, eklenme sırasıyla anahtarlarını verir:

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

Çıktı:

a
b

Her geçiş, döngü değişkenini (fruit, letter, key) bir sonraki öğeye bağlar. Döngü bittikten sonra değişken, son yinelemedeki değeri korur.

2.12.3. range

Sayısal bir aralık üzerinde döngüler için range() kullanın:

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

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

  • range(start, stop, step) – özel bir adımla (negatif değerler geriye doğru sayar).

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() değerleri tembel olarak üretir – bellekte bir liste oluşturmaz. Gerçek bir list elde etmek için onu sarın: list(range(10)).

2.12.4. enumerate

Döngünün hem dizine hem de öğeye ihtiyacı olduğunda, enumerate() (index, item) çiftleri verir:

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

İkinci bir argüman geçirerek dizini sıfırdan farklı bir değerden başlatın: enumerate(items, start=1).

2.12.5. zip

İki (veya daha fazla) yinelenebiliri eşzamanlı olarak gezmek için zip() kullanın. Her konum için bir demet verir ve en kısa girdide durur:

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

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

Çıktı:

alice 88
bob 92
carol 70

2.12.6. := ile satır içi atama

Walrus operatörü :=, aynı zamanda bir ifade olan bir atamadır. Bir adı bağlar ve aynı anda aynı değere değerlendirilir. Bir while döngüsünde bu, yaygın “oku, kontrol et, gövde” desenini tek satırda toplar:

# 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)

İki biçim de aynı işi yapar. Atamanın tekrarı okunabilirliği gerçekten bozduğunda := operatörüne başvurun; sırf zekice görünmek için başvurmayın. İfadeyi belirsizlikten korumak için çoğu konumda parantezler gereklidir.