לולאה שמשגיחה על תנאי
בעוד ש-for עוברת על רצף ידוע, while ממשיכה לרוץ כל עוד תנאי מסוים מתקיים. פונים אליה כשלא יודעים מראש כמה איטרציות יידרשו: לנסות שוב עד שמשהו עובד, לקרוא קלט עד שהמשתמש אומר די, או לבדוק שירות שוב ושוב עד שהוא מגיב.
המבנה פשוט:
הקוד מדפיס את המספרים 0 עד 4. Python בודקת את התנאי בתחילת כל איטרציה. אם הוא מתקיים, גוף הלולאה רץ. ואז היא בודקת שוב. כשהתנאי הופך ל-false, הלולאה מסתיימת.
שימו לב ש-count += 1 חשובה. בלעדיה התנאי היה נשאר נכון לנצח, וזו לולאה אינסופית. זו המלכודת העיקרית של while, והסיבה העיקרית להעדיף for כשאפשר.
מתי while היא הכלי הנכון
כמה מקרי שימוש קלאסיים:
לנסות שוב עד להצלחה.
לקרוא קלט עד שהמשתמש יוצא.
לעבד תור.
המכנה המשותף: אתם מחכים לשינוי מצב, ולא עוברים על פריטים.
while True זה בסדר
תראו את התבנית הזו הרבה:
זה Python אידיומטי כשתנאי היציאה ה"אמיתי" נמצא בתוך גוף הלולאה, ולא משהו נקי שאפשר לבדוק בראשה. זה קריא יותר מלהמציא דגל should_continue שמעדכנים במקום אחד ובודקים במקום אחר.
הכלל היחיד: ודאו ש_יש_ break (או return, או חריגה שנזרקת) שהקוד יגיע אליו בסופו של דבר. while True: בלי שום דרך החוצה היא הדרך הקלאסית לתקוע תוכנית.
איך נמנעים מלולאה אינסופית
לולאות אינסופיות קורות כשהתנאי נשאר נכון לנצח. החשודים הרגילים:
- שכחתם לעדכן את המשתנה.
while count < 5:צריכה משהו בתוך הגוף שמשנה אתcount. - עדכנתם את המשתנה הלא נכון.
while i < 10:ואזj += 1בפנים. קל לפספס את זה כשיש בקוד יותר מכמה משתנים. - השוואת מספרים עשרוניים.
while x != 1.0:עלולה לרוץ לנצח אםxרק מתקרב ל-1.0 ולא מגיע אליו בדיוק. השתמשו ב-<=או ב-abs(x - 1.0) < toleranceבמקום.
אם נתקעתם בלולאה אינסופית בטרמינל, לחצו Ctrl+C. זה שולח אות פסיקה, ו-Python עוצרת את מה שהיא עושה.
break, continue ו-else
while תומכת באותם שלושה כלי "זרימה" כמו for:
breakיוצאת מהלולאה מיד.continueמדלגת לאיטרציה הבאה (כך שהתנאי נבדק שוב).elseרצה אם הלולאה הסתיימה בליbreak.
זו בדיקת ראשוניות פשוטה. אם ה-break הפנימי מופעל, המספר פריק. אם הלולאה מסתיימת באופן טבעי (התנאי הופך ל-false), ה-else רצה וקובעת שהמספר ראשוני.
while מול for: במה לבחור?
מבחן מחשבתי מהיר:
- יש לכם אוסף לעבור עליו? →
for. - צריך לחזור מספר קבוע של פעמים? →
for i in range(n):. - אתם רצים בלולאה עד שתנאי כלשהו משתנה? →
while.
בקוד Python של מתחילים תגלו ש-for מכסה 90% מהלולאות. while מופיעה כשעושים דברים כמו בדיקה חוזרת של שירות, ניסיונות חוזרים או בניית REPL פשוט. אם אתם משתמשים ב-while כדי לעבור על רשימה עם אינדקס, זה סימן שכדאי לעבור ל-for יחד עם enumerate.
תוכנית while מעשית
משחק ניחוש מספרים הוא דוגמה קלאסית, כי מספר האיטרציות תלוי באופן שבו המשתמש משחק:
אי אפשר לדעת מראש כמה ניסיונות זה ייקח: זה תלוי בניחושים של המשתמש. זו בדיוק הסיבה ש-while קיימת.
מה הלאה
ראיתם עכשיו את שני סוגי הלולאות ש-Python מציעה. בהמשך: range() לעומק. היא מופיעה כמעט בכל לולאת for שסופרת, והדקויות הקטנות שלה שוות הבנה לפני שנעבור לאוספים.
שאלות נפוצות
מתי להשתמש בלולאת while במקום לולאת for?
השתמשו ב-while כשאתם לא יודעים מראש כמה איטרציות תצטרכו: למשל, לנסות שוב עד שמשהו מצליח, או לקרוא קלט עד שהמשתמש מקליד 'quit'. השתמשו ב-for כשעוברים על אוסף ידוע.
איך נמנעים מלולאה אינסופית ב-Python?
ודאו שמשהו בתוך הלולאה יהפוך בסופו של דבר את התנאי ל-false. הסיבה הנפוצה ביותר ללולאות אינסופיות היא שכחה לעדכן את המשתנה שהתנאי תלוי בו. אם נתקעתם באחת, לחצו Ctrl+C בטרמינל כדי לעצור אותה.
האם while True זה הרגל רע?
while True זה הרגל רע?לא מעצם טבעו. while True: עם break ברור בפנים היא תבנית רגילה לגמרי עבור "חזור על הלולאה עד שנגיע לתנאי יציאה מסוים". זה נקי יותר מלהמציא דגל בוליאני שצריך לנהל בשני מקומות.