Menu

לולאת while ב-Python: תחביר, while True ואיך נמנעים מלולאה אינסופית

מתי לבחור לולאת while במקום לולאת for, איך נמנעים מלולאות אינסופיות, והתבניות שחוזרות הכי הרבה בקוד אמיתי.

בדף הזה יש עורכים שאפשר להריץ - לערוך, להריץ ולראות את הפלט מיד.

לולאה שמשגיחה על תנאי

בעוד ש-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: עם break ברור בפנים היא תבנית רגילה לגמרי עבור "חזור על הלולאה עד שנגיע לתנאי יציאה מסוים". זה נקי יותר מלהמציא דגל בוליאני שצריך לנהל בשני מקומות.

איור של שפות התכנות ב-Coddy

ללמוד תכנות עם Coddy

להתחיל