דילוג לתוכן המרכזי
מודול 2 · שיעור 2 מתוך 46/36 בקורס~8 min
שיעורי מודול (2/4)

בעוד לולאות

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

תַחבִּיר

Python
n = 1
while n < 1000:
    n = n * 2
n  # 1024

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

דפוסים נפוצים

מונה ידני - שווה ערך ל-for הקלאסי בשפות אחרות:

Python
i = 0
while i < 5:
    print(i)
    i = i + 1

לולאה אינסופית + מצב יציאה פנימי - שימושי כאשר התנאי הוא מוערך לאחר ביצוע משהו:

Python
acc = 0
while True:
    acc = acc + 1
    if acc * acc > 100:
        break
acc  # 11   (11*11 = 121 is the first square > 100)

break יוצא מיד מהלולאה הפנימית ביותר (נראה את זה בשלב הבא שיעור).

הטעות הקלאסית: הלולאה האינסופית

אם המשתנה בתנאי לא משתנה בתוך הלולאה, ה- התוכנית לעולם לא מסתיימת. זה הבאג מספר אחת עם while:

Python
n = 0
while n < 10:
    print(n)   # n is never modified → infinite loop!

בתרגילים שלנו יש פסק זמן לביצוע, אז לולאה אינסופית תיכשל עם מסר ברור במקום להקפיא את הדפדפן. אבל בהפקה an לולאה אינסופית היא באג רציני.

סיכון לולאות אינסופיות ותנאי סיום

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

נסה זאת בעצמך

פעילות גופנית#python.m2.l2.e1
ניסיונות: 0טוען...

מצא את המספר השלם הקטן ביותר `n >= 1` כך ש-2**n יעלה על מיליון. הקצה אותו ל'תוצאה' והעריך אותו (זה צריך להיות 20).

טוען עורך...
הצג רמז

2**20 = 1,048,576 הוא הראשון שעולה על 1,000,000.

הפתרון זמין לאחר 3 ניסיונות

סקירת התרגיל

פעילות גופנית#python.m2.l2.e2
ניסיונות: 0טוען...

החל מ-'n = 1000', חצו את n בחלוקה שלמה (n // 2) עד שהוא הופך ל-0. ספור כמה איטרציות הוא לוקח ב'צעדים'. הערכת `צעדים`.

טוען עורך...
הצג רמז

1000 → 500 → 250 → 125 → 62 → 31 → 15 → 7 → 3 → 1 → 0: עשרה צעדים.

הפתרון זמין לאחר 3 ניסיונות

אתגר נוסף

פעילות גופנית#python.m2.l2.e3
ניסיונות: 0טוען...

Given the variable `n = 32`, write a `while` loop to count how many times you can divide `n` by 2 (using floor division `//`) before `n` becomes less than or equal to 1. Store the count in `divisions` and evaluate it.

טוען עורך...
הצג רמז

The while condition is n > 1. Inside the loop, divide n by 2 and increment divisions by 1.

הפתרון זמין לאחר 3 ניסיונות