Δημοσιεύτηκε: 28 Μάιος 2009, 17:47
από Epirotes
Έτοιμο και το κεφ. 8:
Κώδικας: Επιλογή όλων

Python el:Έλεγχος ροής


== Εισαγωγή ==

Στα προγράμματα που είδαμε μέχρι τώρα, υπήρξε πάντα μια σειρά εντολών, τις οποίες εκτελούσε πιστά η Python με την ίδια σειρά. Αν θέλουμε όμως να αλλάξουμε την ροή εκτέλεσης; Αν, για παράδειγμα, θέλουμε το πρόγραμμα να πάρει μερικές αποφάσεις και να κάνει διαφορετικά πράγματα υπό διαφορετικές προϋποθέσεις, όπως π.χ. να εκτυπώσει “καλημέρα” ή “καλησπέρα”, ανάλογα με την ώρα;

Όπως ίσως να μαντέψατε, αυτό επιτυγχάνεται χρησιμοποιώντας εντολές ελέγχου ροής. Υπάρχουν τρεις εντολές ελέγχου ροής στην Python - <tt>if</tt>, <tt>for</tt> και <tt>while</tt>.

== Η εντολή if ==

Η εντολή <tt>if</tt> χρησιμοποιείται για να ελεγχθεί μια συνθήκη και ''εάν'' (''if'') η συνθήκη αυτή είναι αληθές, τότε εκτελείται ένα σύνολο ή πλοκάδα εντολών (που ονομάζεται ''if-block''), διαφορετικά (''else'') γίνεται επεξεργασία ενός άλλου συνόλου εντολών (που ονομάζεται ''else-block''). Η χρήση του όρου ''else'' είναι προαιρετική.

Παράδειγμα:

<source lang="python">
#!/usr/bin/python
# -*- 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
</source>

Αποτέλεσμα:

$ python if.py
Εισάγετε έναν ακέραιο αριθμό : 50
Όχι, είναι λίγο μικρότερος
Τέλος

$ python if.py
Εισάγετε έναν ακέραιο αριθμό : 22
Όχι, είναι λίγο μεγαλύτερος
Τέλος

$ python if.py
Εισάγετε έναν ακέραιο αριθμό : 23
Συγχαρητήρια τον μαντέψατε
(Αλλά δεν κερδίζεται κανένα βραβείο!)
Τέλος

Πως λειτουργεί:

Στο πρόγραμμα αυτό παίρνουμε προγνωστικά από τον χρήστη και ελέγχουμε αν αντιστοιχούν στον αριθμό που έχουμε ορίσει. Ορίζουμε την μεταβλητή <tt>number</tt> ως οποιονδήποτε ακέραιο αριθμό επιθυμούμε, π.χ. <tt>23</tt>. Ύστερα παίρνουμε την πρόγνωση του χρήστη χρησιμοποιώντας την συνάρτηση <tt>input()</tt>. Οι συναρτήσεις είναι απλά επαναχρησιμοποιήσιμα κομμάτια προγραμμάτων. Θα μάθουμε περισσότερα γι' αυτές στο [[Python_en:Συναρτήσεις|επόμενο κεφάλαιο]].

Ορίζουμε μια στοιχειοσειρά (string) στην ενσωματωμένη συνάρτηση <tt>input</tt>, η οποία εκτυπώνει στην οθόνη αυτή την στοιχειοσειρά και αναμένει την εισαγωγή δεδομένων από τον χρήστη. Μόλις εισάγουμε κάτι και πατήσουμε το πλήκτρο <tt>enter</tt>, η συνάρτηση <tt>input()</tt> επιστρέφει αυτό που εισάγαμε ως στοιχειοσειρά. Στην συνέχεια, αυτή η στοιχειοσειρά μετατρέπεται σε ακέραιο αριθμό με την χρήση της <tt>int</tt> κι αποθηκεύεται στην μεταβλητή <tt>guess</tt>. Στην πραγματικότητα, η <tt>int</tt> είναι μια τάξη, άλλα το μόνο που χρειάζεται να ξέρετε προς το παρόν είναι ότι μπορείτε να την χρησιμοποιήσετε για να μετατρέπετε μια στοιχειοσειρά σ' έναν ακέραιο αριθμό (υπό την προϋπόθεση ότι η στοιχειοσειρά περιέχει έναν έγκυρο ακέραιο αριθμό στο κείμενο).

Στο επόμενο βήμα συγκρίνουμε το προγνωστικό του χρήστη με τον αριθμό που επιλέξαμε. Εάν είναι ίδιοι, εκτυπώνεται ένα μύνημα επιτυχίας. Σημειώστε ότι χρησιμοποιούμε επίπεδα εσοχών για να δηλώσουμε στην Python ποιες εντολές ανήκουν σε ποια πλοκάδα. Γι' αυτό το λόγο, οι εσοχές είναι πολύ σημαντικές στην Python. Ελπίζω να ακολουθείτε πάντα τον κανόνα “συνεπής χρήσης εσοχών”. Τον ακολουθείτε;

Παρατηρήστε ότι η εντολή <tt>if</tt> περιλαμβάνει άνω και κάτω τελεία στο τέλος – έτσι δηλώνουμε στην Python ότι ακολουθεί μια πλοκάδα εντολών.

Στην συνέχεια ελέγχουμε αν το προγνωστικό είναι μικρότερο από τον αριθμό μας, κι αν ναι, πληροφορούμε τον χρήστη ότι η πρόγνωσή του πρέπει να είναι λίγο μεγαλύτερη απ' αυτήν. Αυτό που χρησιμοποιήσαμε εδώ είναι ο όρος <tt>elif</tt> ο οποίος στην πραγματικότητα συνδυάζει δύο συσχετιζόμενες εντολές <tt>if else-if else</tt> σε μία εντολή <tt>if-elif-else</tt>. Αυτό κάνει το πρόγραμμα ευκολότερο και μειώνει τον αριθμό των εσοχών που απαιτούνται.

Οι εντολές <tt>elif</tt> και <tt>else</tt> πρέπει επίσης να έχουν άνω και κάτω τελεία στο τέλος της λογικής γραμμής, ακολουθούμενες από τις αντίστοιχες πλοκάδες εντολών (με κατάλληλες εσοχές, βεβαίως).

Μπορείτε να έχετε άλλη μία εντολή <tt>if</tt> εντός της πλοκάδας if (if-block) μιας εντολής <tt>if</tt> κ.οκ. Αυτό αποκαλείται εμφωλευμένη εντολή tt>if</tt>.

Θυμηθείτε ότι τα τμήματα <tt>elif</tt> και <tt>else</tt> είναι προαιρετικά. Μια ελάχιστη έγκυρη εντολή <tt>if</tt> είναι:

<source lang="python">
if True:
print('Ναι, είναι αληθές')
</source>

Αφού η Python τελειώσει την εκτέλεση ολόκληρης της εντολής <tt>if</tt> συμπεριλαμβανομένων και τον συσχετιζόμενων όρων <tt>elif</tt> και <tt>else</tt>, προχωράει στην επόμενη εντολή στην πλοκάδα που περιέχει την εντολή <tt>if</tt>. Στην περίπτωσή μας πρόκειται για την κύρια πλοκάδα με την οποία ξεκινάει η εκτέλεση του προγράμματος και η επόμενη εντολή είναι <tt>print('Τέλος')</tt>. Μετά απ' αυτό η Python βλέπει το τέλος του προγράμματος και απλά τελειώνει εκεί.

Αν κι αυτό είναι ένα πολύ απλό πρόγραμμα, έχω επισημάνει πολλά πράγματα που πρέπει να λάβετε υπόψη ακόμα κι σ' ένα τόσο απλό πρόγραμμα. Όλα αυτά είναι αρκετά στρωτά (κι εκπληκτικά απλά για όσους έχουν προϊστορικό σε C/C++) και απαιτούν να τα συνειδητοποιήσετε, αλλά μετά απ' αυτό θα αποκτήσετε ευχέρεια στην χρήση τους και θα σας φανούν “φυσικά”.

; Σημείωση για προγραμματιστές C/C++
: Δεν υπάρχει εντολή <tt>switch</tt> στην Python. Μπορείτε να χρησιμοποιήσετε μια εντολή <tt>if..elif..else</tt> για να κάνετε το ίδιο πράγμα (και σε μερικές περιπτώσεις να χρησιμοποιήσετε ένα [[Python_el:Δομές δεδομένων#Λεξικό|λεξικό]] για να το κάνετε γρήγορα).

== Η εντολή while ==

Η εντολή <tt>while</tt> σας επιτρέπει να εκτελείτε επανειλημμένα μια πλοκάδα εντολών, όσο μια προϋπόθεση παραμένει αληθές. Η εντολή <tt>while</tt> είναι ένα παράδειγμα αυτού που αποκαλείται εντολή ''βρόχου'' ( ''looping'' statement). Μια εντολή <tt>while</tt> μπορεί να έχει έναν προαιρετικό όρο <tt>else</tt>.

Παράδειγμα:

<source lang="python">
#!/usr/bin/python
# -*- 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('Τέλος')
</source>

Αποτέλεσμα:

$ python while.py
Εισάγετε έναν ακέραιο αριθμό : 50
Όχι, είναι λίγο μεγαλύτερος.
Εισάγετε έναν ακέραιο αριθμό : 22
Όχι, είναι λίγο μεγαλύτερος
Εισάγετε έναν ακέραιο αριθμό : 23
Συγχαρητήρια, τον μαντέψατε.
Ο βρόχος while τερματίστηκε.
Τέλος

Πως λειτουργεί

Σ' αυτό το πρόγραμμα παίζουμε ακόμα το παιχνίδι πρόγνωσης, αλλά το πλεονέκτημα είναι ότι επιτρέπει στον χρήστη να συνεχίσει να μαντεύει μέχρι να βρει τον σωστό αριθμό -δεν χρειάζεται δηλ. να εκτελεί επανειλημμένα το πρόγραμμα για κάθε πρόγνωση, όπως γινόταν στο προηγούμενο παράδειγμα. Αυτό είναι ένα πολύ καλό παράδειγμα της χρήσης της εντολής <tt>while</tt>.

Μετακινούμε τις εντολές <tt>input</tt> και <tt>if</tt> εντός του βρόχου <tt>while</tt> και ορίζουμε την μεταβλητή <tt>running</tt> σε <tt>True</tt> πριν τον βρόχο while. Πρώτα ελέγχουμε αν η μεταβλητή <tt>running</tt> έχει την τιμή <tt>True</tt> και στην συνέχεια προχωράμε στην εκτέλεση της αντίστοιχης ''πλοκάδας while'' (''while-block''). Αφού εκτελεστεί αυτή η πλοκάδα, η προϋπόθεση ελέγχεται και πάλι, δηλ. στην περίπτωσή μας η μεταβλητή <tt>running</tt>. Εάν η τιμή της συνεχίζει να είναι true (αληθές), εκτελείται και πάλι ολόκληρη η πλοκάδα while (while-block), διαφορετικά προχωράμε στην εκτέλεση της προαιρετικής πλοκάδας else (else-block) και μετά προχωράμε στην επόμενη εντολή.

Η πλοκάδα <tt>else</tt> εκτελείται όταν η προϋπόθεση του βρόχου <tt>while</tt> αποκτά την τιμή <tt>False</tt> (ψευδές) -αυτό μπορεί να συμβεί ακόμα και κατά την πρώτη φορά που ελέγχεται η προϋπόθεση. Εάν υπάρχει ένας όρος <tt>else</tt> για ένα βρόχο <tt>while</tt>, εκτελείται πάντοτε, εκτός κι αν διακόψετε τον βρόχο με την εντολή <tt>break</tt>.

Οι τιμές <tt>True</tt> (αληθές) και <tt>False</tt> (ψευδές) ονομάζονται Μπούλειοι τύποι (Boolean types) και μπορείτε να θεωρήσετε ότι αντιστοιχούν στις τιμές <tt>1</tt> και <tt>0</tt> αντίστοιχα.

; Σημείωση για προγραμματιστές C/C++
: Θυμηθείτε ότι μπορείτε να έχετε έναν όρο <tt>else</tt> για τον βρόχο <tt>while</tt>.


== Ο βρόχος for ==

Η εντολή <tt>for..in</tt> είναι άλλη μία εντολή βρόχου, η οποία ''επαναλαμβάνεται'' σε μια ακολουθία αντικειμένων, δηλ. εκτελείται σε κάθε αντικείμενο σε μια ακολουθία. Θα δούμε περισσότερες λεπτομέρειες σχετικά με τις [[Python_el:Δομές δεδομένων#Ακολουθίες|ακολουθίες]] στα επόμενα κεφάλαια. Αυτό που πρέπει να γνωρίζετε προς το παρόν είναι ότι μια ακολουθία είναι απλά μια ταξινομημένη συλλογή αντικειμένων.

Παράδειγμα:

<source lang="python">
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Filename: for.py

for i in range(1, 5):
print(i)
else:
print('Ο βρόχος loop τερματίστηκε')
</source>

Αποτέλεσμα:

$ python for.py
1
2
3
4
Ο βρόχος loop τερματίστηκε

Πως λειτουργεί:

Σ' αυτό το πρόγραμμα εκτυπώνουμε μια ''ακολουθία'' αριθμών. Παράγουμε αυτή την ακολουθία αριθμών με την ενσωματωμένη συνάρτηση <tt>range</tt>.

Αυτό που κάνουμε εδώ είναι ότι παρέχουμε δύο αριθμούς και η <tt>range</tt> επιστρέφει μια ακολουθία αριθμών, ξεκινώντας από τον πρώτο αριθμό και έως τον δεύτερο αριθμό. Για παράδειγμα, <tt>range(1,5)</tt> δίνει την ακολουθία <tt>[1, 2, 3, 4]</tt>. Εξ ορισμού, η <tt>range</tt> έχει ως αριθμό κλιμάκωσης (step count) το 1. Εάν παρέχουμε έναν τρίτο αριθμό στην <tt>range</tt>, τότε αυτός γίνεται ο αριθμός κλιμάκωσης (step count). Για παράδειγμα, <tt>range(1,5,2)</tt> δίνει ως αποτέλεσμα <tt>[1,3]</tt>. Θυμηθείτε το εύρος των αριθμών εκτείνεται ''έως'' τον δεύτερο αριθμό, δηλ. ''δεν'' συμπεριλαμβάνει τον δεύτερο αριθμό.

Στην συνέχεια, ο βρόχος <tt>for</tt> επαναλαμβάνεται σ' αυτό το εύρος - <tt>for i in range(1,5)</tt> είναι αντίστοιχο του <tt>for i in [1, 2, 3, 4]</tt> που είναι σαν να αντιστοιχούμε κάθε αριθμό (ή αντικείμενο) της ακολουθίας στο i ξεχωριστά και στην συνέχεια να εκτελούμε την πλοκάδα των εντολών για κάθε τιμή της <tt>i</tt>. Στην περίπτωσή μας, απλά εκτυπώνουμε την τιμή στην πλοκάδα των εντολών.

Θυμηθείτε ότι το τμήμα <tt>else</tt> είναι προαιρετικό. Όταν συμπεριλαμβάνεται, εκτελείται πάντα μόλις τερματιστεί ο βρόχος <tt>for</tt>, εκτός κι αν συναντηθεί η εντολή [[#Η εντολή break |break]] ενδιάμεσα.

Επίσης θυμηθείτε ότι ο βρόχος <tt>for..in</tt> δουλεύει για οποιαδήποτε ακολουθία. Εδώ έχουμε μια λίστα αριθμών που παράγονται από την ενσωματωμένη συνάρτηση <tt>range</tt>, αλλά γενικά μπορούμε να χρησιμοποιήσουμε οποιοδήποτε είδος ακολουθίας οποιουδήποτε είδους αντικειμένων! Θα εξερευνήσουμε αυτή την ιδέα λεπτομερέστερα στα επόμενα κεφάλαια.

; Σημείωση για προγραμματιστές C/C++/Java/C#
: Στην Python, ο βρόχος <tt>for</tt> είναι ριζικά διαφορετικός από τον βρόχο <tt>for</tt> της C/C++. Προγραμματιστές της C# θα παρατηρήσουν ότι ο βρόχος <tt>for</tt> στην Python είναι παρόμοιος με τον βρόχο <tt>foreach</tt> στην C#. Προγραμματιστές της Java θα παρατηρήσουν ότι αυτός είναι παρόμοιος με το <tt>for (int i : IntArray)</tt> στην Java 1.5 .
: Στην C/C++, αν θέλετε να γράψετε π.χ. <tt>for (int i = 0; i &lt; 5; i++)</tt>, τότε στην Python απλά γράφετε <tt>for i in range(0,5)</tt>. Όπως βλέπετε, ο βρόχος <tt>for</tt> είναι πιο απλός, πιο εκφραστικός και λιγότερο ευπαθής σε σφάλματα στην Python.


== Η εντολή break ==

Η εντολή <tt>break</tt> χρησιμοποιείται για την διακοπή της εντολής βρόχου, δηλ. την διακοπή της εκτέλεσης της εντολής βρόχου ακόμη κι αν η προϋπόθεση του βρόχου δεν έχει γίνει <tt>False</tt> (ψευδής) ή δεν έχει επαναληφθεί σ' όλη την ακολουθία των αντικειμένων.

Είναι σημαντικό να σημειώσουμε ότι εάν διακόψετε έναν βρόχο <tt>for</tt> ή <tt>while</tt> κατ' αυτό τον τρόπο, οποιαδήποτε αντίστοιχη πλοκάδα βρόχου <tt>else</tt> '''δεν''' εκτελείται.

Example:

<source lang="python">
#!/usr/bin/python
# Filename: break.py

while True:
s = (input('Enter something : '))
if s == 'quit':
break
print('Length of the string is', len(s))
print('Done')
</source>

Αποτέλεσμα:

$ 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

Πως λειτουργεί:

Σ' αυτό το πρόγραμμα παίρνουμε επανειλημμένα τα εισαχθέντα δεδομένα του χρήστη και εκτυπώνουμε το μήκος κάθε εισαγωγής (δηλ. το σύνολο χαρακτήρων). Έχουμε ορίσει έναν ειδικό όρο για την διακοπή του προγράμματος, ελέγχοντας αν τα εισαχθέντα δεδομένα του χρήστη είναι <tt>'quit'</tt>. Σταματάμε το πρόγραμμα ''διακόπτοντας'' τον βρόχο και φθάνουμε στο τέλος του προγράμματος.

Το μήκος της εισαχθείσας στοιχειοσειράς μπορεί να βρεθεί χρησιμοποιώντας την ενσωματωμένη συνάρτηςη <tt>len</tt> .

Θυμηθείτε ότι η εντολή <tt>break</tt> μπορεί να χρησιμοποιηθεί επίσης και με τον βρόχο <tt>for</tt>.


=== 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 ==

Η εντολή <tt>continue</tt> χρησιμοποιείται για να υποδείξουμε στην Python να παραλείψει τις υπόλοιπες εντολές στην τρέχουσα πλοκάδα βρόχου και να ''συνεχίσει'' με την επόμενη επανάληψη του βρόχου.

Παράδειγμα:

<source lang="python">
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Filename: continue.py

while True:
s = input('Εισάγετε κάτι : ')
if s == 'quit':
break
if len(s) < 3:
print('Πολύ μικρό')
continue
print('Το μήκος των εισαχθέντων είναι επαρκές')
# Προσθέστε οτιδήποτε άλλο εδώ
</source>

Output:

$ python test.py
Εισάγετε κάτι : a
Πολύ μικρό
Εισάγετε κάτι : 12
Πολύ μικρό
Εισάγετε κάτι : abc
Το μήκος των εισαχθέντων είναι επαρκές
Εισάγετε κάτι : quit

Πως λειτουργεί:

Σ' αυτό το πρόγραμμα, αποδεχόμαστε δεδομένα εισαγωγής από τον χρήστη, αλλά τα επεξεργαζόμαστε μόνο εάν έχουν τουλάχιστον μήκος 3 χαρακτήρων. Έτσι, χρησιμοποιούμε την ενσωματωμένη συνάρτηση <tt>len</tt> για να βρούμε το μήκος κι αν αυτό είναι μικρότερο από 3, τότε παραλείπουμε τις υπόλοιπες εντολές στην πλοκάδα χρησιμοποιώντας την εντολή <tt>continue</tt>. Διαφορετικά, οι υπόλοιπες εντολές στην πλοκάδα εκτελούνται και μπορούμε να κάνουμε οποιοδήποτε είδος επεξεργασίας θέλουμε σ' αυτό το σημείο.

Σημειώστε ότι η εντολή <tt>continue</tt> δουλεύει επίσης και με τον βρόχο <tt>for</tt>.


== Περίληψη ==

Είδαμε πως να χρησιμοποιήσουμε τρεις εντολές ελέγχου ροής -την <tt>if</tt>, την <tt>while</tt> και την <tt>for</tt> μαζί με τις συσχετιζόμενες εντολές <tt>break</tt> και <tt>continue</tt>. Αυτές ανήκουν στα πιο συχνά χρησιμοποιημένα μέρη της Python και γι' αυτό είναι ουσιώδες να εξοικειωθεί κανείς μ' αυτές.

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


----

<div class="paging">
<span class="prev">[[Python_el:Τελεστές και εκφράσεις|προηγούμενο]]</span>
<span class="next">[[Python_el:Συναρτήσεις|επόμενο]]</span>
</div>

</div>

[[Category:A Byte of Python|Ελέγχος Ροής]]