ברוכים הבאים ליחידה "בקרת זרימה ופונקציות" בקורס "תכנות וניתוח נתונים בשפת פייתון". יחידה זו היא אבן יסוד בכתיבת קוד פייתון יעיל, קריא וניתן לתחזוקה. נלמד כיצד לשלוט על רצף הפעולות בתוכנית (בקרת זרימה) וכיצד לארגן קוד בצורה מודולרית באמצעות פונקציות. הבנה מעמיקה של נושאים אלו חיונית לפתרון בעיות מורכבות ולכתיבת תוכניות חזקות, ומהווה בסיס לשאלות רבות במבחנים.
בקרת זרימה: קבלת החלטות
בקרת זרימה מאפשרת לתוכנית לקבל החלטות ולבצע פעולות שונות בהתאם לתנאים מסוימים. זהו הכלי הבסיסי ביותר ליצירת לוגיקה דינמית בתוכנה.
תנאים (if/elif/else)
משפטי תנאי מאפשרים לבצע בלוק קוד מסוים רק אם תנאי כלשהו מתקיים. הם עמוד השדרה של קבלת החלטות בתוכנה.
דוגמה:
גיל = 18
if גיל < 13:
print("ילד")
elif גיל < 18:
print("נער")
else:
print("מבוגר")
בקרת זרימה: חזרתיות (לולאות)
לולאות מאפשרות לבצע בלוק קוד מספר פעמים, בין אם על פני איברים באוסף או כל עוד תנאי מסוים מתקיים. הן חיוניות לטיפול בנתונים חוזרים ולביצוע משימות חזרתיות.
לולאת for
לולאת for משמשת לאיטרציה (מעבר) על פני איברים באוסף (כגון רשימה, מחרוזת, טווח מספרים) או על פני כל אובייקט בר-איטרציה.
דוגמה:
לשמות = ["איתי", "נועה", "דניאל"]
for שם in לשמות:
print(f"שלום, {שם}!")
for i in range(3): # איטרציה 3 פעמים (0, 1, 2)
print(i)
לולאת while
לולאת while מבצעת בלוק קוד כל עוד תנאי מסוים נכון. היא שימושית כאשר מספר האיטרציות אינו ידוע מראש.
דוגמה:
מונה = 0
while מונה < 3:
print(מונה)
מונה += 1
for loop
מתאימה כאשר מספר האיטרציות ידוע מראש, או כאשר רוצים לעבור על כל האיברים באוסף. בטוחה יותר מפני לולאות אינסופיות.
while loop
מתאימה כאשר מספר האיטרציות אינו ידוע מראש ותלוי בתנאי מסוים. דורשת תשומת לב לשינוי התנאי כדי למנוע לולאה אינסופית.
פונקציות: ארגון קוד ויעילות
פונקציות הן בלוקים של קוד מאורגנים וניתנים לשימוש חוזר, המבצעים משימה ספציפית. הן חיוניות למודולריות, קריאות וקלות תחזוקה של קוד.
הגדרת פונקציות
פונקציות מוגדרות באמצעות מילת המפתח def, מקבלות פרמטרים (אופציונלי) ומחזירות ערך (אופציונלי) באמצעות return.
return.דוגמה:
def ברכת_שלום(שם):
"""פונקציה שמקבלת שם ומחזירה ברכת שלום."""
return f"שלום, {שם}!"
הודעה = ברכת_שלום("דוד")
print(הודעה) # פלט: שלום, דוד!
טווח משתנים (Scope)
טווח משתנים מתייחס לאזור בתוכנית שבו משתנה נגיש וניתן לשימוש. הבנה של טווח משתנים קריטית למניעת שגיאות ולכתיבת קוד נכון.
טווח מקומי וגלובלי
global (פעולה שבדרך כלל עדיף להימנע ממנה). הבנה של מתי משתנה נוצר, מתי הוא נהרס, והיכן ניתן לגשת אליו, היא קריטית לאיתור באגים ולכתיבת קוד נכון.
דוגמה:
x_גלובלי = 10 # משתנה בטווח גלובלי
def פונקציה_דוגמה():
x_מקומי = 5 # משתנה בטווח מקומי
print(f"בתוך הפונקציה: x_מקומי = {x_מקומי}, x_גלובלי = {x_גלובלי}")
פונקציה_דוגמה()
print(f"מחוץ לפונקציה: x_גלובלי = {x_גלובלי}")
# print(x_מקומי) # יגרום לשגיאה: NameError, כי x_מקומי אינו נגיש כאן
שאלות לדיון
- הסבר מתי תעדיף להשתמש בלולאת
forומתי בלולאתwhile, ותן דוגמה קצרה לכל מקרה. - מהם היתרונות העיקריים של פירוק בעיה מורכבת לפונקציות קטנות ופשוטות יותר? תאר לפחות שלושה יתרונות.
- תאר תרחיש שבו אי הבנה של טווח משתנים (Scope) עלולה להוביל לשגיאה קשה לאיתור בקוד שלך. כיצד היית פותר אותה?
- כיצד משפטי
if,elifו-elseתורמים לגמישות וליכולת קבלת ההחלטות של תוכנית פייתון?
נקודות לתשובת מודל
- לולאות:
forלאיטרציה על אוספים או מספר ידוע של פעמים;whileלתנאי לא ידוע מראש. דגש על מניעת לולאות אינסופיות ב-while. - יתרונות פונקציות: מודולריות (פירוק לבעיות קטנות), שימוש חוזר בקוד (DRY - Don't Repeat Yourself), קריאות (שמות פונקציות מתארים פעולה), קלות תחזוקה וניפוי באגים (בידוד בעיות).
- טווח משתנים: תרחיש לדוגמה: פונקציה שמנסה לשנות משתנה גלובלי מבלי להצהיר עליו כ-
global, ובכך יוצרת משתנה מקומי חדש במקום. הפתרון הוא להבין את הכללים של גישה ושינוי משתנים בטווחים שונים, ובמידת הצורך להעביר ערכים כפרמטרים או להחזיר אותם. - משפטי תנאי: מאפשרים לתוכנית להגיב באופן שונה לקלטים שונים או למצבים משתנים, ובכך ליצור לוגיקה מורכבת ודינמית. הם הבסיס לכל התנהגות מותנית בתוכנה.