GammaCyber

כתיבת קוד — שיעור 6

Python מרוכז — פונקציות ומודולריות

כל 3 משימות הקוד שנשמרו מהשיעור מופיעות כאן, עם דרישות, דוגמאות וקוד פתיחה. אפשר לכתוב פתרון בעורך המקומי וללחוץ על „בדיקת AI” לקבלת ציון, רמזים והערות.

T1 · מתחיל150 נק'~8 דק'debug
תיקון באג — ברירת מחדל בת-שינוי
הפונקציה אמורה להוסיף פריט ל'דלי'; אם לא סופק דלי — להתחיל רשימה חדשה בכל קריאה. אך יש בה המלכודת הקלאסית: ברירת מחדל בת-שינוי [] נוצרת פעם אחת ומשותפת בין כל הקריאות, ולכן פריטים 'זולגים' מקריאה לקריאה. תקן כך שכל קריאה ללא דלי תתחיל רשימה חדשה.
// הקוד השבור לתיקון
def add_item(item, bucket=[]): # באג כאן bucket.append(item) return bucket
דוגמאות
add_item(1) # קריאה 1 → [1]
add_item(2) # קריאה 2 (נפרדת) → [2]
add_item(3, [9]) → [9, 3]
פתרון-ייחוס תיקון באג — ברירת מחדל בת-שינוי ›
def add_item(item, bucket=None): if bucket is None: # התיקון: None במקום [] כברירת מחדל משותפת bucket = [] bucket.append(item) return bucket
הפתרון נשמר מקומית אוטומטית.
T2 · בסיסי200 נק'~15 דק'algorithmic
הרכבת פונקציות (compose)
ממש compose(*funcs) שמקבל מספר פונקציות של משתנה יחיד ומחזיר פונקציה חדשה שמפעילה אותן מימין לשמאל: compose(f, g)(x) שקול ל-f(g(x)). ללא ארגומנטים — החזר פונקציית זהות (מחזירה את הקלט כמות שהוא).
דוגמאות
compose(lambda x:x+1, lambda x:x*2)(3) → 7
compose(lambda x:x*2, lambda x:x+1)(3) → 8
compose()(5) → 5
פתרון-ייחוס הרכבת פונקציות (compose) ›
def compose(*funcs): def inner(x): for f in reversed(funcs): # ימין-לשמאל: compose(f,g)(x)=f(g(x)) x = f(x) return x return inner
הפתרון נשמר מקומית אוטומטית.
T3 · בינוני350 נק'~25 דק'algorithmic
דקורטור retry(times)
ממש דקורטור עם פרמטר retry(times) שעוטף פונקציה כך שאם היא זורקת חריגה — הוא ינסה שוב, עד times ניסיונות בסך הכול. אם ניסיון הצליח — החזר את ערכו. אם כל הניסיונות נכשלו — זרוק מחדש את החריגה האחרונה. שמור על הערכים המוחזרים והארגומנטים המקוריים (*a, **k).
דוגמאות
פונקציה שנכשלת פעמיים ואז מחזירה 42, עטופה ב-@retry(3) → 42
אותה פונקציה עטופה ב-@retry(2) → זורקת (רק 2 ניסיונות, צריך 3)
פתרון-ייחוס דקורטור retry(times) ›
def retry(times): def deco(fn): def wrapper(*a, **k): last = None for _ in range(times): try: return fn(*a, **k) except Exception as e: last = e raise last # כל הניסיונות נכשלו -> זרוק את האחרונה return wrapper return deco
הפתרון נשמר מקומית אוטומטית.