לדלג לתוכן

מדריך לרשימות הבנה בפייתון - list comprehension בלי להתבלבל

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

למה בכלל צריך את זה

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

numbers = [1, 2, 3, 4, 5]
squares = []
for n in numbers:
    squares.append(n ** 2)

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

התחביר הבסיסי

squares = [n ** 2 for n in numbers]

תקראו את זה מימין לשמאל בערך כמו משפט - "עבור כל n ב-numbers, קח את n בריבוע". זהו. אותה תוצאה בדיוק כמו הלולאה למעלה, בשורה אחת קריאה.

הנוסחה הכללית היא [ביטוי for איבר ברשימה]. הביטוי בהתחלה הוא מה שקורה לכל איבר לפני שהוא נכנס לרשימה החדשה.

הוספת תנאי - if

אפשר גם לסנן איברים תוך כדי:

even_squares = [n ** 2 for n in numbers if n % 2 == 0]

זה שקול ל:

even_squares = []
for n in numbers:
    if n % 2 == 0:
        even_squares.append(n ** 2)

שימו לב שהתנאי בא בסוף. זה מסנן, לא ממיין - הוא בוחר אילו איברים בכלל נכנסים לרשימה.

דוגמה מהחיים האמיתיים

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

names = ["דן", "אלכסנדרה", "בן", "יהונתן"]
long_names = [name.upper() for name in names if len(name) > 4]

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

מתי לא כדאי להשתמש בזה

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

# זה כבר פחות קריא
result = [x * 2 if x % 2 == 0 else x * 3 for x in data if x > 0 and x != 13]

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

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

בונוס - dict ו-set comprehension

אותו רעיון עובד גם למילונים וקבוצות, רק עם סוגריים מסולסלים:

squares_dict = {n: n ** 2 for n in numbers}
unique_lengths = {len(name) for name in names}

השימוש זהה, פשוט התוצאה היא מבנה נתונים אחר.

לסיכום

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

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

תרגלו רשימות הבנה ועוד בקורס תכנות בסיסי

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

הצטרפו לקהילה בדיסקורד