מבני נתונים ופונקציות מערך שיעור למרצה

מערך שיעור: מבני נתונים ופונקציות

משך: יום לימוד מלא — 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 צריכה לשבת היטב.


מהלך השיעור

חלק בשיעורמשךהערות ודגשים
list35 דק'shopping_list, queue. להדגים את מלכודת x = x.append() ואת המחיקה בזמן לולאה.
tuple ו-set30 דק'Unpacking (חיבור ל-enumerate). ניתוח מבקרים עם set. טבלת “מתי מה”.
הפסקה15 דק'
dict40 דק'student_dict, ואז רשימת מוצרים + ספירה. Nested dict כהכנה ל-JSON.
Slicing, Mutable, is מול ==40 דק'ציור “מדבקות” על הלוח. aliasing.py. החידה b = b + [3].
הפסקה15 דק'
פונקציות לעומק35 דק'מחשבון עם dict של פונקציות. הבאג של cart=[].
Scope / LEGB25 דק'“חזה את הפלט”. 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 ששינתה את הרשימה של מי שקרא). משפט סיום: “השם הוא לא הקופסה — הוא המדבקה על הקופסה. לפני ששואלים ‘מה יש במשתנה’, שואלים ‘על איזה אובייקט הוא מצביע’.”