למד כיצד סוג פונקציה חלופי זה יכול לעזור לך להפחית את טביעת הרגל של הזיכרון.
אם אתה קורא שורות מקובץ יומן או מעבד רשימה ארוכה של פריטים, אפשרות אחת היא לטעון את כל הנתונים לזיכרון. עם זאת, גישה זו יכולה להשתמש בהרבה זיכרון ולהפריע לביצועים. גנרטורים מציעים פתרון בעל ערך.
גנרטורים מבטלים את הצורך לטעון את כל הנתונים לזיכרון בו זמנית. הם שימושיים בעת טיפול במערכי נתונים גדולים, רצפים אינסופיים, או כל תרחיש שבו יעילות הזיכרון היא מעל הכל.
מה הם גנרטורים?
מחולל הוא פונקציה מיוחדת המאפשרת לך לחזור על רצף של ערכים. במקום להחזיר סט שלם של נתונים, הם מייצרים - או מניבים - ערך אחד בכל פעם. זה הופך אותם ליעילים לעבודה עם רצפי נתונים גדולים או בלתי מוגבלים.
א פונקציית Python רגילה בדרך כלל מחשב ערך ומחזיר אותו. אבל גנרטורים פועלים אחרת. הם יכולים להניב ערכים מרובים לאורך זמן על ידי השהייה וחידוש ביצוע בין כל תשואה.
ההבחנה העיקרית בין פונקציות רגילות למחוללים היא שבמקום להשתמש ב- לַחֲזוֹר מילת מפתח כדי לייצר תוצאה, גנרטורים משתמשים תְשׁוּאָה.
כיצד ליצור גנרטור
כדי ליצור מחולל, במקום את לַחֲזוֹר הצהרה, השתמש ב-a
תְשׁוּאָה הצהרה בתוך הפונקציה. ה תְשׁוּאָה מילת מפתח לא רק מורה לפונקציה להחזיר ערך אלא גם מאפשרת לה לשמור את מצבה, מה שמאפשר חידוש עתידי.הנה דוגמה לפונקציית מחולל פשוטה:
defnumeric_generator():
yield1
yield2
yield3
gen = numeric_generator()
פונקציית מחולל זו מניבה ערכים מספריים מ-1 עד 3.
ה תְשׁוּאָה הצהרה שומרת את מצב הפונקציה, תוך שמירה על משתנים מקומיים בין קריאות, כדי להמשיך כאשר תבקש את הערך הבא.
הקצאת פונקציית מחולל למשתנה יוצרת אובייקט מחולל שאפשר לעבוד איתו.
עבודה עם גנרטורים
לגנרטורים יש מספר יישומים. אתה יכול להשתמש בהם בעבור לולאות אוֹ בתוך הבנת הרשימה, כמו גם מבנים אחרים שניתנים לחזרה. גנרטורים יכולים לשמש גם כארגומנטים לפונקציות.
לאחר שיצרת מחולל, תוכל לחזור עליו באמצעות לולאת for:
for i in numeric_generator():
print(i)
אתה יכול גם להשתמש ב הַבָּא פונקציה לאחזור ערכים אחד אחד:
print(next(gen)) # 1
print(next(gen)) # 2
print(next(gen)) # 3
זה נותן לך יותר שליטה על אובייקט המחולל.
גנרטורים יכולים לעקוב אחר מצבם. כל הצהרת תשואה בפונקציה פועלת כמו מחסום. כשאתה מתקשר ל הַבָּא() פונקציה באובייקט המחולל, הביצוע מתגבר מנקודת התפוקה הקודמת.
אתה יכול גם להעביר ערכים לתוך מחולל באמצעות לִשְׁלוֹחַ():
defgenerator_with_send():
# First yield: Receive a value
x = yield
print(f"Received: {x}")# Second yield: Receive another value
y = yield
print(f"Received: {y}")# Third yield: Yield the sum
yield x + ygen = generator_with_send()
# Start generator and reach first yield
next(gen)# Send 10 into generator, received at first yield
result = gen.send(10)# Send 5 into generator, received at second yield
result = gen.send(5)
# Print result of third yield
print(result)
ה לִשְׁלוֹחַ() השיטה מאפשרת לך לאחזר ערכים מהמחולל ולשלוח ערכים בחזרה לפונקציית המחולל, למעשה להשהות אותה ומאפשרת לך לשלוט בביצוע שלה. ה לִשְׁלוֹחַ() השיטה שימושית בעת כתיבת קורוטינים או שימוש במחוללים למטרות מתקדמות.
שימוש בביטויי מחולל
ביטויי מחולל מספקים דרך תמציתית ליצור מחולל פשוט ואנונימי. הם דומים להבנת הרשימה אך משתמשים בסוגריים במקום בסוגריים.
הנה דוגמא:
gen = (i**2for i in range(10))
for x in gen:
print(x)
הקוד יוצר ביטוי מחולל המניב את הריבועים של המספרים 0 עד 9. ביטויי מחולל הם אידיאליים ליצירת רצף ערכים בעצלתיים.
שימוש בגנרטורים לעיבוד נתונים
מחוללי פייתון הם דרך נוחה לתאר זרמי נתונים ולבנות איטרטורים מבלי לשמור הכל בזיכרון. אתה יכול לשפר משמעותית את התכנות שלך על ידי לימוד השימוש במחוללים, מה שמקל על הטיפול במשימות עיבוד נתונים מאתגרות.
בפעם הבאה שאתה עובד עם מערכי נתונים גדולים, זכור את המחוללים והאציל להם את המשימות עתירות העבודה, כך שהקוד שלך יישאר מגיב ויעיל.