Συνδυασμός συνθηκών

Το e-shop αλλάζει τον κανόνα για τα μεταφορικά: δωρεάν από 40 ευρώ και πάνω, αλλά όχι για τα νησιά, όπου ο courier χρεώνει παραπάνω. Τώρα η απόφαση εξαρτάται από δύο ερωτήσεις. Η πρώτη λύση που βγαίνει με όσα ήδη ξέρεις είναι ένα if μέσα σε ένα άλλο:
python
if total >= 40:
    if island:
        shipping = 3.5
    else:
        shipping = 0
else:
    shipping = 3.5
Το shipping = 3.5 είναι γραμμένο δύο φορές και ο κώδικας έχει δύο επίπεδα εσοχής. Αν αλλάξει η χρέωση, πρέπει να τη διορθώσεις σε δύο σημεία. Με μια τρίτη συνθήκη τα επίπεδα και τα αντίγραφα θα πολλαπλασιάζονταν.

Δύο συνθήκες σε μία γραμμή

Η ίδια απόφαση, με το and:
python
if total >= 40 and not island:
    shipping = 0
else:
    shipping = 3.5
Το διαβάζεις όπως θα το έλεγες: «αν το σύνολο είναι τουλάχιστον 40 και δεν είναι νησί». Οι λέξεις and και not είναι καινούργιες.
Το and ενώνει δύο συνθήκες και δίνει True μόνο όταν ισχύουν και οι δύο. Αν έστω και μία δίνει False, το αποτέλεσμα είναι False.
Το not αντιστρέφει μια τιμή: το not True δίνει False και το not False δίνει True. Το island είναι True για παραγγελίες σε νησί, οπότε το not island σημαίνει «δεν είναι νησί».
Το ίδιο σχήμα έχει κι ένα παιχνίδι στο κινητό: περνάς στην επόμενη πίστα μόνο αν σου έχουν μείνει ζωές και έχεις μαζέψει τουλάχιστον 100 πόντους.
python
lives = 2
score = 120

if lives > 0 and score >= 100:
    print("Επόμενη πίστα")
else:
    print("Ξαναπαίξε την πίστα")
Στο διάγραμμα το and φαίνεται σαν δύο ερωτήσεις στη σειρά. Στο δωρεάν φτάνεις μόνο αν περάσεις και τις δύο:
Δύο συνθήκες με and Διάγραμμα ροής για δωρεάν μεταφορικά. Πρώτη ερώτηση: total >= 40; Αν False, shipping = 3.5. Αν True, δεύτερη ερώτηση: not island; Αν False, πάλι shipping = 3.5. Μόνο όταν και οι δύο είναι True, shipping = 0. False True False True total, island total >= 40 not island shipping = 3.5 else shipping = 0 και τα δύο True
Προχώρα βήμα βήμα με μια παραγγελία 45 ευρώ για νησί:
Βήμα προς βήμα
Βήμα 1 από 5
total = 45
island = True
if total >= 40 and not island:
shipping = 0
else:
shipping = 3.5
print("Μεταφορικά:", shipping)
Μεταβλητές

total = 45

Το σύνολο της παραγγελίας.

Το πρόγραμμα τυπώνει πρώτα το not island. Άλλαξε το island σε False και, πριν τρέξεις, πες από μέσα σου τι θα τυπώσει η πρώτη γραμμή. Μετά δοκίμασε τους τέσσερις συνδυασμούς: σύνολο πάνω και κάτω από 40, με νησί και χωρίς. Μόνο ένας από αυτούς δίνει δωρεάν μεταφορικά.
python

Αρκεί η μία από τις δύο

Ένα θέατρο δίνει έκπτωση σε φοιτητές και σε όσους είναι 65 ετών και πάνω. Εδώ δε χρειάζεται να ισχύουν και οι δύο συνθήκες, αρκεί η μία. Αυτό το λέει το or: δίνει True όταν ισχύει τουλάχιστον η μία συνθήκη και False μόνο όταν δεν ισχύει καμία. Τα and, or και not λέγονται μαζί λογικοί τελεστές.
python
if is_student or age >= 65:
    print("Έκπτωση")
else:
    print("Κανονική τιμή")
Οι τέσσερις πιθανοί συνδυασμοί τιμών, μαζί με ό,τι δίνουν σε καθέναν τους το and και το or, χωράνε σε έναν μικρό πίνακα, τον πίνακα αλήθειας:
Πίνακας αλήθειας για and και or Τέσσερις συνδυασμοί για τα a και b. Το a and b είναι True μόνο όταν και τα δύο είναι True. Το a or b είναι False μόνο όταν και τα δύο είναι False. a b a and b a or b True True True True True False False True False True False True False False False False
Ένας συνταξιούχος 70 ετών δεν είναι φοιτητής. Τι τυπώνει κάθε γραμμή;
Πρόβλεψε
is_student = False
age = 70
print(is_student or age >= 65)
print(is_student and age >= 65)

Τι θα εμφανιστεί στην οθόνη;

Διάλεξε μία

Κάθε μέρος θέλει ολόκληρη σύγκριση

Το παρακάτω πρόγραμμα έχει ένα λάθος που δε βγάζει μήνυμα σφάλματος. Η μέρα είναι Τρίτη, αλλά τυπώνει «Σαββατοκύριακο». Βρες πού κάνει λάθος η συνθήκη πριν διαβάσεις την εξήγηση.
python
Στα ελληνικά λες «αν η μέρα είναι Σάββατο ή Κυριακή» και ο άλλος καταλαβαίνει. Η Python διαβάζει κάθε πλευρά του or χωριστά. Αριστερά βλέπει day == "Σάββατο", που δίνει False. Δεξιά βλέπει σκέτο το κείμενο "Κυριακή", χωρίς σύγκριση. Η Python μετράει ένα κείμενο που δεν είναι άδειο ως αληθές, οπότε η συνθήκη ισχύει για κάθε μέρα της εβδομάδας. Αν τυπώσεις τη συνθήκη μόνη της, με print(day == "Σάββατο" or "Κυριακή"), βλέπεις Κυριακή: το or δίνει το κείμενο της δεξιάς πλευράς. Το if το μετράει ως αληθές.
Κάθε πλευρά του or και του and πρέπει να είναι ολόκληρη σύγκριση, με το day == γραμμένο και στις δύο:
python
if day == "Σάββατο" or day == "Κυριακή":
Με το and γράφεις και το «ανάμεσα σε δύο τιμές». Το πρόγραμμα αυτή τη στιγμή τυπώνει «Πλήρες εισιτήριο» για κάθε ηλικία από 18 και πάνω. Άλλαξε τη συνθήκη, ώστε να το τυπώνει μόνο από 18 έως και 64 ετών. Δοκίμασέ το με 17, 18, 64 και 65.
python

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

Σε ψευδοκώδικα οι λογικοί τελεστές είναι ελληνικές λέξεις: ΚΑΙ, Η, ΟΧΙ. Ο κανόνας για τα μεταφορικά:
ΓΛΩΣΣΑ
ΠΡΟΓΡΑΜΜΑ ΜΕΤΑΦΟΡΙΚΑ_ΠΑΡΑΓΓΕΛΙΑΣ
ΜΕΤΑΒΛΗΤΕΣ
  ΠΡΑΓΜΑΤΙΚΕΣ: ΣΥΝΟΛΟ, ΜΕΤΑΦΟΡΙΚΑ
  ΛΟΓΙΚΕΣ: ΝΗΣΙ
ΑΡΧΗ
  ΣΥΝΟΛΟ ← 45
  ΝΗΣΙ ← ΑΛΗΘΗΣ
  ΑΝ ΣΥΝΟΛΟ >= 40 ΚΑΙ ΟΧΙ ΝΗΣΙ ΤΟΤΕ
    ΜΕΤΑΦΟΡΙΚΑ ← 0
  ΑΛΛΙΩΣ
    ΜΕΤΑΦΟΡΙΚΑ ← 3.5
  ΤΕΛΟΣ_ΑΝ
  ΓΡΑΨΕ 'Μεταφορικά:', ΜΕΤΑΦΟΡΙΚΑ
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ
Οι τελεστές κάνουν ακριβώς ό,τι και στην Python, με τον ίδιο πίνακα αλήθειας. Το Η χρειάζεται κι αυτό ολόκληρη σύγκριση σε κάθε πλευρά, όπως το or. Η συνθήκη τελειώνει με ΤΟΤΕ αντί για : και η δομή κλείνει με ΤΕΛΟΣ_ΑΝ αντί για εσοχή.

Σύνοψη

  • Το and δίνει True μόνο όταν ισχύουν και οι δύο συνθήκες. Το or δίνει True όταν ισχύει τουλάχιστον η μία.
  • Το not αντιστρέφει μια τιμή: not True είναι False, not False είναι True.
  • Το and σου γλιτώνει ένα if μέσα σε άλλο if και τις διπλές γραμμές.
  • Ο πίνακας αλήθειας δείχνει τι δίνουν τα and και or για κάθε ζευγάρι τιμών.
  • Κάθε πλευρά του and και του or είναι ολόκληρη σύγκριση. Το day == "Σάββατο" or "Κυριακή" ισχύει για κάθε μέρα.

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

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