Menu

לולאות for ב-Python: מעבר על רשימות, מחרוזות, ranges ומילונים

איך עובדת לולאת for ב-Python: מעבר על רשימות, מחרוזות, ranges, מילונים וכל דבר אחר שאפשר לעבור עליו, ובנוסף break, continue ו-else.

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

לולאת for של Python היא "for each"

אם השתמשתם בשפה בסגנון C, לולאת for של Python תיראה לכם שונה. אין דפוס מונה של for (i = 0; i < n; i++). ה-for של Python היא לולאת for each לכל דבר: נותנים לה אוסף והיא מגישה את הפריטים אחד אחרי השני.

זה מדפיס שלוש שורות. Python קוראת את הרשימה, שולפת כל איבר בתורו וקושרת אותו ל-color בזמן שהגוף רץ. כשלא נשאר כלום, הלולאה מסתיימת.

שימו לב לצורה: for <name> in <iterable>: ואחריה גוף מוזח. הזחה, נקודתיים, גוף; אותו מבנה כמו if.

מה נחשב iterable

כמעט כל דבר שמחזיק רצף של ערכים. רשימות, tuples, מחרוזות, ranges, dicts, sets, קבצים ורוב האובייקטים המותאמים אישית שתבנו.

האחידות היא החלק הנחמד: תחביר אחד, צורות נתונים רבות.

ספירה עם range()

כשכן רוצים מונה, "תעשו את זה עשר פעמים" או "עברו על האינדקסים 0 עד 9", השתמשו ב-range():

זה מדפיס 0, 1, 2, 3, 4. range(stop) סופרת מ-0 ועד stop, לא כולל. range(start, stop) מאפשרת לקבוע ערך התחלה, ו-range(start, stop, step) מאפשרת לשלוט בגודל הצעד:

יש עמוד ייעודי על range בהמשך, כי שווה להבין אותה קצת יותר לעומק. בינתיים, range(n) נותנת n איטרציות שממוספרות מ-0 עד n-1.

enumerate ב-Python: לולאה עם אינדקס

צורך נפוץ: "אני רוצה את האינדקס ואת הערך יחד". האינסטינקט של מתחילים הוא להשתמש ב-range(len(...)), אבל ל-Python יש כלי נחמד יותר:

enumerate() מחזירה זוגות (index, value). שני המשתנים אחרי for מפרקים את הזוג לשני שמות: index ו-color. הרבה יותר נקי מ:

אם רוצים להתחיל לספור מ-1 במקום מ-0, העבירו start=1:

zip ב-Python: מעבר על שני רצפים יחד

כשיש שתי רשימות באותו אורך ורוצים לצמד ביניהן:

zip נעצרת ברצף הקצר ביותר. אם רוצים שהיא תמשיך ותמלא ב-None, השתמשו ב-itertools.zip_longest.

מעבר על dict

מילונים נותנים לכם לבחור על מה לעבור בלולאה:

רוב הזמן תרצו את .items(): מקבלים את המפתח ואת הערך יחד בשורה אחת קריאה.

break ו-continue

לפעמים רוצים לצאת מוקדם או לדלג על איטרציה.

break יוצאת מהלולאה מיד:

ברגע שנמצא מספר גדול מ-6, הלולאה נעצרת. מתעלמים משאר הפריטים.

continue מדלגת על שאר האיטרציה הנוכחית ועוברת לבאה:

מותר להשתמש בשתיהן, אם כי continue יכולה להקשות על מעקב אחרי הלולאה אם יש יותר מאחת. הרבה פעמים if/else פשוט נקרא טוב יותר.

פסקת else בלולאה

ל-Python יש פיצ'ר שאין ברוב השפות: פסקת else בלולאות. היא רצה כשהלולאה מסתיימת בלי להגיע ל-break.

שימושי, אבל מבלבל בהתחלה. אל תרגישו חובה להשתמש בזה: דגל בוליאני מחוץ ללולאה הוא הרבה פעמים ברור יותר לקוראים חדשים.

שינוי רשימה בזמן המעבר עליה

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

או, כשתרגישו בנוח, list comprehension עושה את אותו הדבר בשורה אחת. נכסה את זה בפרק על אוספים.

דוגמה קטנה מקצה לקצה

נחבר כמה מהדברים האלה יחד: קריאת רשימה, סינון, enumerate והדפסה:

הבא בתור: לולאות while

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

שאלות נפוצות

איך עובדת לולאת for ב-Python?

for item in sequence: מריצה את הגוף המוזח פעם אחת לכל איבר ברצף, כש-item מקבל כל ערך בתורו. רצפים כוללים רשימות, tuples, מחרוזות, dicts, ranges וכל אובייקט שמגדיר איטרטור.

מה ההבדל בין break ל-continue?

break יוצאת מהלולאה מיד ומדלגת על כל האיטרציות שנותרו. continue מדלגת על שאר האיטרציה הנוכחית ועוברת לבאה. break נועדה ל"סיימתי"; continue נועדה ל"דלגו על זה".

איך עוברים בלולאה עם אינדקס ב-Python?

עטפו את הרצף ב-enumerate(...) כדי לקבל זוגות (index, value): for i, item in enumerate(items):. הרבה יותר נקי מלתחזק מונה משלכם עם i += 1 בסוף הלולאה.

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

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

להתחיל