PracticU

generators

בלי כתוביותעם כתוביות
PracticU › קורס פייתון - Python › generators
מילון מושגים:
פונקציה - קטע קוד בעל שם שמבצע משימה מוגדרת, מקבל ערכי קלט (פרמטרים) ויכול להחזיר תוצאה. מאפשרת לארגן קוד ולהשתמש בו שוב.
זיכרון - רכיב מהיר ונדיף שבו המחשב שומר נתונים ותוכניות בזמן ריצתם. תוכנו נמחק עם כיבוי המחשב.
משתנה - שם שמפנה למקום בזיכרון שבו נשמר ערך שיכול להשתנות במהלך ריצת התוכנית, כמו מספר, טקסט או אובייקט.
לולאה - מבנה בקרה שחוזר על קטע קוד שוב ושוב כל עוד תנאי מתקיים או עבור כל פריט באוסף.

generators
בשיעור נלמד על generators בפייתון: פונקציה שמחזירה ערכים אחד אחד לפי דרישה, בלי ליצור את כל הרשימה בזיכרון בבת אחת.
השלבים העיקריים
1. מילת המפתח yield: פונקציה שמכילה yield לא מחזירה רשימה. בכל קריאה היא מחזירה ערך אחד, עוצרת, וממשיכה מאותו מקום בקריאה הבאה.
2. דוגמה ראשונה: מגדירים פונקציה שמייצרת מספרים מערך התחלה עד ערך הסיום, בעזרת while ו-yield. לולאת for מדפיסה את המספרים אחד אחרי השני.
3. השוואה ל-range: range בונה רשימה שלמה בזיכרון, ואילו הפונקציה עם yield מייצרת את הערך הבא רק כשצריך אותו. ההבדל נראה כשהטווח גדול מאוד.
4. סדרת פיבונאצ'י: כותבים generator שמחזיק שני משתנים, ובכל קריאה מחזיר את המספר הבא בסדרה. אפשר להמשיך לקרוא ממנו בלי גבול מוגדר מראש.
5. generator expression: ביטוי שנראה כמו list comprehension, אבל עם סוגריים עגולים במקום מרובעים. הוא לא בונה רשימה, ומייצר ערכים לפי הצורך.
איך זה עובד
כשפייתון רואה yield, היא שומרת את מצב הפונקציה, מחזירה את הערך, ובקריאה הבאה ממשיכה מהשורה שאחרי yield. לכן משתנים שנוצרו לפני yield נשמרים בין הקריאות.
פקודות והגדרות
- def my_range(start, stop): עם yield
- gen = (x * x for x in lst)
- for num in (x * x for x in lst):
טעויות נפוצות
- ג'נרטור הוא חד-פעמי. אחרי שנקרא ממנו עד הסוף, הוא ריק, ולכן צריך ליצור אותו מחדש לכל שימוש חדש.
- פונקציה עם return בתוך לולאה מחזירה ערך אחד בלבד, לא סדרה.
שימו לב
generator חוסך זיכרון כשהמידע גדול, ו-list comprehension נוח כשצריך את כל הרשימה בידיים.
השיעור הבא בקורס: process

פרקי ההרצאה: generators

  1. 00:00

    מה זה generator בפייתון

  2. 01:57

    הרצת הפונקציה והדפסת המספרים

  3. 02:33

    מילת המפתח yield ומה היא עושה

  4. 03:37

    הטיפוס של פונקציית generator

  5. 04:39

    המשך הריצה אחרי yield

  6. 05:38

    ההבדל בין generator לרשימה בזיכרון

  7. 06:32

    חיסכון בזיכרון בטווחים גדולים

  8. 08:24

    כתיבת generator מתוחכם יותר

תמלול ההרצאה: generators

הטקסט המלא של הדקות הראשונות בהרצאה «generators» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:03

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

  2. 00:34

    בואו נתחיל מטווח של מספרים אז def, בואו נקרא לזה my range היא מקבלת סטארט סטופ והיא עושה 4 in 4i in 4 שווה סטארט. בואו נכתוב את זה בצורה שגולה את while, while סטארט תתן קילד i ו-i פלוס שווה 1.

  3. 01:36

    עכשיו אני לא בודק פה באמת שסטארט קטן לסטופ, זאת לא הכוונה, הכוונה היא לראות מה הדבר הזה עושה. 4 num in my range 10 עד 20, פרינט num.

  4. 01:57

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

  5. 02:11

    אם הייתי רוצה עד 20, פשוט שווה. אוקיי, מה יש לנו פה? אז אנחנו בעצם for num, מספר בקריאה לפונקציה הזאת, תדפיס את num.

  6. 02:28

    עכשיו, האם אתם רואים פה איפשהו ש-my range מחזירה מספר? לא, אני לא רואה פה לא return, היא לא יוצרת פה ליסט, הדבר היחיד שהיא עושה זה יילד, יילד איי, מה זה יילד?

  7. 02:42

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

  8. 03:10

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

  9. 03:44

    אז מיי ריינג' הוא פונקציה. עכשיו, אם אני עושה a שווה מיי ריינג' 10 עד 20, מה הטייפ של a? הטייפ של a הוא ג'נרטור, שזה בעצם הנושא של השיעור שלנו.

  10. 04:06

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

  11. 04:21

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

  12. 04:42

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

  13. 04:53

    עוד פעם חוזר להולדת i, הפעם i שווה 11, יוצא החוצה, הוא מדפיס, חוזר, שורה אחרי הילד, וכן הלאה, וכן הלאה, וכן הלאה.

  14. 05:06

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

  15. 05:32

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

  16. 05:58

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

  17. 06:19

    בעצם הג'נרטור מאפשר לנו לחסוך במקום. אנחנו קוראים לפונקציה יותר פעמים, אבל מבחינת החיסכון במקום שהתוכנית שלי לוקחת היא לוקחת הרבה פחות מקום כי אני לא יוצר את כל הליסט בין הסטארט לסטופ אלא אני רק יוצר כל פעם את הערך הבא מתי זה טוב בוא נגיד ש-a שווה ל-range 10,000 ו-b שווה

  18. 06:51

    ל-x range פרינט a פרינט b שימו לב כמה מקום היינו צריכים פה הקומפיילר עדיין עובד פה הוא עדיין לא סיים לרוץ הוא עדיין מריץ מריץ אז בואו נעצור את זה, קצת קפצתי פה מעל הפופיק.

  19. 07:33

    בואו נתחיל מ-100. פרינט טייפ של A, פרינט טייפ של B. אז הפונקציה הראשונה החזירה לנו ריינג' ליסט.

  20. 07:57

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

  21. 08:09

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

  22. 08:23

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

לקורס המלא: קורס פייתון אונליין למתחילים

ההרצאה הקודמת: קבצים - files

ההרצאה הבאה: process

קורסים נוספים במסלול

  • קורס יסודות התכנות - שפת JAVA - קורס ג'אווה למתחילים
  • קורס PHP - פרויקט מעשי