Smart-World Surf

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

שליטה על זרימת התוכנית ויצירת קוד מודולרי.
תנאים (if/elif/else)לולאות (for/while)הגדרת פונקציותהיקף משתנים

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

מבוא למבני בקרה ופונקציות

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

מבני בקרה: תנאים ולולאות

תנאים (Conditionals)

מבני תנאי מאפשרים לתוכנית לבצע פעולות שונות בהתאם למצב נתון. הפקודות הנפוצות ביותר הן if, elif (קיצור של else if) ו-else.

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

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


score = 85
if score >= 90:
    print("Excellent!")
elif score >= 70:
    print("Good.")
else:
    print("Needs improvement.")

לולאות (Loops)

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

איטרציה: חזרה על פעולה מסוימת. בלולאות, כל ביצוע של בלוק הקוד בתוך הלולאה נחשב לאיטרציה אחת.
לולאה אינסופית: לולאת while שהתנאי שלה תמיד מתקיים (תמיד True), ולכן היא ממשיכה לרוץ ללא הפסקה. יש להיזהר מלולאות כאלו.

לולאת for

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

לולאת while

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

דוגמה ללולאת for:


for i in range(5): # ירוץ 5 פעמים (0, 1, 2, 3, 4)
    print(f"Iteration {i}")

דוגמה ללולאת while:


count = 0
while count < 3:
    print(f"Count is {count}")
    count += 1

פונקציות: בניית קוד מודולרי

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

הגדרת פונקציות (Defining Functions)

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

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

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

message = greet("Howard Student") # "Howard Student" הוא ארגומנט
print(message)

היקף משתנים (Variable Scope)

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

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

global_var = "I am global"

def my_function():
    local_var = "I am local"
    print(global_var) # ניתן לגשת למשתנה גלובלי
    print(local_var)  # ניתן לגשת למשתנה מקומי

my_function()
# print(local_var) # יגרום לשגיאה: NameError, local_var אינו מוגדר מחוץ לפונקציה

שאלות לדיון

  • הסבירו מתי תעדיפו להשתמש בלולאת for ומתי בלולאת while. תנו דוגמה קצרה לכל מקרה.
  • מהם היתרונות העיקריים של פיצול תוכנית לפונקציות? כיצד זה משפיע על תהליך הפיתוח והתחזוקה?
  • הסבירו את ההבדל בין פרמטר לארגומנט בהקשר של פונקציות בפייתון.
  • נתחו את הקוד הבא. מה יהיה הפלט? הסבירו מדוע, תוך התייחסות להיקף משתנים.
    
    x = 10
    def func1():
        x = 20
        print(x)
    def func2():
        print(x)
    func1()
    func2()
    print(x)
            

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

  • לולאות: for עדיפה כאשר מספר האיטרציות ידוע מראש (למשל, מעבר על רשימה או טווח מספרים). while עדיפה כאשר מספר האיטרציות אינו ידוע מראש והלולאה צריכה להימשך כל עוד תנאי מסוים מתקיים (למשל, קריאת קלט ממשתמש עד לקבלת קלט תקין).
  • יתרונות פונקציות: מודולריות (פיצול בעיות גדולות לקטנות), שימוש חוזר בקוד (DRY - Don't Repeat Yourself), קריאות משופרת, קלות בדיקה וניפוי באגים, וקלות תחזוקה.
  • פרמטר מול ארגומנט: פרמטר הוא שם משתנה בהגדרת הפונקציה (לדוגמה, name ב-def greet(name):). ארגומנט הוא הערך הספציפי המועבר לפונקציה בעת קריאתה (לדוגמה, "Alice" ב-greet("Alice")).
  • ניתוח קוד והיקף משתנים:
    • הפלט יהיה: 20, 10, 10.
    • בתוך func1, השורה x = 20 יוצרת משתנה מקומי חדש בשם x, שאינו קשור למשתנה הגלובלי x. לכן, print(x) בתוך func1 מדפיס 20.
    • func2 מדפיסה את הערך של המשתנה הגלובלי x, שהוא עדיין 10, מכיוון ש-func1 לא שינתה אותו.
    • ה-print(x) האחרון מחוץ לפונקציות מדפיס גם הוא את הערך של המשתנה הגלובלי x, שהוא 10.
מצאתם טעות או שחסר משהו?
→ הקודמת
מבוא לפייתון וסביבת עבודה
הבאה ←
מבני נתונים מובנים