תרגילי סיכום- קולונל האטי

לגביי הסעיף הזה בשאלה- “אחרי שהצלחתם, ודאו שה־decorator שלכם פועל על כל כמות פרמטרים שהיא (ב־ fibo יש רק אחד, אבל עליכם לדאוג שה־decorator שלכם יהיה גמיש לכמות הפרמטרים שהוא מקבל).”

האם הערך של fibo שנשמר כל פעם צריך להיות תלוי בשאר הארגומנטים שיכולים לעבור לפונקציה או רק בn?

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

3 לייקים

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

2 לייקים

מהניסיון שלי עם ובלי ריצה של עד 40 רואים הבדלים של שמיים וארץ מבחינת מהירות.

נ.ב.
אם תריצו עד 100 תקבלו מספרים מטורפים

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

3 לייקים

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

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

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

נסה לחשוב על מה בעצם הדקורטור אמור לעשות. הוא אמור לבדוק אם הפונקציה כבר הפיקה תוצאה עבור ארגומנט מסוים שהוא מקבל (מתוך הפונקציה עצמה), ואם היא עשתה את זה אז כבר אז הוא אומר לפונקציה “עזבי, אני מטפל בזה” ושולף את התוצאה שכבר הופקה בעבר. אז צריך לחשוב איזה מבנה נתונים מתאים לשמירה ולשליפה קלה ומהירה של נתון אחד מנתון אחר. הסינטקס של args* גם מאפשר לך לקרוא לארגומנטים האלה בתוך ה wrapper ומחוצה לו, והוא מאפשר להתייחס ליותר מארגומנט אחד. אני לא רוצה לתת פה יותר מדי מהתשובה אז אני ממליץ לך לעשות כמה ניסיות עם הסינטקס הזה ועם דרכים שונות לקרוא לו ולראות מה אתה מקבל (מן הסתם בעיקר הודעות על חריגה, אבל כאלו שיעזרו לך להבין מה הקוד שלך בעצם עושה).

לייק 1

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

לייק 1

יש לך במקרה אולי דוגמה לבדיקה לחלק הזה? רוצה לבדוק שעבד לי :slight_smile:

אפשר למשל להוסיף ל-fibo ארגומנטים שאת לא עושה איתם כלום :slight_smile:

לייק 1

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

def maximum(*args):
    return max(*args)


print([[maximum(i - 1, i, i+1), maximum(i, i+1, i+2)] for i in range(1,1000)])

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