2.13. בקרת לולאה

שתי מילות מפתח משנות את אופן ריצת הלולאה:

  • break – יציאה מיידית מהלולאה.

  • continue – דילוג על שאר האיטרציה הנוכחית והתחלת הבאה.

שתיהן חלות על הלולאה הפנימית ביותר שבתוכה הן מופיעות.

2.13.1. break

השתמשו ב-break כדי לעצור לולאה ברגע שתנאי מתקיים. תבנית ה“חפש ועצור“ הקלאסית:

found = None
for item in items:
    if matches(item):
        found = item
        break

if found is not None:
    print("found:", found)

בלולאת while True:, break הוא הדרך שבה הלולאה מסתיימת:

while True:
    line = next_line()
    if line == "quit":
        break
    process(line)

2.13.2. continue

השתמשו ב-continue כדי לדלג על שאר גוף הלולאה ולקפוץ לאיטרציה הבאה. שימושי לסינון פריטים בתוך לולאה:

for n in numbers:
    if n < 0:
        continue            # skip negatives
    print(n)

אפשר לכתוב את אותו האפקט כבלוק if סביב שאר הגוף. לעיתים continue ברור יותר כאשר קל יותר לנסח מראש את תנאי הדילוג מאשר את תנאי השמירה.

בתוך לולאה, ל-continue יש אותו תפקיד כמו ל-return מוקדם בפונקציה: דלגו על המקרים שאינכם מטפלים בהם והשאירו את העבודה העיקרית שטוחה בהזחה החיצונית. לולאת הסינון-והעיבוד היא הצורה הקאנונית:

for item in items:
    if item is None:
        continue
    if not item.is_valid():
        continue
    process(item)

השורה המוזחת process(item) היא העבודה האמיתית; כל שומר מעליה מפרט בדיוק אילו פריטים מדולגים.

2.13.3. else על לולאה

גם for וגם while מקבלים בלוק else אופציונלי. הוא רץ כאשר הלולאה מסתיימת בלי להגיע ל-break. השימוש הנפוץ ביותר הוא לולאת חיפוש שרוצה ערך ברירת מחדל אם לא נמצא דבר:

for item in items:
    if matches(item):
        print("found:", item)
        break
else:
    print("no match")

אם break מופעל, בלוק ה-else מדולג. קראו את המבנה כך: ”for X in Y: …; ואם לא יצאנו אף פעם, בצע Z.“

2.13.4. תבניות לולאה נפוצות

מספר תבניות מופיעות לעיתים קרובות בסקריפטים אמיתיים:

  • Polling – המתינו עד שתנאי כלשהו יהפוך לאמת לפני שממשיכים הלאה. הגוף משתמש ב-pass, פקודת ה“אל-תעשה-כלום“ של Python; כל בלוק מוזח חייב להכיל לפחות פקודה אחת, ו-pass היא הדרך לומר ”אל תעשה כלום כאן“:

    while not ready():
        pass
    proceed()
    
  • מכונת מצבים – לולאת while True: יחידה שבוחרת מה לעשות בהתבסס על משתנה מצב. שימושית כאשר העבודה מתחלקת בבירור למספר שלבים בעלי שם:

    state = "header"
    for line in lines:
        if state == "header":
            if line.startswith("---"):
                state = "body"
        elif state == "body":
            print(line)
    
  • צבירה – בנו תוצאה תוך כדי מעבר על רצף:

    total = 0
    for x in samples:
        total += x
    mean = total / len(samples)
    

    להרבה לולאות צבירה יש מקבילה בת שורה אחת באמצעות פונקציה מובנית. השתמשו במובנית כשאחת מהן מתאימה:

    • sum() – מחבר כל פריט באובייקט ניתן לאיטרציה.

    • max() / min() – הפריט הגדול ביותר או הקטן ביותר.

    • any()True אם לפחות פריט אחד אמיתי.

    • all()True רק כאשר כל פריט אמיתי.

    • sorted() – רשימה חדשה עם הפריטים מסודרים.

    • len() – מספר הפריטים (כאשר האובייקט הניתן לאיטרציה יודע את אורכו).

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

    הגרסה המובנית קצרה יותר, ברורה יותר, ובדרך כלל מהירה יותר מכתיבת אותה לולאה ידנית.