# מערך שיעור: מבני נתונים ופונקציות<no value>

**משך:** יום לימוד מלא — 6 שעות אקדמיות (270 דקות).

**מטרת השיעור:** הסטודנטים ישלטו בארבעת מבני הנתונים של Python, ידעו לבחור את המתאים לכל בעיה, יבינו את מודל ההפניות (Mutable, is מול ==), ויכירו פונקציות גמישות ואת חוקי ה-Scope.

**בסוף השיעור הסטודנטים צריכים:**

1. לבחור ולהפעיל list/tuple/set/dict לפי הצורך: הוספה, מחיקה, חיפוש, מעבר וספירה.
2. להסביר ולהדגים את ההבדל בין עותק להפניה, ובין `==` ל-`is`.
3. לכתוב פונקציה עם ברירות מחדל, `*args`/`**kwargs`, להעביר פונקציה כארגומנט (כולל lambda ב-`sorted`), ולהסביר את LEGB.

**דגש קריטי:** **dict ורשימה של dicts.** זה המבנה של JSON (מחר), של שורות ב-OOP (נושא OOP) ושל בקשות ותשובות API (נושא Backend ומסדי נתונים). תבנית הספירה `d[k] = d.get(k, 0) + 1` צריכה לשבת היטב.

---

## מהלך השיעור

| חלק בשיעור | משך | הערות ודגשים |
|---|---|---|
| list | 35 דק' | `shopping_list`, `queue`. להדגים את מלכודת `x = x.append()` ואת המחיקה בזמן לולאה. |
| tuple ו-set | 30 דק' | Unpacking (חיבור ל-enumerate). ניתוח מבקרים עם set. טבלת "מתי מה". |
| הפסקה | 15 דק' | |
| dict | 40 דק' | `student_dict`, ואז רשימת מוצרים + ספירה. Nested dict כהכנה ל-JSON. |
| Slicing, Mutable, is מול == | 40 דק' | ציור "מדבקות" על הלוח. `aliasing.py`. החידה `b = b + [3]`. |
| הפסקה | 15 דק' | |
| פונקציות לעומק | 35 דק' | מחשבון עם dict של פונקציות. הבאג של `cart=[]`. |
| Scope / LEGB | 25 דק' | "חזה את הפלט". UnboundLocalError. Refactoring מגלובליים. |
| תרגול + בדוק את עצמך | 35 דק' | Mini Project "מערכת ציונים". |

---

## דגשים להעברת השיעור

- **יום עמוס.** לשמור על קצב: את list/dict מעמיקים, ואת tuple/set מציגים בעיקר דרך "מתי משתמשים".
- **ציור הפניות** הוא הכלי החשוב ביותר היום: שמות משמאל, אובייקטים מימין, חצים ביניהם. להשתמש בו בכל דוגמה של Mutable. (אפשר להיעזר באתר pythontutor.com להמחשה ויזואלית.)
- **`is` לא להשוואת ערכים.** להזכיר שהמקרה של מספרים קטנים "עובד במקרה", ולא להיכנס למנגנון.
- **Functions as Objects** — להדגיש את ההבדל `f` מול `f()` כבר עכשיו. בנושא Backend ומסדי נתונים, `@app.get(...)` מעל פונקציה ייראה טבעי.
- **lambda ברמת היכרות בלבד.** השימוש המרכזי הוא `key=` ב-`sorted`/`min`/`max`. לא ללמד `map`/`filter`.
- **Scope:** ההמלצה הברורה היא פרמטר + return, ו-`global` רק כהסבר. זה מכין את הקרקע ל-OOP: "איפה שומרים מצב שמשתנה?" — באובייקט.

---

## מושגים

| מושג | הסבר קצר |
|---|---|
| list | אוסף מסודר, ניתן לשינוי, עם כפילויות. `[ ]` |
| tuple | אוסף מסודר שלא ניתן לשינוי. `( , )` |
| set | אוסף ייחודי בלי סדר. `{ }` / `set()` |
| dict | זוגות מפתח-ערך. `{k: v}` |
| Index / Negative Index | מיקום מ-0 / ספירה מהסוף (-1 = האחרון). |
| Unpacking | פירוק רצף למשתנים: `a, b = (1, 2)`. |
| Slicing | `[start:stop:step]`, רצף חדש, `stop` לא כולל. |
| Mutable / Immutable | ניתן לשינוי במקום / כל שינוי יוצר אובייקט חדש. |
| Reference / Alias | משתנה מצביע על אובייקט. שני שמות לאותו אובייקט. |
| `==` / `is` | אותו ערך / אותו אובייקט. |
| Default / Keyword Argument | ערך ברירת מחדל / ארגומנט לפי שם. |
| `*args` / `**kwargs` | אוסף ארגומנטים ל-tuple / ל-dict. |
| Functions as Objects | פונקציה היא ערך שאפשר לשמור ולהעביר. |
| lambda | פונקציה קצרה בלי שם, ביטוי אחד. |
| Scope / LEGB | אזור הכרה של שם / סדר החיפוש. |

---

## תרגיל חשיבה

**שאלת פתיחה (לפני Mutable):** "יש לי עגלת קניות. כדי לא לאבד אותה, כתבתי `backup = cart`, ואז ניקיתי את העגלה עם `cart.clear()`. מה יש ב-`backup`?"

**מהלך:**

1. הצבעה בכיתה: מי חושב שהגיבוי מלא, ומי שהוא ריק?
2. להריץ. הגיבוי ריק. הפתעה.
3. לצייר על הלוח: `cart` → [רשימה] ← `backup`. "כמה רשימות יש כאן?" אחת.
4. לשאול: "אז מה זה בעצם `=`?" — לא "העתק", אלא "הדבק מדבקה".
5. לשאול: "למה עם מחרוזות זה לא קרה אתמול?" — Immutable.

**מה המרצה מראה בסוף:** אותו קוד עם `backup = cart.copy()`, והציור עם **שתי** רשימות. ואחר כך את הגרסה של אותה בעיה בפונקציה (`add_bonus` ששינתה את הרשימה של מי שקרא). משפט סיום: "השם הוא לא הקופסה — הוא המדבקה על הקופסה. לפני ששואלים 'מה יש במשתנה', שואלים 'על איזה אובייקט הוא מצביע'."
