Έλεγχος ροής
Εισαγωγή
Στα προγράμματα που είδαμε μέχρι τώρα, υπήρξε πάντα μια σειρά εντολών, τις οποίες εκτελούσε πιστά η Python με την ίδια σειρά. Αν θέλουμε όμως να αλλάξουμε την ροή εκτέλεσης; Αν, για παράδειγμα, θέλουμε το πρόγραμμα να πάρει μερικές αποφάσεις και να κάνει διαφορετικά πράγματα υπό διαφορετικές προϋποθέσεις, όπως π.χ. να εκτυπώσει καλημέρα
ή καλησπέρα
, ανάλογα με την ώρα;
Όπως ίσως να μαντέψατε, αυτό επιτυγχάνεται χρησιμοποιώντας εντολές ελέγχου ροής. Υπάρχουν τρεις εντολές ελέγχου ροής στην Python - if
, for
και while
.
Η εντολή if
Η εντολή if
χρησιμοποιείται για να ελεγχθεί μια συνθήκη και εάν (if) η συνθήκη αυτή είναι αληθής, τότε εκτελείται ένα σύνολο (τμήμα) εντολών (που ονομάζεται if-block), διαφορετικά (else) γίνεται επεξεργασία ενός άλλου συνόλου εντολών (που ονομάζεται else-block). Η χρήση του όρου else
είναι προαιρετική.
Παράδειγμα:
#!/usr/bin/python3 # -*- coding: utf-8 -*- # Filename: if.py number = 23 guess = int(input('Εισάγετε έναν ακέραιο αριθμό: ')) if guess == number: print('Συγχαρητήρια, τον μαντέψατε.') # Νέο τμήμα (block) ξεκινάει εδώ print('(Αλλά δεν κερδίζετε και κανένα βραβείο!)') # Το νέο τμήμα τελειώνει εδώ elif guess < number: print('Όχι, είναι λίγο μεγαλύτερος.') # ΆΛλο ένα τμήμα # Μπορείτε να κάνετε ότι θέλετε εντός ενός τμήματος ... else: print('Όχι, είναι λίγο μικρότερος.') # πρέπει να ισχύει guess > number για να φθάσετε εδώ print('Τέλος') # Η τελευταία αυτή εντολή εκτελείται πάντα μετά την εκτέλεση της εντολής if
Έξοδος:
$ python3 if.py Εισάγετε έναν ακέραιο αριθμό: 50 Όχι, είναι λίγο μικρότερος. Τέλος $ python3 if.py Εισάγετε έναν ακέραιο αριθμό: 22 Όχι, είναι λίγο μεγαλύτερος. Τέλος $ python3 if.py Εισάγετε έναν ακέραιο αριθμό: 23 Συγχαρητήρια, τον μαντέψατε. (Αλλά δεν κερδίζετε και κανένα βραβείο!) Τέλος
Πώς λειτουργεί:
Στο πρόγραμμα αυτό μαντεύει ο χρήστης αριθμούς και ελέγχουμε αν αντιστοιχούν στον αριθμό που έχουμε ορίσει. Ορίζουμε την μεταβλητή number
ως οποιονδήποτε ακέραιο αριθμό επιθυμούμε, π.χ. 23
. Ύστερα παίρνουμε την πρόγνωση του χρήστη χρησιμοποιώντας την συνάρτηση input()
. Οι συναρτήσεις είναι απλά επαναχρησιμοποιήσιμα κομμάτια προγραμμάτων. Θα μάθουμε περισσότερα γι' αυτές στο επόμενο κεφάλαιο.
Παρέχουμε μια συμβολοσειρά (string) στην ενσωματωμένη συνάρτηση input
, η οποία εκτυπώνει στην οθόνη αυτή την συμβολοσειρά και αναμένει την εισαγωγή δεδομένων από τον χρήστη. Μόλις εισάγουμε κάτι και πατήσουμε το πλήκτρο enter
, η συνάρτηση input()
επιστρέφει αυτό που εισάγαμε ως συμβολοσειρά. Στην συνέχεια, αυτή η συμβολοσειρά μετατρέπεται σε ακέραιο αριθμό με την χρήση της int
και αποθηκεύεται στην μεταβλητή guess
. Στην πραγματικότητα, η int
είναι μια κλάση, άλλα το μόνο που χρειάζεται να ξέρετε προς το παρόν είναι ότι μπορείτε να την χρησιμοποιήσετε για να μετατρέπετε μια συμβολοσειρά σ' έναν ακέραιο αριθμό (υπό την προϋπόθεση ότι η συμβολοσειρά περιέχει έναν έγκυρο ακέραιο αριθμό στο κείμενο).
Στο επόμενο βήμα συγκρίνουμε το προγνωστικό του χρήστη με τον αριθμό που επιλέξαμε. Εάν είναι ίδιοι, εκτυπώνεται ένα μήνυμα επιτυχίας. Σημειώστε ότι χρησιμοποιούμε επίπεδα εσοχών για να δηλώσουμε στην Python ποιες εντολές ανήκουν σε ποιο τμήμα. Γι' αυτό το λόγο, οι εσοχές είναι πολύ σημαντικές στην Python. Ελπίζω να ακολουθείτε πάντα τον κανόνα «συνεπής χρήσης εσοχών». Τον ακολουθείτε;
Παρατηρήστε ότι η εντολή if
περιλαμβάνει άνω και κάτω τελεία στο τέλος – έτσι δηλώνουμε στην Python ότι ακολουθεί ένα τμήμα εντολών.
Στην συνέχεια ελέγχουμε αν το προγνωστικό είναι μικρότερο από τον αριθμό μας, κι αν ναι, πληροφορούμε τον χρήστη ότι η πρόγνωσή του πρέπει να είναι λίγο μεγαλύτερη απ' αυτήν. Αυτό που χρησιμοποιήσαμε εδώ είναι ο όρος elif
ο οποίος στην πραγματικότητα συνδυάζει δύο συσχετιζόμενες εντολές if .. else
-if .. else
σε μία εντολή if .. elif .. else
. Αυτό κάνει το πρόγραμμα ευκολότερο και μειώνει τον αριθμό των εσοχών που απαιτούνται.
Οι εντολές elif
και else
πρέπει επίσης να έχουν άνω και κάτω τελεία στο τέλος της λογικής γραμμής, ακολουθούμενες από τα αντίστοιχα τμήματα εντολών (με κατάλληλες εσοχές, βεβαίως).
Μπορείτε να έχετε άλλη μία εντολή if
εντός του τμήματος if
(if-block) μιας εντολής if
κ.οκ. Αυτό αποκαλείται εμφωλευμένη εντολή if.
Θυμηθείτε ότι τα τμήματα elif
και else
είναι προαιρετικά. Μια ελάχιστη έγκυρη εντολή if
είναι:
if True: print('Ναι, είναι αληθές')
Αφού η Python τελειώσει την εκτέλεση ολόκληρης της εντολής if
συμπεριλαμβανομένων και των συσχετιζόμενων όρων elif
και else
, προχωράει στην επόμενη εντολή στο τμήμα που περιέχει την εντολή if
. Στην περίπτωσή μας πρόκειται για το κύριο τμήμα με το οποίο ξεκινάει η εκτέλεση του προγράμματος και η επόμενη εντολή είναι print('Τέλος')
. Μετά απ' αυτό η Python βλέπει το τέλος του προγράμματος και απλά τελειώνει εκεί.
Αν κι αυτό είναι ένα πολύ απλό πρόγραμμα, έχω επισημάνει πολλά πράγματα που πρέπει να λάβετε υπόψη ακόμα και σ' ένα τόσο απλό πρόγραμμα. Όλα αυτά είναι αρκετά στρωτά (κι εκπληκτικά απλά για όσους έχουν προϊστορικό σε C/C++) και απαιτούν να τα συνειδητοποιήσετε, αλλά μετά απ' αυτό θα αποκτήσετε ευχέρεια στην χρήση τους και θα σας φανούν “φυσικά”.
- Σημείωση για προγραμματιστές C/C++
-
Δεν υπάρχει εντολή
switch
στην Python. Μπορείτε να χρησιμοποιήσετε μια εντολήif .. elif .. else
για να κάνετε το ίδιο πράγμα (και σε μερικές περιπτώσεις να χρησιμοποιήσετε ένα λεξικό για να το κάνετε γρήγορα).
Η εντολή while
Η εντολή while
σας επιτρέπει να εκτελείτε επανειλημμένα ένα τμήμα εντολών, όσο μια προϋπόθεση παραμένει αληθής. Η εντολή while
είναι ένα παράδειγμα αυτού που αποκαλείται εντολή βρόχου ( looping statement). Μια εντολή while
μπορεί να έχει έναν προαιρετικό όρο else
.
Παράδειγμα:
#!/usr/bin/python3 # -*- coding: utf-8 -*- # Filename: while.py number = 23 running = True while running: guess = int(input('Εισάγετε έναν ακέραιο αριθμό : ')) if guess == number: print('Συγχαρητήρια, τον μαντέψατε.') running = False # αυτό κάνει τον βρόχο while να σταματήσει εδώ elif guess < number: print('Όχι, είναι λίγο μεγαλύτερος.') else: print('Όχι, είναι λίγο μικρότερος.') else: print('Ο βρόχος while τερματίστηκε.') # Μπορείτε να προσθέσετε ότι άλλο θέλετε εδώ print('Τέλος')
Έξοδος:
$ python3 while.py Εισάγετε έναν ακέραιο αριθμό : 50 Όχι, είναι λίγο μεγαλύτερος. Εισάγετε έναν ακέραιο αριθμό : 22 Όχι, είναι λίγο μεγαλύτερος Εισάγετε έναν ακέραιο αριθμό : 23 Συγχαρητήρια, τον μαντέψατε. Ο βρόχος while τερματίστηκε. Τέλος
Πώς λειτουργεί:
Σ' αυτό το πρόγραμμα παίζουμε ακόμα το παιχνίδι πρόγνωσης, αλλά το πλεονέκτημα είναι ότι επιτρέπει στον χρήστη να συνεχίσει να μαντεύει μέχρι να βρει τον σωστό αριθμό -δεν χρειάζεται δηλ. να εκτελεί επανειλημμένα το πρόγραμμα για κάθε πρόγνωση, όπως γινόταν στο προηγούμενο παράδειγμα. Αυτό είναι ένα πολύ καλό παράδειγμα της χρήσης της εντολής while
.
Μετακινούμε τις εντολές input
και if
εντός του βρόχου while
και ορίζουμε την μεταβλητή running
σε True
πριν τον βρόχο while
. Πρώτα ελέγχουμε αν η μεταβλητή running
έχει την τιμή True
και στην συνέχεια προχωράμε στην εκτέλεση του αντίστοιχου τμήματος while
(while-block). Αφού εκτελεστεί αυτό το τμήμα, η προϋπόθεση ελέγχεται και πάλι, δηλ. στην περίπτωσή μας η μεταβλητή running
. Εάν η τιμή της συνεχίζει να είναι true
(αληθές), εκτελείται και πάλι ολόκληρο το τμήμα while
(while-block), διαφορετικά προχωράμε στην εκτέλεση του προαιρετικού τμήματος else
(else-block) και μετά προχωράμε στην επόμενη εντολή.
Το τμήμα else
εκτελείται όταν η προϋπόθεση του βρόχου while
αποκτά την τιμή False
(ψευδές) - αυτό μπορεί να συμβεί ακόμα και κατά την πρώτη φορά που ελέγχεται η προϋπόθεση. Εάν υπάρχει ένας όρος else
για ένα βρόχο while
, εκτελείται πάντοτε, εκτός κι αν διακόψετε τον βρόχο με την εντολή break
.
Οι τιμές True
(αληθές) και False
(ψευδές) ονομάζονται τύποι Μπούλειαν (Boolean types) και μπορείτε να θεωρήσετε ότι αντιστοιχούν στις τιμές 1
και 0
αντίστοιχα.
- Σημείωση για προγραμματιστές C/C++
-
Θυμηθείτε ότι μπορείτε να έχετε έναν όρο
else
για τον βρόχοwhile
.
Ο βρόχος for
Η εντολή for .. in
είναι άλλη μία εντολή βρόχου, η οποία επαναλαμβάνεται σε μια ακολουθία αντικειμένων, δηλ. εκτελείται σε κάθε αντικείμενο σε μια ακολουθία. Θα δούμε περισσότερες λεπτομέρειες σχετικά με τις ακολουθίες στα επόμενα κεφάλαια. Αυτό που πρέπει να γνωρίζετε προς το παρόν είναι ότι μια ακολουθία είναι απλά μια ταξινομημένη συλλογή αντικειμένων.
Παράδειγμα:
#!/usr/bin/python # -*- coding: utf-8 -*- # Filename: for.py for i in range(1, 5): print(i) else: print('Ο βρόχος loop τερματίστηκε')
Έξοδος:
$ python for.py 1 2 3 4 Ο βρόχος loop τερματίστηκε
Πώς λειτουργεί:
Σ' αυτό το πρόγραμμα εκτυπώνουμε μια ακολουθία αριθμών. Παράγουμε αυτή την ακολουθία αριθμών με την ενσωματωμένη συνάρτηση range
.
Αυτό που κάνουμε εδώ είναι ότι παρέχουμε δύο αριθμούς και η range
επιστρέφει μια ακολουθία αριθμών, ξεκινώντας από τον πρώτο αριθμό έως το δεύτερο αριθμό. Για παράδειγμα, η range(1,5)
δίνει την ακολουθία [1, 2, 3, 4]
. Εξ ορισμού, η range
έχει ως αριθμό κλιμάκωσης (step count) το 1
. Εάν παρέχουμε έναν τρίτο αριθμό στην range
, τότε αυτός γίνεται ο αριθμός κλιμάκωσης (step count). Για παράδειγμα, το range(1,5,2)
δίνει ως αποτέλεσμα [1,3]
. Θυμηθείτε το εύρος των αριθμών εκτείνεται έως τον δεύτερο αριθμό, δηλ. δεν συμπεριλαμβάνει τον δεύτερο αριθμό.
Στην συνέχεια, ο βρόχος for
επαναλαμβάνεται σ' αυτό το εύρος - for i in range(1,5)
είναι αντίστοιχο του for i in [1, 2, 3, 4]
που είναι σαν να αντιστοιχούμε κάθε αριθμό (ή αντικείμενο) της ακολουθίας στο i
ξεχωριστά και στην συνέχεια να εκτελούμε το τμήμα των εντολών για κάθε τιμή της i
. Στην περίπτωσή μας, μέσα στο τμήμα εντολών απλά εκτυπώνουμε την τιμή της i
.
Θυμηθείτε ότι το τμήμα else
είναι προαιρετικό. Όταν συμπεριλαμβάνεται, εκτελείται πάντα μόλις τερματιστεί ο βρόχος for
, εκτός κι αν συναντηθεί η εντολή break
ενδιάμεσα.
Επίσης θυμηθείτε ότι ο βρόχος for .. in
δουλεύει για οποιαδήποτε ακολουθία. Εδώ έχουμε μια λίστα αριθμών που παράγονται από την ενσωματωμένη συνάρτηση range
, αλλά γενικά μπορούμε να χρησιμοποιήσουμε οποιοδήποτε είδος ακολουθίας οποιουδήποτε είδους αντικειμένων! Θα εξερευνήσουμε αυτή την ιδέα λεπτομερέστερα στα επόμενα κεφάλαια.
- Σημείωση για προγραμματιστές C/C++/Java/C#
-
Στην Python, ο βρόχος
for
είναι ριζικά διαφορετικός από τον βρόχοfor
της C/C++. Προγραμματιστές της C# θα παρατηρήσουν ότι ο βρόχοςfor
στην Python είναι παρόμοιος με τον βρόχοforeach
στην C#. Προγραμματιστές της Java θα παρατηρήσουν ότι αυτός είναι παρόμοιος με τοfor (int i : IntArray)
στην Java 1.5 . Στη C/C++, αν θέλετε να γράψετε π.χ.for (int i = 0; i < 5; i++)
, τότε στην Python απλά γράφετεfor i in range(0,5)
. Όπως βλέπετε, ο βρόχος for είναι πιο απλός, πιο εκφραστικός και λιγότερο ευπαθής σε σφάλματα στην Python!
Η εντολή break
Η εντολή break
χρησιμοποιείται για τη διακοπή μιας εντολής βρόχου, δηλ. τη διακοπή της εκτέλεσης της εντολής βρόχου ακόμη κι αν η προϋπόθεση του βρόχου δεν έχει γίνει False
(ψευδής) ή δεν έχει επαναληφθεί σ' όλη την ακολουθία των αντικειμένων.
Είναι σημαντικό να σημειώσουμε ότι εάν διακόψετε έναν βρόχο for
ή while
κατ' αυτό τον τρόπο, οποιοδήποτε αντίστοιχο τμήμα βρόχου else
δεν εκτελείται.
Παράδειγμα:
#!/usr/bin/python # Filename: break.py while True: s = raw_input('Enter something : ') if s == 'quit': break print('Length of the string is', len(s)) print('Done')
Αποτέλεσμα:
$ python break.py Enter something : Programming is fun Length of the string is 18 Enter something : When the work is done Length of the string is 21 Enter something : if you wanna make your work also fun: Length of the string is 37 Enter something : use Python! Length of the string is 12 Enter something : quit Done
Σ' αυτό το πρόγραμμα παίρνουμε επανειλημμένα τα εισαχθέντα δεδομένα του χρήστη και εκτυπώνουμε το μήκος κάθε εισαγωγής (δηλ. το σύνολο χαρακτήρων). Έχουμε ορίσει έναν ειδικό όρο για την διακοπή του προγράμματος, ελέγχοντας αν τα εισαχθέντα δεδομένα του χρήστη είναι 'quit'
. Σταματάμε το πρόγραμμα διακόπτοντας τον βρόχο και φθάνουμε στο τέλος του προγράμματος.
Το μήκος της εισαχθείσας συμβολοσειράς μπορεί να βρεθεί χρησιμοποιώντας την ενσωματωμένη συνάρτηση len
.
Θυμηθείτε ότι η εντολή break
μπορεί να χρησιμοποιηθεί επίσης και με το βρόχο for
.
Swaroop's Poetic Python
Τα εισαχθέντα δεδομένα που χρησιμοποίησα εδώ είναι ένα μικρό ποιήμα που έγραψα με τίτλο Swaroop's Poetic Python:
Programming is fun When the work is done if you wanna make your work also fun: use Python.
Η εντολή continue
Η εντολή continue
χρησιμοποιείται για να υποδείξουμε στην Python να παραλείψει τις υπόλοιπες εντολές στο τρέχον τμήμα βρόχου και να συνεχίσει με την επόμενη επανάληψη του βρόχου.
Παράδειγμα:
#!/usr/bin/python # -*- coding: utf-8 -*- # Filename: continue.py while True: s = raw_input('Εισάγετε κάτι : ') if s == 'quit': break if len(s) < 3: print('Πολύ μικρό') continue print('Το μήκος των εισαχθέντων είναι επαρκές') # Προσθέστε οτιδήποτε άλλο εδώ
Έξοδος:
$ python test.py Εισάγετε κάτι : a Πολύ μικρό Εισάγετε κάτι : 12 Πολύ μικρό Εισάγετε κάτι : abc Το μήκος των εισαχθέντων είναι επαρκές Εισάγετε κάτι : quit
Πώς λειτουργεί:
Σ' αυτό το πρόγραμμα, αποδεχόμαστε δεδομένα εισαγωγής από τον χρήστη, αλλά τα επεξεργαζόμαστε μόνο εάν έχουν τουλάχιστον μήκος 3 χαρακτήρων. Έτσι, χρησιμοποιούμε την ενσωματωμένη συνάρτηση len
για να βρούμε το μήκος κι αν αυτό είναι μικρότερο από 3, τότε παραλείπουμε τις υπόλοιπες εντολές στο τμήμα χρησιμοποιώντας την εντολή continue
. Διαφορετικά, οι υπόλοιπες εντολές στο τμήμα εκτελούνται και μπορούμε να κάνουμε οποιοδήποτε είδος επεξεργασίας θέλουμε σ' αυτό το σημείο.
Σημειώστε ότι η εντολή continue
δουλεύει επίσης και με το βρόχο for
.
Σύνοψη
Είδαμε πώς χρησιμοποιούμε τις τρεις εντολές ελέγχου ροής -τ ην if
, την while
και την for
μαζί με τις συσχετιζόμενες εντολές break
και continue
. Αυτές ανήκουν στα πιο συχνά χρησιμοποιημένα μέρη της Python και γι' αυτό είναι ουσιώδες να εξοικειωθεί κανείς μ' αυτές.
Στο επόμενο κεφάλαιο θα δούμε πως δημιουργούμε και χρησιμοποιούμε συναρτήσεις.