תנאים

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

משפטי if

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

לאחר המילה if יגיע ביטוי בוליאני כלשהו. את הביטוי יש לסיים בנקודתיים. נקודתיים בפייתון מסמלות התחלה של בלוק (תת תכנית) ובהמשך נראה מקרים נוספים שבהם יש להשתמש בהן. לאחר מכן יגיע החלק של התכנית עצמה(statements) שמגדיר מה אנחנו רוצים שיתבצע במידה והתנאי נכון (True). תת התכנית יכולה להכיל פקודה פשוטה אחת או אלף. מה שחשוב הוא שכל החלק הזה צריך להיות "מוזח" (indented) כלפי פנים. בפייתון, בניגוד לרוב השפות, לא משתמשים בסוגריים כדי להגדיר התחלה וסוף של בלוק קוד כזה אלא בהזחה של הקוד כלפי פנים. מה שנחשב להרגל טוב בשפות אחרות הופך כאן לחובה: ללא ההזחה הזאת פייתון לא תדע שיש קשר בין משפט התנאי לבין הפקודות שמגיעות אחריו. כשרוצים לסיים את בלוק הקוד הפנימי (הקוד שירוץ במידה והתנאי מתקיים) פשוט מפסיקים עם ההזחות וכך פייתון יודעת שהשורות האלה עומדות בפני עצמן. זה עד כדי כך פשוט. לגבי אופי ההזחות, ההמלצה הרשמית היא שימוש בארבעה רווחים (מקש space) אבל גם 2 רווחים או tab יעבדו. בכל מקרה חשוב להיות עקביים. אם אתם עובדים על כלי פיתוח רציני ולא סתם כותבים קוד בשורת הפקודה, הכלי אמור לדאוג לרווחים בשבילכם והוא ידע להכניס אותם אוטומטית אחרי כל תו נקודתיים שתכתבו.
בדוגמה הפשוטה הבאה נבדוק האם מספר הוא זוגי ואם כן, נדפיס הודעה מתאימה

שורה 2 בודקת את השארית של חלוקת המספר ב-2. אם השארית שווה ל-0, כלומר, המספר זוגי, הביטוי מחזיר True וכך ההדפסה מתבצעת. כמו שניתן לראות שורה 3, פקודת ההדפסה, מוזחת כלפי פנים, מה שאומר שהיא תתרחש רק אם התנאי מתקיים.

משפטי if else

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

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

אם תנאי מסוים מתקיים – בצע את התכנית הבאה (statements 1), בכל מקרה אחר – בצע תכנית חלופית (statements 2). אם ניישם על הדוגמה שלנו זה יראה כך

נשתמש בהתניית if else כשנרצה שהתכנית שלנו תגיב לשני מצבים בלבד. במידה ונרצה לקחת בחשבון מצבים נוספים נשתמש בפקודה elif

התניות באמצעות elif

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

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

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

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

ריבוי תנאים

אנחנו יכולים להשתמש באופרטורים and ו- or כדי לבדוק כמה תנאים שונים באותה משפט if

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

בדיקת ערכים בוליאניים

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

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

בדוגמה הזאת אתחלנו את המשתנה booli לביטוי שאינו נכון (100 אינו גדול מ-300) ולכן booli שווה לערך הבוליאני False. כאשר נבדוק אותו באמצעות משפט if החלק בתכנית שיבוצע הוא בלוק ה-else.

תנאים מקוננים

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

בדוגמה אפשר לראות שהתכנית קודם כל בודקת את שם הסטודיו. אם הסטודיו שהפיק את הסרט אינו DC למשל, אין טעם לבדוק האם העיר שבה מתרחשת העלילה היא Metropolis או Gotham City מפני שאלה ערים בדיוניות הקיימות ביקום של DC בלבד.