Get started learning Python with DataCamp's free Intro to Python tutorial. Learn Data Science by completing interactive coding challenges and watching videos by expert instructors. Start Now!
This site is generously supported by DataCamp. DataCamp offers online interactive Python Tutorials for Data Science. Join 11 million other learners and get started learning Python for data science today!
Good news! You can save 25% off your Datacamp annual subscription with the code LEARNPYTHON23ALE25 - Click here to redeem your discount
גנרטורים
מחוללים הם קלים מאוד ליישום, אך מעט קשה להבין.
מחוללים משמשים ליצירת איטרטורים, אך בגישה שונה. מחוללים הם פונקציות פשוטות שמחזירות מערך איטרבילי של פריטים, אחד בכל פעם, בצורה מיוחדת.
כאשר מתחילה איטרציה על מערך פריטים באמצעות הצהרת for, המחולל מופעל. ברגע שקוד פונקציית המחולל מגיע להצהרת "yield", המחולל מחזיר את הביצוע ללולאת ה-for, מחזיר ערך חדש ממערך הפריטים. פונקציית המחולל יכולה להפיק כמה ערכים שהיא רוצה (אולי אינסופיים), ומחזירה כל אחד בתורו.
הנה דוגמה פשוטה של פונקציית מחולל שמחזירה 7 שלמים אקראיים:
import random
def lottery():
# מחזיר 6 מספרים בין 1 ל-40
for i in range(6):
yield random.randint(1, 40)
# מחזיר מספר שביעי בין 1 ל-15
yield random.randint(1, 15)
for random_number in lottery():
print("And the next number is... %d!" %(random_number))
פונקציה זו מחליטה כיצד לייצר את המספרים האקראיים בעצמה, ומבצעת את הצהרות ה-yield אחת אחר השנייה, עוצרת ביניהן כדי להחזיר את הביצוע ללולאת for הראשית.
תרגיל
כתוב פונקציית מחולל שמחזירה את סדרת פיבונאצ'י. הם מחושבים באמצעות הנוסחה הבאה: שני המספרים הראשונים של הסדרה הם תמיד שווים ל-1, וכל מספר עוקב שמוחזר הוא סכום של שני המספרים האחרונים. רמז: האם תוכל להשתמש רק בשתי משתנים בפונקציית המחולל? זכור שניתן לבצע הקצאות בו זמנית. הקוד
a = 1
b = 2
a, b = b, a
print(a, b)
יחליף בו זמנית את הערכים של a ו-b.
# fill in this function
def fib():
pass #this is a null statement which does nothing when executed, useful as a placeholder.
# testing code
import types
if type(fib()) == types.GeneratorType:
print("Good, The fib function is a generator.")
counter = 0
for n in fib():
print(n)
counter += 1
if counter == 10:
break
# fill in this function
def fib():
a, b = 1, 1
while 1:
yield a
a, b = b, a + b
# testing code
import types
if type(fib()) == types.GeneratorType:
print("Good, The fib function is a generator.")
counter = 0
for n in fib():
print(n)
counter += 1
if counter == 10:
break
test_output_contains("Good, The fib function is a generator.")
success_msg('Good work!')
This site is generously supported by DataCamp. DataCamp offers online interactive Python Tutorials for Data Science. Join over a million other learners and get started learning Python for data science today!