7. Η εντολή if ελέγχου ροής εκτέλεσης κώδικα

Πολλές φορές κατά την εκτέλεση ενός προγράμματος, χρειάζεται η ανακατεύθυνση της ροής εκτέλεσης με την λήψη κατάλληλης απόφασης. Ο βασικός παράγοντας στη λήψη απόφασης είναι η αποτίμηση της λογικής έκφρασης (συνθήκης) της εντολής ελέγχου η οποία δίνει δυο τιμές True ή False.

Η πιο απλή εντολή που χρησιμοποιείται για τον έλεγχο ροής προγράμματος είναι η if, που με βάση την συνθήκη που στηρίζεται,  ορίζει την ομάδα εντολών που θα εκτελεστούν. Επιπλέον η Python προσφέρει τρεις διαφορετικές δομές ελέγχου ροής εκτέλεσης και συγκεκριμένα τις:

  • Την δομή  if
  • Την δομή if . . . else
  • Την δομή if . . . elif

Αυτές οι δομές ελέγχου μπορούν να χρησιμοποιηθούν σε μια ποικιλία απλών ή σύνθετων διαδικασιών λήψης αποφάσεων με μια καθαρά λογική σειρά εντολών της Python.

Η εντολή if

Η μορφή της εντολής if είναι η ακόλουθη:

if συνθήκη :
       εντολή ή ομάδα εντολών

όπου συνθήκη είναι μια λογική έκφραση όπου αν έχει τιμή True εκτελείται η εντολή ή η ομάδα εντολών που ακολουθούν τον χαρακτήρα άνω και κάτω τελεία (:) και βρίσκονται στην ίδια εσοχή. Αν η συνθήκη έχει τιμή False παραλείπεται η εντολή ή η ομάδα εντολών κάτω από την if.

Η Python δεν διαθέτει ειδικά σύμβολα που να καθορίζουν την αρχή και το τέλος μιας ομάδας εντολών, οι ομάδες εντολών προσδιορίζονται με εσοχές.

Παράδειγμα Γράψτε ένα πρόγραμμα Python που να διαβάζει δυο αριθμούς και να εκτυπώνει τον μεγαλύτερο.

Λύση Ένας τρόπος είναι να γράψουμε δυο ανεξάρτητες εντολές if η μια μετά την άλλη όπως στο ακόλουθο πρόγραμμα.

x = int(input(‘Δώσε τιμή x  ‘))
y = int(input(‘Δώσε τιμή y  ‘))
if y<=x :
      max=x
if y>x :
      max=y
print(‘Μεγαλύτερος είναι ο {0:7.2f}’.format(max))

Σε αυτό το πρόγραμμα δίνουμε δυο τιμές από το πληκτρολόγιο και χρησιμοποιούμε δυο εντολές if που εκτελούν κώδικα ανεξάρτητα η μια της άλλης. Αν το x είναι μεγαλύτερο του  y εκτελείται η πρώτη if, αν το x είναι μικρότερο από το y εκτελείται η δεύτερη if.

Ένας καλύτερος τρόπος για να γράψουμε αυτό το πρόγραμμα είναι με την χρήση της εντολής if . . . else. Με την εντολή if . . . else μπορούμε να καθορίσουμε όχι μόνο την εντολή που θα εκτελεστεί όταν ισχύει η συνθήκη αλλά και την εντολή που θα εκτελεστεί όταν δεν ισχύει η συνθήκη.

Η εντολή if . . . else

Η εντολή if . . . else έχει την ακόλουθη σύνταξη

if συνθήκη :
       εντολή ή ομάδα εντολών που εκτελούνται αν η συνθήκη είναι True
else :
       εντολή ή ομάδα εντολών που εκτελούνται αν η συνθήκη είναι False

Κατά την εκτέλεση της εντολής υπολογίζεται πρώτα η λογική τιμή της συνθήκης και αν αυτή έχει τιμή True εκτελείται η πρώτη ομάδα εντολών κάτω από την if ενώ σε αυτή την περίπτωση η δεύτερη ομάδα εντολών αγνοείται. Αν η συνθήκη είναι False εκτελείται η δεύτερη ομάδα εντολών μετά το else ενώ η πρώτη ομάδα εντολών αγνοείται. Οι ομάδες εντολών είναι μια οποιαδήποτε απλή ή σύνθετη εντολή Python γραμμένη σε εσοχή.

Παράδειγμα: Ξαναγράψτε το προηγούμενο παράδειγμα χρησιμοποιώντας την δομή if . . . else

Σαν λύση θεωρούμε το ακόλουθο απόσπασμα κώδικα

x = int(input(‘Δώσε τιμή x  ‘))
y = int(input(‘Δώσε τιμή y  ‘))
if y<=x :
     max=x
else:
     max=y
print(‘Μεγαλύτερος είναι ο {0:7.2f}’.format(max))

Παράδειγμα:  Γράψτε ένα πρόγραμμα που θα δέχεται δυο ακεραίους από το πληκτρολόγιο και να υπολογίζει τον μεγαλύτερο και τον μικρότερο και να τους εκτυπώνει.

Λύση Το ζητούμενο απόσπασμα κώδικα είναι το ακόλουθο:

x = int(input(‘Δώσε τιμή x  ‘))
y = int(input(‘Δώσε τιμή y  ‘))
if x < y :
    max = y
    min = x
else :
    max = x
    min = y
print(‘{0:7.2f}  μεγαλύτερο από το {1:7.2f}’.format(max, min))

Ειδική μορφή της εντολής if

Η Python διαθέτει μια ειδική μορφή της εντολής if και συγκεκριμένα την

εντολή1 if έκφραση else εντολή2.

Αρχικά αποτιμάται η λογική έκφραση και αν αυτή είναι αληθής εκτελείται η εντολή 1 διαφορετικά η εντολή 2. Π.χ. με την εντολή

k = 1 if x > y else 0

η Python θα εκχωρήσει στη μεταβλητή k την τιμή 1 εφόσον η λογική έκφραση x > y έχει τιμή True ή την τιμή 0 αν η λογική έκφραση x > y είναι False. Στο ακόλουθο παράδειγμα εκτυπώνεται στην οθόνη ο μεγαλύτερος από τους δυο αριθμούς:

a = 5
b = 20
max = a if a > b else b
print(‘%d is greater’%max)

Διαδοχικές χρήσεις της εντολής if

Παράδειγμα: Γράψτε ένα πρόγραμμα που να διαβάζει μια ακέραια τιμή από 0 έως 6 και να τυπώνει στην οθόνη την αντίστοιχη μέρα της εβδομάδας. Το ζητούμενο πρόγραμμα έχει ως εξής:

num = int(input(‘Δώσε τον αριθμό που αντιστοιχεί στην μέρα της εβδομάδας’))
if num==0 :
      print(‘Κυριακή’)
if num==1 :
      print(‘Δευτέρα’)
if num==2 :
      print(‘Τρίτη’)
if num==3 :
      print(‘Τετάρτη’)
if num==4 :
      print(‘Πέμπτη’)
if num==5:
      print(‘Παρασκευή’)
if num==6 :
      print(‘Σάββατο’)
if (num <0) or (num > 6) :
     print(‘ Μη αποδεκτά δεδομένα’)

Φωλιασμένες χρήσεις της εντολής if . . . else

Παράδειγμα: Το ίδιο το παραπάνω πρόγραμμα μπορεί να γραφεί με διαφορετικό τρόπο με τα ίδια αποτελέσματα με φωλιασμένα if . . . else όπως φαίνεται με το παρακάτω πρόγραμμα:

num = int(input(‘Δώσε τον αριθμό που αντιστοιχεί στην μέρα της εβδομάδας’))
if num ==0:
    print(‘Κυριακή’)
else:
    if num ==1:
         print(‘Δευτέρα’)
    else:
        if num==2:
             print(‘Τρίτη’)
        else:
            if num==3:
                 print(‘Τετάρτη’)
            else:
                if num==4:
                     print(‘Πέμπτη’)
                else:
                    if num==5:
                         print(‘Παρασκευή’)
                    else:
                        if num ==6:
                             print(‘Σάββατο’)
                        else:
                            if (num<0) or (num>6):
                                  print(‘Απαράδεκτος αριθμός’)

Η τελευταία έκδοση του προγράμματος είναι πιο αποδοτική για την Python, διότι κατά μέσο όρο κάνει λιγότερες συγκρίσεις με την δομή if . . . else, ενώ η πρώτη έκδοση κάνει όλες τις συγκρίσεις με τις εντολές if. Αυτό οφείλεται στο γεγονός ότι στο δεύτερο πρόγραμμα, όταν η ροή εκτέλεσης φτάσει σε μια if με την συνθήκη να είναι True, εκτελείται η αντίστοιχη ομάδα εντολών, και στη συνέχεια η ροή βγαίνει έξω από τις φωλιασμένες if.   

Χρήση της εντολής if … elif για φωλιασμένη σύνθεση

Ένας ισοδύναμος αλλά και ευκολότερος τρόπος για την γραφή του τελευταίου αποσπάσματος κώδικα είναι με τη χρήση της δομής if . . . elif η οποία είναι μια μορφή φωλιασμένων if . . . else και είναι ένας συνηθισμένος τρόπος ορισμού μιας διακλαδιζόμενης απόφασης.         

Η δομή if . . . elif ελέγχει μια αλληλουχία συνθηκών και στην πρώτη που θα αποτιμήσει ως True εκτελεί την αντίστοιχη ομάδα εντολών και στην συνέχεια βγαίνει έξω από την δομή αυτή. Αν όλες οι συνθήκες αποτιμώνται σε False εκτελείται η ομάδα εντολών που βρίσκονται στο else.

Η σύνταξη της δομής if . . . elif είναι η ακόλουθη:

if συνθήκη1:
       ομάδα εντολών1 (εκτελείται όταν η συνθήκη 1 είναι αληθής)
elif συνθήκη2:
       ομάδα εντολών2 (εκτελείται όταν η συνθήκη 2 είναι αληθής)
elif συνθήκη3:
       ομάδα εντολών3 (εκτελείται όταν η συνθήκη 3 είναι αληθής)
. . .
. . .
if συνθήκη N:
       ομάδα εντολώνN (εκτελείται όταν η συνθήκη Ν είναι αληθής)
else:
       ομάδα εντολώνΝ+1 (εκτελείται αν καμία συνθήκη δεν είναι αληθής)

Οι όροι if και elif μπορεί να ακολουθούνται από μόνο μια εντολή είτε από πολλαπλές εντολές αρκεί να είναι γραμμένες σε εσοχή.

Παράδειγμα Γράψτε τον προηγούμενο απόσπασμα κώδικά ισοδύναμα με τη χρήση της δομής if . . . elif.

Ακολουθεί ο ισοδύναμος τρόπος με την δομή if . . . elif

num = int(input(‘Δώσε τον αριθμό που αντιστοιχεί στην μέρα της εβδομάδας’))
if num==0 :
      print(‘Κυριακή’)
elif num==1 :
      print(‘Δευτέρα’)
elif num==2 :
      print(‘Τρίτη’)
elif num==3 :
      print(‘Τετάρτη’)
elif num==4 :
      print(‘Πέμπτη’)
elif num==5:
      print(‘Παρασκευή’)
elif num==6 :
      print(‘Σάββατο’)
else:
     print(‘ Μη αποδεκτά δεδομένα’)