break ו continue#

מילת המפתח break#

לפעמים אנחנו רוצים להפסיק לולאה עוד לפני שהיא סיימה את כל האיטרציות שלה. בדיוק בשביל זה קיימת מילת המפתח break.
כשמופיעה הפקודה break בתוך לולאה, היא גורמת ליציאה מיידית מהלולאה הקרובה ביותר, בלי להמשיך להריץ את שאר הפקודות שלה ובלי להמשיך לאיטרציות נוספות.

lst = [4, 2, -6, 3,-9]
for elem in lst:
    if elem < 0: 
        print("First negative number is", elem)
        break
    print("current number is: ", elem)
print("done")
current number is:  4
current number is:  2
First negative number is -6
done

אפשר לראות שלא הדפסנו את השורה “current number is: -6”, ולא עברנו על המשך הרשימה. במקום זאת, הקוד סיים את הלולאה ולכן עבר לפקודה print("done").

דוגמא: שימוש ב־ break בלולאת for לבדיקה אם מספר הוא ראשוני. שימו לב להזחות!

n=25
for div in range(2,int(n**0.5)+1): # Note the +1!
    if n % div == 0:
        break
if n % div == 0: 
    print(n, "is not prime")
else:
    print(n, "is prime")
25 is not prime

בקטע הקוד הזה אנחנו מנסים לבדוק האם המספר n הוא ראשוני. הרעיון הוא לעבור על כל המספרים מ־2 ועד השורש הריבועי של n (כולל). אם נמצא מספר שמחלק את n בלי שארית, סימן ש־n איננו ראשוני.

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

אם נכנסנו לתוך ה־if, סימן שמצאנו מחלק, ואז אנחנו יוצאים מהלולאה מידית.

אחרי הלולאה אנחנו בודקים שוב: אם המספר האחרון שנבדק (div) באמת חילק את n, נכריז ש־n איננו ראשוני. אחרת, הלולאה הסתיימה בלי שמצאנו מחלק, ולכן n הוא ראשוני.

ניתן לראות כי השימוש ב־break משנה את זרימת הבקרה: הלולאה לא בהכרח תרוץ על כל הטווח, אלא תיעצר ברגע שנמצא מחלק. לכן השורה האחרונה בודקת שוב את n % div == 0 כדי להבחין בין שני המצבים – יציאה בגלל break לעומת סיום רגיל של הלולאה.

מילת המפתח continue#

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

כאשר פוגשים ב־continue, פייתון מפסיק להריץ את שאר הפקודות של אותה איטרציה, וקופץ ישר להתחלת האיטרציה הבאה.

lst = [4, 2, -6, 3,-9]
for elem in lst:
    if elem < 0: 
        print("First negative number is", elem)
        continue
    print("current number is: ", elem)
print("done")
current number is:  4
current number is:  2
First negative number is -6
current number is:  3
First negative number is -9
done

אפשר לראות שלא הדפסנו את השורה “current number is: -6” או הדפסה דומה עבור -9, אבל כן המשכנו לעבור על הרשימה.

נראה כעת דוגמא נוספת לשימוש בcontinue: למטה מופיע מימוש של הפונקציה unique_list, המקבלת רשימה (lst), ומחזירה רשימה חדשה שבה הערכים ייחודיים (בלי חזרות).

def unique_list(lst):
    uniques = []
    for x in lst: 
        if x in uniques: # If already in list, don't add again
            continue 
        uniques.append(x)
    return uniques

unique_list([1,4,5,8,3,5,7,1,2])
[1, 4, 5, 8, 3, 7, 2]

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

סיכום: break ו-continue

לסיכום, הכרנו שתי פקודות המאפשרות שליטה מדויקת יותר בלולאות - break ו־continue. break עוצרת את הלולאה לחלוטין ברגע שהתנאי מתקיים וממשיכה מיד אחרי הלולאה, בעוד ש־continue רק מדלגת על שאר הפקודות באיטרציה הנוכחית וממשיכה לאיבר הבא בלולאה. כלומר, break “שוברת” את הלולאה, ו־continue “ממשיכה הלאה” בלי לעצור את הלולאה עצמה.

תרגול מסכם#

בתרגילים הבאים תצטרכו להחליט האם להשתמש בbreak או בcontinue וכיצד.

  1. כתבו את הפונקציה has_negative שמקבלת רשימה של מספרים (lst) ומחזירה True אם יש ברשימה מספר שלילי, ו-False אחרת.

def has_negative(lst):
    # Write your code here
    pass
  1. בעיה פתוחה במתמטיקה - בעיית ההגעה לפלינדרום

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

עם זאת, קיימים מספרים עבורם לא ברור לנו אם נצליח להגיע ככה לפלינדרום. לדוגמא, המספר 196:
196 + 691 = 887
887 + 788 = 1675
1675 + 5761 = 7536
וכן הלאה. אם תמשיכו להריץ את האלגוריתם, תראו שאנחנו מגיעים למספרים מאוד גדולים, אבל לא ברור מתי (ואם בכלל) נגיע לפלינדרום.

כתבו את הפונקציה is_palindrome_10 שמקבלת מספר שלם a. הפונקציה תחזיר אם המספר a מגיע לפלינדרום לאחר לכל היותר 10 איטרציות.

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

def is_palindrome_10(a):
    # Write your code here
    pass