ברוכים הבאים ליחידת הלימוד "מבני בקרה ופונקציות" בקורס "תכנות וניתוח נתונים בשפת פייתון". יחידה זו היא אבן יסוד בהבנת אופן פעולת תוכניות מחשב. נלמד כיצד לשלוט על זרימת הביצוע של הקוד שלנו באמצעות תנאים ולולאות, וכיצד לארגן את הקוד לפונקציות מודולריות וקלות לתחזוקה. שליטה בחומר זה חיונית לכתיבת קוד פייתון יעיל, קריא וניתן להרחבה, והיא מהווה בסיס איתן לפתרון בעיות תכנות מורכבות, כפי שמצופה מסטודנטים באוניברסיטת הווארד.
מבוא למבני בקרה ופונקציות
כברירת מחדל, קוד פייתון מבוצע באופן סדרתי, שורה אחר שורה. אולם, תוכניות בעולם האמיתי דורשות יכולת קבלת החלטות, חזרה על פעולות וארגון לוגי. מבני בקרה (Control Structures) מאפשרים לנו לשנות את זרימת הביצוע הסדרתית הזו, בעוד שפונקציות (Functions) מספקות מנגנון לארגון קוד לקטעים לוגיים הניתנים לשימוש חוזר. שילובם מאפשר לנו לבנות תוכניות דינמיות, גמישות ויעילות.
מבני בקרה: תנאים ולולאות
תנאים (Conditionals)
מבני תנאי מאפשרים לתוכנית לבצע פעולות שונות בהתאם למצב נתון. הפקודות הנפוצות ביותר הן if, elif (קיצור של else if) ו-else.
True) או שקר (False). ביטויים אלו משמשים לקביעת התנאים במבני בקרה.דוגמה: בדיקת ציון סטודנט והדפסת הערכה מתאימה.
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, שם הפונקציה, סוגריים לפרמטרים (אם יש) ונקודתיים. גוף הפונקציה מוזח פנימה.
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.
- הפלט יהיה: