ביטויי תנאי - פקודת if
כמעט בכל תכנית נזדקק לאפשרות לשנות את התנהגות התכנית בהתאם
לתנאים מסוימים. ניתן לבצע זאת באמצעות פקודות תנאי, שהצורה הפשוטה
והבסיסית ביותר שלהם היא פקודת ה – if. דוגמה:
if x > 0:
print "x is positive"
הביטוי הבוליאני המופיע אחרי מילת המפתח if בדוגמה, נקרא התנאי. אם ורק אם התנאי מתקיים
(כלומר ערך הביטוי הוא True), מקטע הקוד המוזח
שמופיע מתחת לשורת ה-if מתבצע.
בשלב זה כדאי להבהיר את המושג ביטוי בוליאני.
ביטויים בוליאניים
ביטוי בוליאני הוא כינוי לביטוי שיכול לקבל ערך אמת או שקר,
בהתאם ל"נכונותו". בשפת פייתון (בדומה ל-perl), אין טיפוס נתונים מיוחד ליצוג ערכים בוליאניים – במקום
זאת נעשה שימוש בטיפוסי נתונים אחרים כגון מספרים, בהם הערך 1 מייצג
אמת, והערך 0 מייצג שקר. שפת פייתון גמישה ומקבלת למעשה גם כל ערך
מספרי שאינו אפס כמייצג אמת, אולם אופרטורים המחזירים ערכים בוליאניים
(כפי שנראה בהמשך) יחזירו תמיד 1 כערך המייצג אמת.
בטיפוסי נתונים נוספים,
ככלל, הערך הריק מייצג ערך שקרי: המחרוזת הריקה (""); הרשימה הריקה ([]), המילון
הריק
({}), וכו'. למעשה כל משתנה מהווה תנאי בוליאני,
שהוא נכון אם ורק אם הוא אינו ריק.
ביטוי בוליאני יכול להיות התוצאה של השוואה: האופרטור == משווה
שני ערכים ומחזיר ביטוי בוליאני:
>>> 5 == 5
1 >>> 5 ==
6
0
בביטוי הראשון שני האופרנדים זהים, ולכן ערכו הוא 1 (אמת). בביטוי
השני 5 אינו זהה ל-6 ולכן מתקבל 0 (שקר).
אופרטורי השוואה
אופרטור השוויון == הינו רק אחד מתוך קבוצה של אופרטורים הנקראים
אופרטורי השוואה:
x != y
# x is not equal to y
x > y
# x is greater than y
x < y #
x is less than y
x >= y
# x is greater than or equal to y
x <= y
# x is less than or equal to y
שים לב כי האופרטורים הללו אינם קיימים בשפה:
x => y
#
illeagal!!
x =< y
#
illeagal!!
כמו כן חשוב להבחין בין == שהוא אופרטור השיוויון לבין = שהוא
אופרטור ההשמה הזכור מפרק 1.
אופרטורים לוגיים
ישנם שלושה אופרטורים לוגיים בפייתון: and, or, not. אופרטורים אלו גם מקבלים וגם מחזירים ביטויים בוליאניים.
המשמעות הסמנטית שלהם זהה למשמעותם באנגלית. לדוגמה: x > 0 and x < 10 יחזיר ערך אמת רק אם x גדול מ-0 וגם קטן מ-10.
למעשה האופרטורים and ו-or מתנהגים בפייתון מעט שונה מאשר בשפות מוכרות אחרות, כתוצאה
מכך שאין בפיתון טיפוס נתונים בוליאני ממשי. להתנהגות המיוחדת של האופרטורים
הללו בפיתון ישנם יתרונות, ובפרק על מנגנונים מתקדמים לויסות זרימת
התוכנית נכיר אותה ואת השימושים שניתן לעשות בה.
פקודות מורכבות בפיתון
לאחר שהבהרנו את משמעותם של ביטויים בוליאנים, נחזור לפקודת
ה-if. פקודת ה-if היא פקודה מורכבת
וכמו פקודות מורכבות אחרות בפייתון, היא מורכבת מרישא (header) ומגוף הביטוי.
HEADER:
FIRST STATEMENT
...
LAST STATEMENT
הרישא מתחיל בשורה חדשה ומסתיים בנקודותיים (:). מקטע הקוד המוזח
(מורחק מהשוליים) שבא בעקבותיו נקרא "בלוק". השורה הראשונה שאינה מוזחת
מסמנת את סוף הבלוק – הבלוק אינו כולל אותה. בלוק זה שבא אחרי הרישא
בביטויים מורכבים כגון if נקרא גוף הביטוי.
אין הגבלה על מספר השורות בגוף הביטוי, למעט זאת שהוא חייב להכיל
לפחות שורה אחת. אם נרצה להשאיר אותו ריק (למשל כדי לכתוב מאוחר יותר
את תוכנו), נכתוב בו את הביטוי pass שפירושו: עבור הלאה בלי לעשות דבר.
פקודת if עם שתי חלופות
קיימת צורה נוספת של שימוש בפקודת ה-if, המכילה שתי חלופות, שרק אחת מהן מתבצעת בהתאם לתנאי:
if x%2 == 0:
print x, "is even"
else:
print x, "is odd"
אם השארית בחלוקת x ב-2 היא 0 התכנית
תדפיס ש-x זוגי, אחרת (כלומר אם התנאי שקרי),
התכנית תדפיס ש-x הוא אי-זוגי.
פקודת if משורשרת:
לעתים נזדקק לפקודת תנאי בעלת יותר משתי אפשרויות להמשך זרימת
התכנית. לשם כך נשתמש בפקודת if משורשרת:
if choice == 'A':
functionA()
elif choice == 'B':
functionB()
elif choice == 'C':
functionC()
elif choice == 'D':
functionD()
else:
print "Invalid choice."
elif הנו קיצור של else if.
אין הגבלה על מספר הפעמים שמופיעים ביטויי ה-elif, אולם הביטוי האחרון בשרשרת חייב להיות else. כל ביטויי התנאי נבדקים בזה אחר זה, עד שאחד מהם נמצא
נכון או עד שמגיעים ל-else. בשני המקרים מתבצע
מקטע קוד יחיד (אחרי ה-elif עם הביטוי הנכון
או אחרי ה-else).
if x == y:
print x, "and", y, "are equal"
else:
if x < y:
print x, "is less
than", y
else:
print x, "is greater
than", y
בתוך גוף הביטוי של פקודת if ניתן לכתוב פקודות
if נוספות. כתיבה כזו נקראת כתיבה מקוננת.
רצוי להימנע מכתיבה מקוננת אם אפשר להחליף אותה באופרטורים לוגיים,
כדי שהתכנית תהיה קריאה יותר, כמו בדוגמה הבאה:
את התנאי המקונן
-
if 0 < x:
if x < 10:
print "x is a
positive single digit."
ניתן לכתוב גם כך –
if 0 < x and
x < 10:
print "x is a positive single
digit."
במקרה של אופרטורי השוואה ניתן לקצר אף יותר ולכתוב כך:
if 0 < x <
10:
print "x is a positive single
digit."
|