Smart-World Surf

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

שליטה בקבלת החלטות וארגון קוד יעיל.
תנאים (if/elif/else)לולאות (for/while)הגדרת פונקציותטווח משתנים (Scope)

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

בקרת זרימה: קבלת החלטות

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

תנאים (if/elif/else)

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

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

דוגמה:


גיל = 18
if גיל < 13:
    print("ילד")
elif גיל < 18:
    print("נער")
else:
    print("מבוגר")

בקרת זרימה: חזרתיות (לולאות)

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

לולאת for

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

for loop: מבצעת בלוק קוד עבור כל איבר באוסף נתון.

דוגמה:


לשמות = ["איתי", "נועה", "דניאל"]
for שם in לשמות:
    print(f"שלום, {שם}!")

for i in range(3): # איטרציה 3 פעמים (0, 1, 2)
    print(i)

לולאת while

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

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

דוגמה:


מונה = 0
while מונה < 3:
    print(מונה)
    מונה += 1

for loop

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

while loop

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

פונקציות: ארגון קוד ויעילות

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

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

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

פונקציה (Function): בלוק קוד בעל שם המבצע משימה ספציפית. ניתן לקרוא לו מספר פעמים מנקודות שונות בתוכנית.
פרמטר (Parameter): משתנה המוגדר בכותרת הפונקציה ומקבל ערך בעת קריאה לפונקציה.
ערך מוחזר (Return Value): הערך שהפונקציה מחזירה לאחר השלמת פעולתה, באמצעות מילת המפתח return.

דוגמה:


def ברכת_שלום(שם):
    """פונקציה שמקבלת שם ומחזירה ברכת שלום."""
    return f"שלום, {שם}!"

הודעה = ברכת_שלום("דוד")
print(הודעה) # פלט: שלום, דוד!

טווח משתנים (Scope)

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

טווח מקומי וגלובלי

טווח מקומי (Local Scope): משתנים המוגדרים בתוך פונקציה. הם נגישים רק מתוך אותה פונקציה ונוצרים מחדש בכל קריאה לפונקציה.
טווח גלובלי (Global Scope): משתנים המוגדרים מחוץ לכל פונקציה. הם נגישים מכל מקום בתוכנית, כולל מתוך פונקציות.
טווח משתנים (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, ובכך יוצרת משתנה מקומי חדש במקום. הפתרון הוא להבין את הכללים של גישה ושינוי משתנים בטווחים שונים, ובמידת הצורך להעביר ערכים כפרמטרים או להחזיר אותם.
  • משפטי תנאי: מאפשרים לתוכנית להגיב באופן שונה לקלטים שונים או למצבים משתנים, ובכך ליצור לוגיקה מורכבת ודינמית. הם הבסיס לכל התנהגות מותנית בתוכנה.
מצאתם טעות או שחסר משהו?
→ הקודמת
מבוא לפייתון ויסודות התכנות
הבאה ←
מבני נתונים בסיסיים