Συνθήκες με if

Ένα e-shop χρεώνει 3.50 ευρώ μεταφορικά, εκτός αν η παραγγελία φτάνει τα 40 ευρώ. Η σύγκριση order_total >= 40 δίνει True ή False, αλλά από μόνη της δεν αλλάζει τι κάνει το πρόγραμμα. Χρειάζεται να βάλει 0 στα μεταφορικά στη μία περίπτωση και 3.50 στην άλλη.
Αυτό το γράφεις με το if:
python
Η γραμμή με το if κάνει μια ερώτηση. Αν η απάντηση είναι True, τρέχουν οι γραμμές κάτω από το if. Αν είναι False, τρέχουν οι γραμμές κάτω από το else. Η ερώτηση μετά το if λέγεται συνθήκη: κάτι που δίνει True ή False, συνήθως μια σύγκριση. Το if είναι η δομή επιλογής του σχολικού βιβλίου.
Μία απόφαση με if και else Διάγραμμα ροής: το πρόγραμμα ρωτάει αν order_total >= 40. Αν είναι True, shipping = 0. Αν είναι False, shipping = 3.5. Και οι δύο δρόμοι καταλήγουν στο ίδιο print. True False order_total order_total >= 40 shipping = 0 shipping = 3.5 print(...)
Οι δύο τελευταίες γραμμές τρέχουν σε κάθε περίπτωση, γιατί δεν ανήκουν ούτε στο if ούτε στο else. Τρέξε το πρόγραμμα, μετά άλλαξε το order_total σε 52 και ξανατρέξε. Στο τέλος πρόσθεσε κάτω από το πρόγραμμα ένα δεύτερο if για τους βαθμούς. Φτιάξε μια μεταβλητή grade = 12 και τύπωσε «Προάγεσαι» αν ο βαθμός είναι τουλάχιστον 10, αλλιώς «Επανεξέταση». Δοκίμασέ το με 9, 10 και 18.

Η εσοχή δείχνει τι ανήκει στο if

Πώς ξέρει η Python ποιες γραμμές ανήκουν στο if; Από τα κενά στην αρχή της γραμμής. Οι γραμμές που τρέχουν μόνο όταν ισχύει η συνθήκη ξεκινούν τέσσερα κενά πιο μέσα. Αυτή η μετατόπιση λέγεται εσοχή (στα αγγλικά indentation). Στον editor την κάνεις με το πλήκτρο Tab.
Η γραμμή του if και η γραμμή του else τελειώνουν με άνω και κάτω τελεία :. Το κομμάτι που ανήκει σε αυτά τελειώνει στην πρώτη γραμμή που ξεκινάει ξανά χωρίς εσοχή, όπως το print στο παράδειγμα.
Στην Python η εσοχή είναι μέρος της γλώσσας: αν οι γραμμές δε στοιχίζονται σωστά, το πρόγραμμα αλλάζει ή σταματάει με σφάλμα.
Το παρακάτω πρόγραμμα σταματάει πριν τυπώσει οτιδήποτε. Τρέξε το και φτιάξε την εσοχή που λείπει.
python
Το μήνυμα λέει IndentationError: expected an indented block after 'if' statement on line 2: μετά από ένα if η Python περιμένει τουλάχιστον μία γραμμή με εσοχή. Το αντίθετο λάθος, μια γραμμή με εσοχή εκεί που δεν ανήκει πουθενά, δίνει IndentationError: unexpected indent.
Τα δύο πιο συνηθισμένα λάθη στη γραμμή του if είναι αυτά:
  • Αν ξεχάσεις την : στο τέλος, παίρνεις SyntaxError: expected ':'.
  • Αν γράψεις if age = 18: με ένα ίσον, παίρνεις SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?. Η συνθήκη ρωτάει, οπότε θέλει ==.

Περισσότερες από δύο περιπτώσεις

Ένα μουσείο έχει τρεις τιμές: δωρεάν για παιδιά κάτω από 6 ετών, 5 ευρώ κάτω από 18, 10 ευρώ για τους υπόλοιπους. Με το elif, συντομογραφία του «else if», προσθέτεις όσες ερωτήσεις χρειάζεσαι ανάμεσα στο if και στο else:
python
if age < 6:
    price = 0
elif age < 18:
    price = 5
else:
    price = 10
Η Python κάνει τις ερωτήσεις με τη σειρά, από πάνω προς τα κάτω. Μόλις μία δώσει True, τρέχει εκείνο το κομμάτι και προσπερνάει όλα τα υπόλοιπα, ακόμα κι αν κάποια επόμενη συνθήκη θα ίσχυε κι αυτή. Το else τρέχει μόνο αν καμία συνθήκη δεν ίσχυσε.
Η σειρά if, elif, else Διάγραμμα ροής για εισιτήριο με βάση την ηλικία. Πρώτη ερώτηση, το if: age < 6; Αν ναι, δωρεάν. Αν όχι, δεύτερη ερώτηση, το elif: age < 18; Αν ναι, μειωμένο 5 ευρώ. Αν όχι, το else: κανονικό 10 ευρώ. Οι ερωτήσεις γίνονται με τη σειρά και τρέχει μόνο ένας κλάδος. True False True False age age < 6 Δωρεάν age < 18 Μειωμένο, 5 € Κανονικό, 10 € else if elif
Προχώρα βήμα βήμα με έναν επισκέπτη 15 ετών και κοίτα ποιες γραμμές τρέχουν και ποιες προσπερνιούνται.
Βήμα προς βήμα
Βήμα 1 από 5
age = 15
if age < 6:
price = 0
elif age < 18:
price = 5
else:
price = 10
print("Εισιτήριο:", price)
Μεταβλητές

age = 15

Η ηλικία του επισκέπτη.

Η σειρά των ερωτήσεων

Έχει σημασία η σειρά των ερωτήσεων; Εδώ κάποιος έγραψε τις ίδιες ερωτήσεις ανάποδα:
Πρόβλεψε
age = 4
if age < 18:
    print("Μειωμένο")
elif age < 6:
    print("Δωρεάν")
else:
    print("Κανονικό")

Τι τυπώνει για ένα παιδί 4 ετών;

Διάλεξε μία

Το πρόγραμμα δεν έβγαλε κανένα σφάλμα. Έτρεξε και χρέωσε λάθος τιμή, γιατί η Python σταματάει στην πρώτη συνθήκη που ισχύει. Όταν οι περιπτώσεις επικαλύπτονται, όπως το «κάτω από 6» που είναι και «κάτω από 18», βάζεις πρώτη τη στενότερη.
Το μουσείο θέλει τώρα και μειωμένο εισιτήριο 5 ευρώ για όσους είναι 65 ετών και πάνω. Πρόσθεσε αυτή την περίπτωση στο πρόγραμμα και δοκίμασέ το με ηλικίες 4, 15, 40 και 70.
python

Το ίδιο σε ψευδοκώδικα

Το εισιτήριο του μουσείου σε ψευδοκώδικα, όπως γράφεις τους αλγορίθμους στο σχολείο και στις Πανελλήνιες:
ΓΛΩΣΣΑ
ΠΡΟΓΡΑΜΜΑ ΕΙΣΙΤΗΡΙΟ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: ΗΛΙΚΙΑ, ΤΙΜΗ
ΑΡΧΗ
  ΗΛΙΚΙΑ ← 15
  ΑΝ ΗΛΙΚΙΑ < 6 ΤΟΤΕ
    ΤΙΜΗ ← 0
  ΑΛΛΙΩΣ_ΑΝ ΗΛΙΚΙΑ < 18 ΤΟΤΕ
    ΤΙΜΗ ← 5
  ΑΛΛΙΩΣ
    ΤΙΜΗ ← 10
  ΤΕΛΟΣ_ΑΝ
  ΓΡΑΨΕ 'Εισιτήριο:', ΤΙΜΗ
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ
Η λογική είναι ίδια, γραμμή προς γραμμή. Το elif της Python είναι το ΑΛΛΙΩΣ_ΑΝ και την ανάθεση τη γράφεις με ← αντί για =. Εκεί που τελειώνει η δομή, η ΓΛΩΣΣΑ γράφει ΤΕΛΟΣ_ΑΝ, ενώ η Python το καταλαβαίνει από την πρώτη γραμμή χωρίς εσοχή. Στη ΓΛΩΣΣΑ η εσοχή είναι μόνο για να διαβάζεται το πρόγραμμα. Στην Python μετράει.

Σύνοψη

  • Το if τρέχει ένα κομμάτι κώδικα μόνο όταν η συνθήκη του δίνει True. Το else τρέχει όταν δίνει False.
  • Η συνθήκη είναι κάτι που δίνει True ή False, συνήθως μια σύγκριση. Για ισότητα γράφεις == και η γραμμή τελειώνει με :.
  • Η εσοχή, τέσσερα κενά, δείχνει ποιες γραμμές ανήκουν στο if ή στο else. Η πρώτη γραμμή χωρίς εσοχή τρέχει σε κάθε περίπτωση.
  • Λάθος εσοχή δίνει IndentationError. Το μήνυμα λέει σε ποια γραμμή.
  • Με το elif προσθέτεις περιπτώσεις. Η Python τις ελέγχει με τη σειρά και τρέχει μόνο την πρώτη που ισχύει.
  • Όταν οι περιπτώσεις επικαλύπτονται, η στενότερη μπαίνει πρώτη.

Θες να συνεχίσεις;

Το course είναι δωρεάν. Κάνε σύνδεση για να κρατάς την πρόοδο και τις σημειώσεις σου.