תנאים

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

ביטויים בוליאניים

נתחיל בתזכורת בנוגע לביטויים בוליאניים, שאותם הכרנו בשבוע שעבר:


In [ ]:
print("hello" == "Hello")

In [ ]:
print(1 > 2)

In [ ]:
print(2 * 3 == 1 or 1 + 1 == 2)

In [ ]:
print('a' + 'b' == 'ab' and not 1 + 2 == 3)

אם כן, ביטויים בוליאניים הם ביטויים שתוצאתם היא True או False.
לעיתים קרובות ביטויים אלו יכללו אופרטורים לוגיים, כמו and, or ו־not.

בתנאי ש...

Two roads diverged in a yellow wood,
And sorry I could not travel both

  • Robert Frost, The Road Not Taken

נקפוץ למים ללא הקדמה. הנה קוד מעניין:


In [ ]:
user_age = int(input("Please enter your age: "))
if user_age < 18:
    print("You are not allowed to enter :(")
print("This is the end of the program.")

מה קטע הקוד הזה יעשה?
את השורה הראשונה אנחנו כבר יודעים לקרוא: קלטנו את גיל המשתמש, המרנו אותו למספר שלם, ועכשיו המשתנה user_age מצביע עליו.
בשורה השנייה הרוב כבר מוכר: נבדוק האם הגיל קטן מ־18. אבל מה זה ה־if הזה?

כשאנחנו מעוניינים להגיד לפייתון לבצע רצף של שורות רק בתנאי שיקרה משהו מסוים, נשתמש במילת המפתח if.
נחלק את המבנה של תנאי בפייתון ל־2 חלקים:

  1. הביטוי הבוליאני, שיבוא מייד אחרי מילת המפתח if.
  2. הפקודות שיש לבצע, שיבואו בשורות שאחריו.

דוגמאות לתנאים

בדוגמאות הבאות, התנאי מופיע כך, והפעולות שיקרו בעקבותיו מופיעות כך.

  1. השמע את המוזיקה של השעון המעורר רק כשהשעה היא 20:00.
  2. אם הלחץ במטוס לא תקין, הורד לנוסעים את מסכות החמצן ולאחר מכן גם היכנס למצב חירום.
  3. אם המשתמש סימן קובץ אחד או יותר והמקש שנלחץ היה DEL, מחק את הקבצים המסומנים.
  4. רק אם עגלת הקניות שלו מכילה מוצרים בשווי 100 ש"ח לפחות, אפשר למשתמש לבצע הזמנה עם משלוח.
  5. כספומט, הוצא למשתמש כסף, הדפס קבלה וצא מהממשק אם המשתמש הזין סכום שמתחלק ב־50, הוא הזין את הקוד הסודי הנכון והסכום הזה קיים בחשבון הבנק שלו.

זרימת התוכנית: ציור לדוגמה

כותבים תנאי

ניסוח של תנאי אמור להיראות ככה:

if התנאי שלכם, ביטוי בוליאני:
    מה שאתם רוצים לעשות (גוף התנאי)

נסביר:

  1. התנאי מתחיל במילת המפתח if. אין פה מה לשנות.
  2. אחרי מילת המפתח if, יבוא ביטוי בוליאני. אם תוצאתו תהיה True, מה שנמצא בגוף התנאי יתבצע. אם False, פייתון תתעלם לגמרי מגוף התנאי.
  3. מייד אחרי הביטוי הבוליאני תבואנה נקודתיים, שמסמנות שכאן נגמרת השאלה (הביטוי הבוליאני), ומתחיל החלק הביצועי – גוף התנאי.
  4. לפני שנבקש מפייתון לבצע משהו בעקבות קיום התנאי שהיה ב־if, נצטרך להוסיף לפניו הזחה.
    הזחה היא תזוזה של השורה לימין, והיא נועדה לסמן מבניות מסוימת בקוד – נניח שהשורה הזו מתייחסת ל־if שנמצא לפניה.
    אנחנו רוצים שהקוד שנכתוב אחרי ההזחה ירוץ רק אם התנאי שלפני ההזחה התקיים.
    בפייתון הזחה מוגדרת כארבעה רווחים, אבל אפשר פשוט ללחוץ Tab ↹ במקלדת והמחברת תחליף לכם את הטאב ברווחים בעצמה.
  5. וסוף סוף הגענו למטרה: אחרי ההזחה, כתבו את מה שאתם רוצים לעשות – כל פעולת פייתון שעולה על דעתכם תתאים כאן.
    תוכלו להוסיף כמה שורות שתרצו אחרי ה־if. הקוד בשורה ירוץ כחלק מהתנאי כל עוד היא מוזחת ונמצאת ישירות אחרי ה־if, או אחרי שורות מוזחות אחרות ישירות מתחת ל־if.

דוגמאות קוד נוספות


In [ ]:
user_fullname = input('Please enter your full name: ')
is_temple_open = False

if 'Cohen' in user_fullname:
    print('You may enter the temple!')
    is_temple_open = True

print('')
print('Thank you, ' + user_fullname + '.')
print('Is the temple open?: ' + str(is_temple_open))

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

חשוב!
פתרו לפני שתמשיכו!

דוגמה אחרת:


In [ ]:
age = int(input('Please enter your age: '))
allowed_to_enter = False

if age >= 18:
    allowed_to_enter = True

if age < 18:
    print('Please wait until midnight before answering the following question:')
    answer_for_birthday_is_today = input('Is it your birthday today? [yes/no]: ')
    if age == 17 and answer_for_birthday_is_today == 'yes':
        print('Happy birthday! You are 18 now.')
        age = age + 1
        allowed_to_enter = True

if allowed_to_enter:
    print('Welcome!')
if not allowed_to_enter:
    print('Sorry... Byebye')

מה התרחש בקוד הזה?

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

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

עכשיו נתאר מה תהיה ההתרחשות אם הגיל נמוך מ־18.
אנחנו מחכים לחצות, ומבקשים לדעת אם יום ההולדת של המשתמש הוא היום.

מכאן אנחנו פותחים תנאי נוסף, בתוך התנאי הקודם. זה אומר שרק אם age אכן קטן מ־18 הבדיקה הבאה תקרה (בגלל שאנחנו עדיין בתוך התנאי age < 18, ראו את ההזחה):
אם המשתמש הכניס שהיום יום ההולדת שלו, והגיל שלו היה עד עכשיו 17, אז עכשיו הוא טכנית בן 18 ויכול להיכנס למסיבה שלנו. נגדיל את הגיל שלו ונרשה לו להיכנס.

עכשיו נשאר רק להתייחס למשתנה allowed_to_enter שהגדרנו למעלה, לבדוק האם למשתמש מותר להכנס או לא, ולהדפיס הודעה מתאימה. יופי!

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

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

תרגול

כניסה לבנק, שלב 1

שם המשתמש שלי לבנק הוא wrong, והסיסמה שלי היא ads sports.
קבלו מהמשתמש שם משתמש וסיסמה, והדפיסו לו הודעה יפה אם הצליח להתחבר.

אם גם טעיתי

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


In [ ]:
a = 3
b = 4
c = 5

if a ** 2 + b ** 2 == c ** 2
print("This line should run for 3, 4, 5 but not for 4, 5, 6")

print("This line should run anyway")