ברוכים הבאים ליחידת הלימוד "בקרת זרימה ופונקציות" בקורס 20606 "תכנות וניתוח נתונים בשפת פייתון". יחידה זו היא אבן יסוד בתכנות, המקנה לכם את הכלים לשלוט על מהלך ביצוע התוכנית שלכם ולארגן את הקוד בצורה יעילה וקריאה. שליטה במושגים אלו חיונית לכתיבת קוד מורכב יותר ולהבנה מעמיקה של תוכניות קיימות, והיא מהווה בסיס משמעותי לשאלות בחינה.
בקרת זרימה: שליטה על מהלך ביצוע התוכנית
בקרת זרימה מאפשרת לתוכנית לקבל החלטות, לחזור על פעולות ולבצע קטעי קוד שונים בהתאם לתנאים. אלו הם הכלים המרכזיים:
משפטי תנאי: if, elif, else
משפטי תנאי מאפשרים לבצע קוד מסוים רק אם תנאי מסוים מתקיים. הם הבסיס לקבלת החלטות בתוכנית.
- if: מבצע בלוק קוד אם התנאי נכון.
- elif: (קיצור של else if) בודק תנאי נוסף אם התנאי הקודם היה שגוי. ניתן להשתמש במספר רב של elif.
- else: מבצע בלוק קוד אם אף אחד מהתנאים הקודמים (if או elif) לא היה נכון.
לולאות: for ו-while
לולאות מאפשרות לחזור על ביצוע קטע קוד מספר פעמים. הן חיוניות לעיבוד רשימות, קבצים וביצוע פעולות חוזרות.
לולאת for
משמשת לאיטרציה (מעבר) על פריטים באוסף (כגון רשימה, מחרוזת, טווח מספרים). מספר האיטרציות ידוע מראש או נקבע על ידי גודל האוסף.
לולאת while
מבצעת בלוק קוד כל עוד תנאי מסוים נכון. מספר האיטרציות אינו ידוע מראש ונקבע על ידי שינוי התנאי בתוך הלולאה.
פקודות שליטה בלולאות: break ו-continue
- break: מסיים את הלולאה באופן מיידי וממשיך את ביצוע התוכנית מהפקודה שאחרי הלולאה.
- continue: מדלג על שאר הקוד בתוך האיטרציה הנוכחית של הלולאה וממשיך לאיטרציה הבאה.
פונקציות: ארגון קוד ושימוש חוזר
פונקציות הן בלוקים של קוד המבצעים משימה ספציפית. הן מאפשרות לארגן את הקוד, למנוע כפילויות ולשפר את קריאותו ותחזוקתו.
הגדרת פונקציות: def
פונקציות מוגדרות באמצעות מילת המפתח def, ואחריה שם הפונקציה, סוגריים (עבור פרמטרים) ונקודתיים.
ערך מוחזר: return
פונקציות יכולות להחזיר ערך באמצעות מילת המפתח return. אם אין משפט return מפורש, הפונקציה מחזירה None כברירת מחדל.
טווח משתנים (Scope): מקומי וגלובלי
הבנת טווח המשתנים קריטית למניעת באגים. משתנים יכולים להיות מקומיים לפונקציה או גלובליים לכל התוכנית.
- משתנה מקומי (Local Variable): מוגדר בתוך פונקציה ונגיש רק מתוכה. הוא נוצר עם כניסה לפונקציה ונמחק עם יציאה ממנה.
- משתנה גלובלי (Global Variable): מוגדר מחוץ לכל פונקציה ונגיש מכל מקום בתוכנית, כולל מתוך פונקציות. כדי לשנות משתנה גלובלי מתוך פונקציה, יש להשתמש במילת המפתח
global.
טיפים לבחינה וטעויות נפוצות
בחינות באוניברסיטה הפתוחה מדגישות הבנה מעמיקה של אופן פעולת הקוד. שאלות רבות דורשות מעקב צמוד אחר ביצוע התוכנית וניתוח פלט.
טעויות נפוצות:
- לולאות אינסופיות: בלולאת
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: מדלג על שאר הקוד באיטרציה הנוכחית וממשיך לאיטרציה הבאה. דוגמה: עיבוד רשימת מספרים, דילוג על מספרים שליליים והמשך עיבוד החיוביים.