מערך שיעור: מבני נתונים ופונקציות
משך: יום לימוד מלא — 6 שעות אקדמיות (270 דקות).
מטרת השיעור: הסטודנטים ישלטו בארבעת מבני הנתונים של Python, ידעו לבחור את המתאים לכל בעיה, יבינו את מודל ההפניות (Mutable, is מול ==), ויכירו פונקציות גמישות ואת חוקי ה-Scope.
בסוף השיעור הסטודנטים צריכים:
- לבחור ולהפעיל list/tuple/set/dict לפי הצורך: הוספה, מחיקה, חיפוש, מעבר וספירה.
- להסביר ולהדגים את ההבדל בין עותק להפניה, ובין
==ל-is. - לכתוב פונקציה עם ברירות מחדל,
*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?”
מהלך:
- הצבעה בכיתה: מי חושב שהגיבוי מלא, ומי שהוא ריק?
- להריץ. הגיבוי ריק. הפתעה.
- לצייר על הלוח:
cart→ [רשימה] ←backup. “כמה רשימות יש כאן?” אחת. - לשאול: “אז מה זה בעצם
=?” — לא “העתק”, אלא “הדבק מדבקה”. - לשאול: “למה עם מחרוזות זה לא קרה אתמול?” — Immutable.
מה המרצה מראה בסוף: אותו קוד עם backup = cart.copy(), והציור עם שתי רשימות. ואחר כך את הגרסה של אותה בעיה בפונקציה (add_bonus ששינתה את הרשימה של מי שקרא). משפט סיום: “השם הוא לא הקופסה — הוא המדבקה על הקופסה. לפני ששואלים ‘מה יש במשתנה’, שואלים ‘על איזה אובייקט הוא מצביע’.”