Byte of Python - Ελληνική Έκδοση

Έλεγχος ροής

Εισαγωγή

Στα προγράμματα που είδαμε μέχρι τώρα, υπήρξε πάντα μια σειρά εντολών, τις οποίες εκτελούσε πιστά η 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 και γι' αυτό είναι ουσιώδες να εξοικειωθεί κανείς μ' αυτές.

Στο επόμενο κεφάλαιο θα δούμε πως δημιουργούμε και χρησιμοποιούμε συναρτήσεις.