מהם גנרטורים בפייתון וכיצד להשתמש בהם?



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

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

להלן רשימה של כל הנושאים המכוסים במאמר זה:





אז בואו נתחיל. :)

מהם גנרטורים בפייתון?

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



יתרונות השימוש בגנרטורים

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

  • גנרטורים קלים ליישום מכיוון שהם מיישמים אוטומטית __iter __ (), __next __ () ו- StopIteration, שאם לא כן, יש לציין אותם במפורש.



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

  • ניתן להשתמש בהם כדי לייצר אינסוף פריטים.

  • הם יכולים לשמש גם לצינור מספר פעולות

פונקציות רגילות לעומת פונקציות גנרטור:

גנרטורים בפייתון נוצרים בדיוק כמו איך שאתה יוצר באמצעות מילת המפתח 'def'. עם זאת, פונקציות Generator עושות שימוש במילת המפתח תשואה במקום בתמורה להחזר. זה נעשה כדי להודיע ​​למתורגמן שמדובר באיטרטור. לא רק זה, פונקציות הגנרטור מופעלות כאשר הפונקציה הבאה () נקראת ולא בשמם כמו במקרה של פונקציות רגילות. שקול את הדוגמה הבאה כדי להבין אותה טוב יותר:

דוגמא:

def func (a): תשואה a = [1,2,3] b = func (a) הבא (b)

תְפוּקָה: [1, 2, 3]

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

דוגמא:

def func (a): להחזיר a a = [1,2,3] func (a)

תְפוּקָה: [1, 2, 3]

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

שימוש בפונקציות גנרטור:

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

דוגמא:

def myfunc (a): בעוד a> = 3: מניב a a = a + 1 b = myfunc (a) הדפס (b) הבא (b)

כאשר אתה מבצע את הפונקציה הבאה, תראה את הפלט הבא:

תְפוּקָה: 4

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

הבא (ב)

תְפוּקָה: 5

בביצועים נוספים, הפונקציה תחזיר 6,7 וכו '. פונקציות גנרטור בפייתון מיישמות את השיטות __iter __ () ו- __next __ () באופן אוטומטי. לכן, אתה יכול לחזור על האובייקטים פשוט על ידי שימוש בשיטה הבאה (). כאשר ייצור הפריטים אמור להסתיים, פונקציות הגנרטור מיישמות את StopIteration באופן פנימי מבלי לדאוג למתקשר. הנה דוגמה נוספת לכך:

דוגמא:

a = 2 def myfunc (a): בעוד a> = 0: מניב a - = 1 b = myfunc (a) הדפס (b) הבא (b)

תְפוּקָה:

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

דוגמא:

def z (): n = 1 תשואה n n = n + 3 תשואה n p = z () הבא (p)

תְפוּקָה:

גנרטורים עם לולאות:

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

דוגמא:

def z (): n = 1 תשואה n n = n + 3 תשואה n עבור x ב- z (): הדפס (x)

תְפוּקָה:

אחד
4

ניתן גם לציין ביטויים ליצירת אובייקטים הניתנים לאיטרציה.

ביטויים של גנרטור:

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

בדוק את הדוגמה הבאה:

דוגמא:

a = טווח (6) הדפס ('הבנת רשימה', סוף = ':') b = [x + 2 עבור x ב- a] הדפס (b) הדפס ('ביטוי גנרטור', סוף = ': n') c = (x + 2 עבור x ב- a) הדפס (c) עבור y ב- c: הדפס (y)

תְפוּקָה:

איך עובד מיתר בג'אווה

הבנת רשימה: [2, 3, 4, 5, 6, 7]

ביטוי גנרטור:

2
3
4
5
6

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


גֵנֵרָטוֹרניתן להשתמש בפונקציות גם בפונקציות אחרות.לדוגמה:

דוגמא:

a = טווח (6) הדפס ('ביטוי גנרטור', סוף = ': n') c = (x + 2 עבור x ב- a) הדפס (c) הדפס (min (c))

תְפוּקָה:

ביטוי גנרטור
2

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

מקרי שימוש:

הבה נשתמש בגנרטורים ב- ל:

  • צור סדרת פיבונאצ'י
  • יצירת מספרים

יצירת סדרת פיבונאצ'י:

סדרת פיבונאצ'י כפי שכולנו מכירים היא סדרת מספרים בה כל מספר הוא סכום של שני מספרים קודמים. שני המספרים הראשונים הם 0 ו- 1. הנה תוכנית מחולל להפקת סדרת פיבונאצ'י:

דוגמא:

def fibo (): ראשון, שני = 0,1 ואילו נכון: תשואה ראשונה ראשונה, שנייה = שנייה, ראשונה + שנייה ל- x ב- fibo (): אם x> 50: הפסקה (x, end = ')

תְפוּקָה:

0 1 1 2 3 5 8 13 21 34

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

יצירת מספרים:

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

דוגמא:

a = טווח (10) b = (x עבור x ב- a) הדפס (b) עבור y ב- b: הדפס (y)

תְפוּקָה:

0
אחד
2
3
4
5
6
7
8
9

דוגמא:

a = טווח (2,10,2) b = (x עבור x ב- a) הדפס (b) עבור y ב- b: הדפס (y)

תְפוּקָה:


2
4
6
8

התוכנית לעיל החזירה מספרים זוגיים מ -2 עד 10. זה מביא אותנו לסוף מאמר זה בנושא Generators in Python. אני מקווה שהבנת את כל הנושאים.

דאג שתתאמן ככל האפשר ותחזיר את החוויה שלך.

יש לך שאלה עבורנו? אנא הזכיר זאת בקטע ההערות בבלוג 'גנרטורים בפייתון' ונחזור אליך בהקדם האפשרי.

כדי לקבל ידע מעמיק על Python יחד עם היישומים השונים שלו, אתה יכול להירשם לשידור חי עם תמיכה 24/7 וגישה לכל החיים.