Smart-World Surf

יחידה 3: בקרת זרימה ופונקציות

שליטה על מהלך ביצוע התוכנית וארגון קוד באמצעות פונקציות.

ברוכים הבאים ליחידת הלימוד "בקרת זרימה ופונקציות" בקורס 20606 "תכנות וניתוח נתונים בשפת פייתון". יחידה זו היא אבן יסוד בתכנות, המקנה לכם את הכלים לשלוט על מהלך ביצוע התוכנית שלכם ולארגן את הקוד בצורה יעילה וקריאה. שליטה במושגים אלו חיונית לכתיבת קוד מורכב יותר ולהבנה מעמיקה של תוכניות קיימות, והיא מהווה בסיס משמעותי לשאלות בחינה.

בקרת זרימה: שליטה על מהלך ביצוע התוכנית

בקרת זרימה מאפשרת לתוכנית לקבל החלטות, לחזור על פעולות ולבצע קטעי קוד שונים בהתאם לתנאים. אלו הם הכלים המרכזיים:

משפטי תנאי: if, elif, else

משפטי תנאי מאפשרים לבצע קוד מסוים רק אם תנאי מסוים מתקיים. הם הבסיס לקבלת החלטות בתוכנית.

  • if: מבצע בלוק קוד אם התנאי נכון.
  • elif: (קיצור של else if) בודק תנאי נוסף אם התנאי הקודם היה שגוי. ניתן להשתמש במספר רב של elif.
  • else: מבצע בלוק קוד אם אף אחד מהתנאים הקודמים (if או elif) לא היה נכון.
תנאי (Condition): ביטוי לוגי (לרוב משתמש באופרטורי השוואה כמו ==, !=, <, >, <=, >= או אופרטורים לוגיים כמו and, or, not) שמחזיר True או False.

לולאות: for ו-while

לולאות מאפשרות לחזור על ביצוע קטע קוד מספר פעמים. הן חיוניות לעיבוד רשימות, קבצים וביצוע פעולות חוזרות.

לולאת for

משמשת לאיטרציה (מעבר) על פריטים באוסף (כגון רשימה, מחרוזת, טווח מספרים). מספר האיטרציות ידוע מראש או נקבע על ידי גודל האוסף.

לולאת while

מבצעת בלוק קוד כל עוד תנאי מסוים נכון. מספר האיטרציות אינו ידוע מראש ונקבע על ידי שינוי התנאי בתוך הלולאה.

פקודות שליטה בלולאות: break ו-continue

  • break: מסיים את הלולאה באופן מיידי וממשיך את ביצוע התוכנית מהפקודה שאחרי הלולאה.
  • continue: מדלג על שאר הקוד בתוך האיטרציה הנוכחית של הלולאה וממשיך לאיטרציה הבאה.

פונקציות: ארגון קוד ושימוש חוזר

פונקציות הן בלוקים של קוד המבצעים משימה ספציפית. הן מאפשרות לארגן את הקוד, למנוע כפילויות ולשפר את קריאותו ותחזוקתו.

פונקציה (Function): בלוק קוד בעל שם, המבצע משימה ספציפית וניתן לקרוא לו מכל מקום בתוכנית.

הגדרת פונקציות: def

פונקציות מוגדרות באמצעות מילת המפתח def, ואחריה שם הפונקציה, סוגריים (עבור פרמטרים) ונקודתיים.

פרמטר (Parameter): משתנה המוגדר בכותרת הפונקציה ומקבל ערך כאשר הפונקציה נקראת.
ארגומנט (Argument): הערך בפועל המועבר לפונקציה בעת קריאתה, ומוקצה לפרמטר המתאים.

ערך מוחזר: return

פונקציות יכולות להחזיר ערך באמצעות מילת המפתח return. אם אין משפט return מפורש, הפונקציה מחזירה None כברירת מחדל.

ערך מוחזר (Return Value): הערך שהפונקציה מחזירה למקום ממנו היא נקראה.

טווח משתנים (Scope): מקומי וגלובלי

הבנת טווח המשתנים קריטית למניעת באגים. משתנים יכולים להיות מקומיים לפונקציה או גלובליים לכל התוכנית.

  • משתנה מקומי (Local Variable): מוגדר בתוך פונקציה ונגיש רק מתוכה. הוא נוצר עם כניסה לפונקציה ונמחק עם יציאה ממנה.
  • משתנה גלובלי (Global Variable): מוגדר מחוץ לכל פונקציה ונגיש מכל מקום בתוכנית, כולל מתוך פונקציות. כדי לשנות משתנה גלובלי מתוך פונקציה, יש להשתמש במילת המפתח global.
טווח (Scope): האזור בתוכנית שבו משתנה מסוים נגיש וניתן לשימוש.

טיפים לבחינה וטעויות נפוצות

בחינות באוניברסיטה הפתוחה מדגישות הבנה מעמיקה של אופן פעולת הקוד. שאלות רבות דורשות מעקב צמוד אחר ביצוע התוכנית וניתוח פלט.

מעקב אחר קוד (Code Tracing): זוהי מיומנות קריטית לבחינה. עליכם להיות מסוגלים "לרוץ" על הקוד בראשכם או על דף, לעקוב אחר ערכי המשתנים בכל שלב, ולחזות את הפלט המדויק. שימו לב במיוחד לתנאי עצירה בלולאות, לערכים המוחזרים מפונקציות, ולטווח המשתנים (מקומי/גלובלי). טעויות נפוצות נובעות מאי-מעקב מדויק אחר שינויים במשתנים או אי-הבנה של מתי פונקציה מסיימת את פעולתה ומחזירה ערך.

טעויות נפוצות:

  • לולאות אינסופיות: בלולאת while, אם התנאי לעולם אינו הופך ל-False, הלולאה תרוץ לנצח. ודאו שיש שינוי במשתנים המשפיעים על התנאי.
  • בעיות טווח: ניסיון לגשת למשתנה מקומי מחוץ לפונקציה, או שינוי משתנה גלובלי בתוך פונקציה ללא שימוש ב-global.
  • אי-הבנת ערך מוחזר: פונקציה שמבצעת חישוב אך לא מחזירה את התוצאה, או שהקריאה לפונקציה אינה משתמשת בערך המוחזר.
  • טעויות אינדקס: בלולאות for עם range() או גישה לאיברים ברשימה, שימו לב לגבולות האינדקסים (לרוב מ-0 ועד אורך הרשימה פחות 1).

שאלות לדיון

  • כתבו פונקציה בשם is_prime(number) שמקבלת מספר שלם ומחזירה True אם המספר ראשוני ו-False אחרת. השתמשו בלולאות ובמשפטי תנאי.
  • נתון הקוד הבא:
            x = 10
            def my_function():
                global x
                x = 20
                y = 5
                print(f"Inside function: x={x}, y={y}")
                return x + y
    
            result = my_function()
            print(f"Outside function: x={x}, result={result}")
            # print(y) # מה יקרה אם ננסה להדפיס את y כאן?
            
    מה יהיה הפלט של הקוד? הסבירו כל שורה. מה יקרה אם נסיר את השורה global x?
  • הסבירו את ההבדל העיקרי בין שימוש ב-break לבין שימוש ב-continue בתוך לולאה. תנו דוגמה קצרה לכל אחד.

נקודות לתשובת מודל

  • ל-is_prime(number):
    • בדיקה למספרים קטנים מ-2 (אינם ראשוניים).
    • לולאה מ-2 ועד שורש המספר (או number // 2 + 1).
    • בדיקת שארית חלוקה (%) בכל איטרציה. אם השארית 0, המספר אינו ראשוני.
    • אם הלולאה מסתיימת ללא מוצא, המספר ראשוני.
  • לניתוח הקוד:
    • הדפסה ראשונה: Inside function: x=20, y=5 (x שונה ל-20 בגלל global, y הוא מקומי).
    • result יקבל את הערך 25 (20+5).
    • הדפסה שנייה: Outside function: x=20, result=25 (x נשאר 20 כי שונה גלובלית).
    • ניסיון להדפיס y מחוץ לפונקציה יגרום לשגיאת NameError כי y הוא משתנה מקומי.
    • אם נסיר global x, ה-x בתוך הפונקציה יהיה משתנה מקומי חדש, וה-x הגלובלי יישאר 10. הפלט ישתנה בהתאם.
  • ל-break ו-continue:
    • break: מפסיק לחלוטין את ביצוע הלולאה. דוגמה: חיפוש פריט ברשימה; ברגע שנמצא, אין צורך להמשיך לחפש.
    • continue: מדלג על שאר הקוד באיטרציה הנוכחית וממשיך לאיטרציה הבאה. דוגמה: עיבוד רשימת מספרים, דילוג על מספרים שליליים והמשך עיבוד החיוביים.
מצאתם טעות או שחסר משהו?
→ הקודמת
מבני נתונים מובנים
הבאה ←
טיפול בקבצים וטיפול בשגיאות