
[x + 2 for x in l] יוצר רשימה חדשה שבה כל איבר ברשימה המקורית גדל ב-2. במקום לולאה, הוספה ושתי שורות, יש שורה אחת.if x % 2 == 0, ואז נשמרים רק הערכים הזוגיים.[x + y for x in a for y in b] יוצר זוגות מכל שילוב של איבר מ-a ואיבר מ-b. אפשר להוסיף תנאים בין הלולאות.items() כדי לעבור על זוגות מפתח-ערך. בדוגמה מתהפכים המפתחות והערכים.dict(...) עם הביטוי בתוכו. בפייתון 2.7 הסינטקס בסוגריים מסולסלים נתמך.הטקסט המלא של הדקות הראשונות בהרצאה «list comprehension» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
עכשיו אני אדבר קצת על דברים מורכבים בליסט. בעצם הדבר העיקרי שאני אדבר עליו זה ליסט קומפריאנצ'ן. מה זה ליסט קומפריאנצ'ן? זה דרך קצרה לכתוב לולאות for.
ובואו נתחיל בדוגמה קצרה. נגיד יש לי איזשהו תעדיף באינטראקטיב של. נגיד יש לי איזשהו ליסט ששווה לערכים 1, 1, 2, 3. אני מוכתוב פה l שווה. אני מוציא 1, 2, 3, 4.
עכשיו אני רוצה לעשות ליסט חדש שמכיל בתוכו, נתחיל בדוגמה הכי פשוטה, את כל הערכים שב-L פלוס 2. מה זאת אומרת? אז אני אומר L2 שווה ל-X, 4X in L, ולא X, אני רוצה ל-X ועוד 2.
ובואו נוסיף פה הדפסה של L2 ואחרי זה נסביר את הסינטקס המעניין הזה. אוקיי, אז מה יש לנו פה? אנחנו בעצם, דבר ראשון הגדרנו ליסט שנקרא L, אתם מכירים בתוכו את המספרים 1 עד 4, יכולנו גם לעשות ככה דרך אגב.
אני אתן פה תתן אותו דבר. ואז אני אומר ככה, יש לי את x. מי זה x? x זה כל x שנמצא ב-l. מה זה l?
l זה הרשימה שהגדרתי פה. אז אני בעצם אומר, יש לי פה סוגריים, זה אומר שאני רוצה ליצור ליסט חדש. אני רוצה שתיצור לי ליסט חדש, שכל ערך בתוכו יהיה שווה ל-x ועוד 2, עבור כל x שנמצא ב-l.
עכשיו, יכולתי גם לכתוב פה x כפול 2, זה היה עובד אותו דבר, וגם x בחזקת 2, זה היה עובד אותו דבר בדיוק. עכשיו, מה מיוחד?
כלומר, הדבר הזה, אם הייתי רוצה לכתוב את זה בצורה יותר ארוכה, הייתי כותב ככה: for x in l, הייתי כותב ככה: l2 שווה ד"ש, ואז הייתי עושה l2 נקודה band l ועוד 2, פועל בחזקת שתיים, ואז הייתי בעצם מקבל אותו דבר, אבל זה היה לי שתי שורות במקום שורה אחת.
קיבלנו פה במקום סינטקס של שתי שורות, קיבלנו שורה אחת, אבל יותר מזה, פייתון עושה אופטימיזציה לקוד הזה.
ברגע שמשהו הוא list comprehension, אני יכול להוסיף לכם פה טיימינג ודברים כאלה, אבל תסמכו עליי שהקוד רץ יותר מהר. יותר מזה, ברגע שמתרגלים אליו, וזה לא כל כך קשה להתרגל אליו, הקוד הוא הרבה יותר קריא הוא קצר עכשיו בוא נראה קצת ליסט קומפריאנצ'ן יותר מתקדם בוא
נעשה שזה שווה לרנג' 20 עכשיו בוא נגיד שאני רוצה ליצור ליסט חדש שמכיל רק את המספרים הזוגיים שנמצאים ב-l נעשה l2 שווה x for x in l if x מודול הוא 2 שווה שווה 0 בוא נעשה קצת ספייסים בוא נריץ את זה בעצם מה יש לנו פה אנחנו אומרים ככה תיצור לי ליסט בליסט הזה יהיה את ה-x מה זה x?
x זה כל x שנמצא ב-l, אבל רק אם x מודול הוא 2 שווה שווה 0. כלומר, אם x חלקי 2 שווה 0, כלומר, רק אם x הוא זוגי. באמת שקיבלנו פה את כל המספרים הזוגיים בין 0 עד 19.
עכשיו, היינו גם יכולים לעשות and x מודול הוא 3 שווה שווה 0, וזה היה מביא לנו את כל המספרים שמתחלקים ב-2 וב-3.
יכולנו גם לעשות אור ויכולנו לסבך את זה עוד יותר, אבל אני לא רוצה להגיע לשם, אני חושב שזה פשוט יהפוך להיות קוד לוקרי.
יכולנו גם לעשות כל החזקות, כל הריבועים של המספרים שמתחלקים ב-2 וב-3, וזה גם היה עובד לא רע בכלל, אפילו די טוב. עכשיו בואו נעשה משהו קצת יותר מתקדם. לולאת list comprehension כפול, בואו נעשה ככה x פלוס y for x in a,b,c,d, for y in a,b,c,d.
נעשה לזה פרינט, בואו נראה מה קיבלנו. נעיף שתי דבר הזה. בעצם קיבלנו פה זוג, זוג סדור מכל חיבור של הליסטים האלה. כלומר, אני אמרתי, תיצור לי ליסט חדש שמכיל חיבור של x ועוד y, כאשר x הוא כל תו שמופיע בסטרינג a,b,c,d, ו-Y הוא תו שמופיע ב-ABCD קטן.
אז קיבלנו A גדול A קטן, אחרי זה קיבלנו A גדול B קטן, A גדול C קטן. בעצם אם אני אכתוב את הדבר הזה בתור לולאה ארוכה, אז זה היה נראה ככה:
4X in A ABCD, 4Y in ABCD, פרינט X ועוד Y. שימו לב שבמקום שלוש שורות, קיבלתי פה שורה אחת בקוד די קריא, הוא די מובן. עכשיו אפשר גם לעשות ועוד Z ועוד W ועוד, לא חייב להיות X ו-Y דרך אגב, זה סתם מספרים, סתם משהו שיכולתי גם לכתוב פה T וגם לשנות, אבל גם בידי צריך לשנות ל-T, וזה היה עובד.
הקוד פה הרבה יותר קריא,