ביטויי מחולל
שיעור 9 מתוך 13 בקורס איטרטורים ב-Python של Coddy.
ביטויי גנרטור הם דרך תמציתית ליצור איטרטורים ב-Python. הם מספקים חלופה חסכונית יותר בזיכרון לביטויי רשימה, במיוחד כשעובדים עם מערכי נתונים גדולים או עם רצפים אינסופיים.
תחביר של ביטויי גנרטור
ביטויי גנרטור משתמשים בתחביר דומה לזה של ביטויי רשימה, אך עם סוגריים עגולים במקום סוגריים מרובעים:
(expression for item in iterable if condition)תכונות עיקריות
- הערכה עצלה: ביטויי גנרטור מפיקים פריטים בזה אחר זה ורק כשהם מתבקשים לעשות זאת, וכך חוסכים בזיכרון.
- איטרטורים לשימוש חד-פעמי: לאחר שמיצו אותם, אי אפשר להשתמש בהם שוב בלי ליצור מחדש את הגנרטור.
- תחביר תמציתי: הם מציעים דרך קומפקטית להגדיר פונקציות גנרטור פשוטות.
דוגמה לשימוש
הנה דוגמה פשוטה לביטוי גנרטור שמפיק מספרים בריבוע:
squares = (x**2 for x in range(5))
for square in squares:
print(square) # פלט: 0, 1, 4, 9, 16
השוואה לביטויי רשימה
אף שהתחביר דומה, ביטויי גנרטור נבדלים מביטויי רשימה מבחינת השימוש בזיכרון:
# הבנת רשימה (יוצרת רשימה מלאה בזיכרון)
squares_list = [x**2 for x in range(1000000)]
# ביטוי גנרטור (יוצר אובייקט גנרטור)
squares_gen = (x**2 for x in range(1000000))
ביטוי הגנרטור חסכוני יותר בזיכרון, משום שהוא לא יוצר את כל הערכים בבת אחת.
מקרי שימוש
ביטויי גנרטור שימושיים במיוחד כאשר:
- עובדים עם מערכי נתונים גדולים
- מעבדים זרמי נתונים
- יוצרים צינורות נתונים
באמצעות ביטויי גנרטור, אפשר ליצור איטרטורים יעילים וחסכוניים בזיכרון למשימות שונות של עיבוד נתונים ב-Python.
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
אתגר
קלצרו ביטוי מחולל שמסנן ומשנה רצף של מספרים. המחולל צריך להפיק את הריבועים של המספרים הזוגיים בטווח נתון.
הנתונים הבאים ניתנים לכם:
- שני מספרים שלמים כקלט:
startו-end(כולל)
המשימה שלכם:
- ליצור ביטוי מחולל ש:
- עובר על הטווח מ-
startעדend(כולל) - מסנן את המספרים האי-זוגיים
- מעלה בריבוע את המספרים הזוגיים שנותרו
- עובר על הטווח מ-
- להשתמש בביטוי המחולל בלולאה כדי להדפיס כל ערך שמתקבל בשורה חדשה
הקלט יינתן כשני מספרים שלמים המופרדים ברווח, המייצגים את start ואת end.
נסו בעצמכם
# קראו את הקלט
start, end = map(int, input().split())
# TODO: צרו כאן את ביטוי הגנרטור שלכם
generator_exp = None # החליפו את None בביטוי הגנרטור שלכם
# הדפיסו את התוצאות
for value in generator_exp:
print(value)כל השיעורים ביחידה איטרטורים ב-Python
תרגלו בעצמכם: קומפיילר Python אונליין