לגביי הסעיף הזה בשאלה- “אחרי שהצלחתם, ודאו שה־decorator שלכם פועל על כל כמות פרמטרים שהיא (ב־ fibo יש רק אחד, אבל עליכם לדאוג שה־decorator שלכם יהיה גמיש לכמות הפרמטרים שהוא מקבל).”
האם הערך של fibo שנשמר כל פעם צריך להיות תלוי בשאר הארגומנטים שיכולים לעבור לפונקציה או רק בn?
orronai
לא מדובר על הפונקציה הספציפית fibo, אלא על ה-decorator עצמו - כך שהוא ידע להתמודד גם עם פונקציות עם מספר לא ידוע של ארגומנטים
3 לייקים
nirpn1
מחזק את התשובה.
בנוסף ממליץ להוסיף מקרה פרטי של פונקציה המקבלת מספר גדול יותר של ארגומנטים על מנת להיווכח שזה אכן פועל
2 לייקים
danihello
מהניסיון שלי עם ובלי ריצה של עד 40 רואים הבדלים של שמיים וארץ מבחינת מהירות.
נ.ב.
אם תריצו עד 100 תקבלו מספרים מטורפים
mbrodsky
לצורך בדיקה של המקרה הכללי הפתרון הכי פשוט הוא ליצור וריאציה של פונקציית פיבו שמקבלת ארגומנט נוסף אותו מוסיפים לתוצאה (נגיד להוסיף מאה לכל תוצאה שיוצאת). חשוב להזכיר שפיבו היא פונקציה רקורסיבית שקוראת לעצמה, אז יהיה צורך להוסיף את הארגומנט הזה גם לקריאות שנמצאות בתוך הפונקציה).
3 לייקים
eldad.el1234
אם כך-איך אנחנו יודעים איזה מפתח לחפש? לצורך העניין-מה הוא הn שלנו אם הדקוראטור אמור לעבוד על פונקציה עם כמות בלתי מוגבלת של פרמטרים?
mbrodsky
כדי להבין את זה צריך רענון קצר לגבי ארגומנטים בפונקציות. הדקורטור הוא הרי פונקציה. הוא מקבל לתוכו ארגומנטים ועושה משהו או מחזיר משהו. בהסבר על דקורטורים אפשר לראות שיש סינטקס ספציפי דרכו הדקורטור יכול לקבל לתוכו את הארגומנטים של הפונקציה עליה הוא מופעל ולהעביר אותם חזרה לפונקציה שנעטפת בתוכו. ספציפית יש את args* ואת kwargs* שנועדו לאפשר לפונקציות להתמודד עם מספר לא מוגדר מראש של ארגומנטים. אני ממליץ לך לקרוא שוב את ההסבר שים פרסם על דקורטורים ואת העמודים שהוא קישר אליהם לצורך הרחבה. כדי לחסוך לעצמך זמן חפש את החלק שעוסק בארגומנטים. זה יכול להיות קצת מבלבל והסינטקסט של זה הוא לא מובן מאליו, אבל זה קריטי להכיר ולתרגל אותו.
eldad.el1234
הסתכלתי שוב על ההסבר על דקורטורים, וראיתי סרטון שממש עזר לי, תודה!
אבל השאלה שלי הייתה יותר ברמת הניסוח של השאלה:
בדוגמא שאתה נתת (תרגילי סיכום- קולונל האטי), הארגומנטים המועברים לפונקציה החדשה הינם מיקום של מספר בסדרת פיבונאצ’י, ומספר נוסף שאותו מוסיפים אליו.
כיצד אדע איזה ערך לשמור? האם לשמור את שניהם (כלל הארגומנטים המועברים לפונקציה)? ובמידה והופעלה הפונקציה בעבר רק עם אחד מהם, האם עדיין אחזיר את הפונקציה או שלא?
בכל מקרה ההעמקה בדקורטורים עזרה לי מאוד להבנה שלהם, אז תודה רבה!
mbrodsky
נסה לחשוב על מה בעצם הדקורטור אמור לעשות. הוא אמור לבדוק אם הפונקציה כבר הפיקה תוצאה עבור ארגומנט מסוים שהוא מקבל (מתוך הפונקציה עצמה), ואם היא עשתה את זה אז כבר אז הוא אומר לפונקציה “עזבי, אני מטפל בזה” ושולף את התוצאה שכבר הופקה בעבר. אז צריך לחשוב איזה מבנה נתונים מתאים לשמירה ולשליפה קלה ומהירה של נתון אחד מנתון אחר. הסינטקס של args* גם מאפשר לך לקרוא לארגומנטים האלה בתוך ה wrapper ומחוצה לו, והוא מאפשר להתייחס ליותר מארגומנט אחד. אני לא רוצה לתת פה יותר מדי מהתשובה אז אני ממליץ לך לעשות כמה ניסיות עם הסינטקס הזה ועם דרכים שונות לקרוא לו ולראות מה אתה מקבל (מן הסתם בעיקר הודעות על חריגה, אבל כאלו שיעזרו לך להבין מה הקוד שלך בעצם עושה).
לייק 1
mbrodsky
אני אוסיף עוד רמז - פונקציית fibo היא רקורסיבית, כלומר היא קוראת לעצמה ומשתמשת בתוצאות של עצמה כדי להפיק תשובות. זו הסיבה שאם מריצים אותה במספרים גבוהים, נגיד עד 100, לוקח לה המון זמן כי בכל פעם היא מוסיפה לעצמה חישובים. הדקורטור שאנחנו אמורים לכתוב עוקף את הבעיה הזו. מאחר ומבנה הפונקציה הוא רקורסיבי, יש רק סוג אחד של ארגומנטים שרלוונטי למציאת התוצאה בכל ריצה של הלולאה (זכור שבכל הרצה חדשה של הקוד המלא המטמון שיצרנו נעלם). במלים אחרות, הדקורטור שבנינו פה הוא נחמד, אבל הוא לא יעבוד בתור מטמון מוצלח לכל סוג של פונקציה אלא רק לסוגים מסוימים כמו פונקציית פיבו. מקווה שזה עזר קצת להכווין אותך.
לייק 1
imimouni
יש לך במקרה אולי דוגמה לבדיקה לחלק הזה? רוצה לבדוק שעבד לי
orpazf
אפשר למשל להוסיף ל-fibo ארגומנטים שאת לא עושה איתם כלום
לייק 1
imimouni
תודה רציתי איזה משהו שיראה דווקא שזה שומר גם ארגומנטים מרובים וגם עושה איתם משהו.
ניסיתי לעשות משהו בעצמי (מאוד מטופש אבל מאוחר נו חח):
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)])
yuval.cagan
אני יצרתי פונקציה רקורסיבית שמעלה מספר בריבוע, ואז את התוצאה בריבוע וכן הלאה, לפי מספר איטרציות שניתן לה.