ΚΕΦΑΛΑΙΟ 3 Εκφράσεις, τελεστές, σχόλια Σύνοψη Στο κεφάλαιο αυτό εισάγουμε τον τρόπο τέλεσης πράξεων μεταξύ μεταβλητών και σταθερών, εκφράσεις μεταξύ αυτών καθώς και το σχολιασμό της λογικής ενός προγράμματος. Προαπαιτούμενη γνώση Κεφάλαια 1, 2 του παρόντος συγγράμματος. 3.1 Εισαγωγή Σε αυτό το κεφάλαιο θα ασχοληθούμε με την τέλεση πράξεων μεταξύ μεταβλητών και σταθερών, τη σύνθεσή τους σε εκφράσεις, και το σχολιασμό της λογικής ενός προγράμματος. Μια έκφραση (expression) είναι ένας συνδυασμός τιμών, μεταβλητών και τελεστών. Οι τελεστές (operators) είναι λειτουργίες που επιτελούν πράξεις και μπορούν να αναπαρασταθούν με σύμβολα όπως το + ή με λέξεις- κλειδιά, όπως το and. Οι τιμές και οι μεταβλητές πάνω στις οποίες εφαρμόζονται οι τελεστές, ονομάζονται τελεστέοι (operands). 27 I Κ. ΜΑΓΚΟΥΤΗΣ, Χ. ΝΙΚΟΛΑΟΥ, Εισαγωγή στον Αντικειμενοστραφή Προγραμματισμό με Python
Εάν εισάγετε μια έκφραση στο διερμηνευτή, αυτός την υπολογίζει και δείχνει το αποτέλεσμα. Εικόνα 3.1 Υπολογισμός εκφράσεων Δε χρειάζεται μια έκφραση να περιέχει ταυτόχρονα και τιμές και μεταβλητές και τελεστές. Μια τιμή, όπως και μια μεταβλητή, από μόνες τους αποτελούν εκφράσεις. Στην Εικόνα 3.2 αυτό που πρέπει να προσέξουμε είναι ότι στη μεταβλητή x θα πρέπει να έχει ανατεθεί νωρίτερα κάποια τιμή. Εικόνα 3.2 Τιμές και μεταβλητές ως εκφράσεις Στην Εικόνα 3.3 παρατηρούμε τη διαφορά μεταξύ του υπολογισμού μιας έκφρασης και της εκτύπωσής της. Αρχικοποιούμε, λοιπόν, μια μεταβλητή που τυχαίνει να είναι συμβολοσειρά (ομάδα χαρακτήρων), και μετά ζητούμε από το διερμηνευτή της Python την τιμή της, οπότε τυπώνει τη συμβολοσειρά με τα εισαγωγικά. Είναι, επομένως, διαφορετικό να τυπώνει κανείς στην έξοδο κάτι, από το να ρωτάει τον interpreter της Python, τον IDLE, για την τιμή αυτής της μεταβλητής. Η τιμή μιας μεταβλητής που είναι τύπου συμβολοσειράς πρέπει να έχει και τα εισαγωγικά. Είναι ακόμη σημαντικό να τονίσουμε ότι δεν παράγουν οι εντολές έξοδο, εκτός από την εντολή εκτύπωσης. 28 I Κ. ΜΑΓΚΟΥΤΗΣ, Χ. ΝΙΚΟΛΑΟΥ, Εισαγωγή στον Αντικειμενοστραφή Προγραμματισμό με Python
Εικόνα 3.3 Υπολογισμός έκφρασης και η εκτύπωσή της Σε ένα σενάριο (script), μια έκφραση είναι από μόνη της μια νόμιμη εντολή, αλλά δεν παράγει έξοδο (Εικόνα 3.4). Για να παραχθεί έξοδος χρησιμοποιούμε την εντολή print. Εικόνα 3.4 Έκφραση ως μέρος ενός script 3.2 Τελεστές Μια ομάδα σημαντικών τελεστών παρουσιάζονται στην Εικόνα 3.5. Το * σημαίνει πολλαπλασιασμός, τα ** είναι ύψωση σε δύναμη (δείτε π.χ. το 5**2 ή 5 2 στην Εικόνα 3.6). Στη διαίρεση, όταν ο διαιρετέος και ο διαιρέτης είναι ακέραιοι, το αποτέλεσμα είναι επίσης ακέραιος, στρογγυλοποιημένος προς τον πλησιέστερο (προς τα κάτω) ακέραιο. Γι αυτό το 59/60 βγάζει 0, επειδή το ακέραιο μέρος του 59/60 είναι 0. Αυτό δε βοηθάει στην περίπτωση που θα θέλαμε να έχουμε κάποια δεκαδικά ψηφία. Θα μπορούσαμε να τους μετατρέψουμε σε πραγματικούς, αλλά μια άλλη 29 I Κ. ΜΑΓΚΟΥΤΗΣ, Χ. ΝΙΚΟΛΑΟΥ, Εισαγωγή στον Αντικειμενοστραφή Προγραμματισμό με Python
εναλλακτική λύση την οποία θα μπορούσαμε να επιλέξουμε είναι να πολλαπλασιάσουμε επί 100 ή επί τόσες δυνάμεις του 10, όσα είναι και τα δεκαδικά ψηφία που θέλουμε να βγάλουμε. + Πρόσθεση αριθμών ή αλληλουχία συμβολοσειρών. - Αφαίρεση ενός αριθμού από έναν άλλο. * Γινόμενο δύο αριθμών ή επανάληψη μιας συμβολοσειράς τόσε φορές. ** Ύψωση αριθμού σε δύναμη. / Διαίρεση δύο αριθμών. // Διαίρεση δύο αριθμών στρογγυλοποιημένη προς τα κάτω (floor division). % Υπόλοιπο διαίρεσης δύο αριθμών. Εικόνα 3.5 Τελεστές 30 I Κ. ΜΑΓΚΟΥΤΗΣ, Χ. ΝΙΚΟΛΑΟΥ, Εισαγωγή στον Αντικειμενοστραφή Προγραμματισμό με Python
Στην Εικόνα 3.6 παρουσιάζονται παραδείγματα πράξεων με αριθμούς. Εικόνα 3.6 Παραδείγματα πράξεων με αριθμούς. Όταν μια μεταβλητή εμφανίζεται σε έκφραση, αντικαθίσταται από την τιμή της πριν υπολογιστεί η έκφραση (Εικόνα 3.7). Εικόνα 3.7 Υπολογισμός έκφρασης με μεταβλητή Κάποια παραδείγματα εκφράσεων είναι τα εξής: 12+24*hour-6 hour*60+minute minute/60 6**3 (6+9)*(31-7) Ένα άλλο σημαντικό θέμα έχει να κάνει με την προτεραιότητα με την οποία εφαρμόζονται οι τελεστές. Όταν έχουμε μια έκφραση, με τι σειρά υπολογίζει η Python την έκφραση; Αρχικά υπολογίζει τα εντός παρενθέσεων ευρισκόμενα, ξεκινώντας από τις εσωτερικότερες παρενθέσεις και κλείνοντας προς τις εξωτερικότερες παρεν- 31 I Κ. ΜΑΓΚΟΥΤΗΣ, Χ. ΝΙΚΟΛΑΟΥ, Εισαγωγή στον Αντικειμενοστραφή Προγραμματισμό με Python
θέσεις. Στο πρώτο παράδειγμα της Εικόνας 3.8, πρώτα θα υπολογίσει το 3-1 και μετά θα πολλαπλασιάσει επί 2. Στη συνέχεια, πρώτα θα υπολογίσει το 2+1 και το 5-2, και μετά θα γίνει η ύψωση στη δύναμη. Οι παρενθέσεις είναι ένας τρόπος να επηρεάσουμε τη σειρά με την οποία υπολογίζονται οι εκφράσεις. Αν στο παράδειγμα minute*100/60, θέλουμε πρώτα να κάνει τη διαίρεση και μετά τον πολλαπλασιασμό, πρέπει να πούμε minute*(100/60), ώστε να επιτευχθεί αυτό. Μετά τις παρενθέσεις, αυτό που έχει αμέσως προτεραιότητα είναι η ύψωση σε δύναμη. Γι αυτό και στην Εικόνα 3.8, η Python στην έκφραση 2+1**5-2 υπολογίζει πρώτα την τιμή της πράξης 1**5 και μετά τις υπόλοιπες. Οι κανόνες είναι χρήσιμοι και για να καταλαβαίνουμε τι γίνεται. Όπου δεν είμαστε σίγουροι ή δε θυμόμαστε τι ισχύει, είναι καλό να βάζουμε παρενθέσεις για να μην μπερδευόμαστε. Εικόνα 3.8 Προτεραιότητα τελεστών Το ακρωνύμιο PEMDAS (Purplemath, 2015) μας βοηθάει να θυμόμαστε τους κανόνες προτεραιότητας. Οι παρενθέσεις (Parenthesis) έχουν τη μεγαλύτερη προτεραιότητα και χρησιμοποιούνται για να αναγκάσουν την Python να υπολογίσει μια έκφραση σύμφωνα με τη σειρά που θέλουμε. Εκφράσεις σε παρενθέσεις υπολογίζονται πρώτες. Παρενθέσεις χρησιμοποιούνται, επίσης, για να κάνουν τις εκφράσεις πιο αναγνώσιμες, χωρίς να αλλάζουν το αποτέλεσμα. Η ύψωση σε δύναμη (Exponentiation) όπως προείπαμε, έχει την επόμενη μεγαλύτερη προτεραιότητα (Εικόνα 3.9). 32 I Κ. ΜΑΓΚΟΥΤΗΣ, Χ. ΝΙΚΟΛΑΟΥ, Εισαγωγή στον Αντικειμενοστραφή Προγραμματισμό με Python
Εικόνα 3.9 Ύψωση σε δύναμη Πολλαπλασιασμός (Multiplication) και διαίρεση (Division) έχουν την ίδια προτεραιότητα, που είναι μεγαλύτερη από την πρόσθεση (Addition) και την αφαίρεση (Subtraction) οι οποίες έχουν, επίσης, την ίδια προτεραιότητα (Εικόνα 3.10). Τελεστές με την ίδια προτεραιότητα υπολογίζονται από τα αριστερά προς τα δεξιά. Εικόνα 3.10 Προτεραιότητα τελεστών Είδαμε, προηγουμένως, ότι μπορούμε να κάνουμε πράξεις με ακέραιους αριθμούς. Μπορούμε, επίσης, να κάνουμε και κάποιες πράξεις στις ομάδες χαρακτήρων, ωστόσο όχι όλες τις πράξεις. Για παράδειγμα, τα παρακάτω δεν είναι σωστά (υποθέτοντας ότι η μεταβλητή message είναι τύπου string): message-1 Hello /2 Hello / H message* Hello 15 +2 Ωστόσο, ο τελεστής + έχει νόημα για συμβολοσειρές. Δημιουργεί μια αλληλουχία (concatenation) συμβολοσειρών, δηλαδή, συνδέει τους δύο «προσθετέους» φτιάχνοντας νέα συμβολοσειρά, όπου η αρχή της δεύτερης βρίσκεται μετά το τέλος της πρώτης (Εικόνα 3.11). Εικόνα 3.11 Χρήση τελεστή + για συμβολοσειρές 33 I Κ. ΜΑΓΚΟΥΤΗΣ, Χ. ΝΙΚΟΛΑΟΥ, Εισαγωγή στον Αντικειμενοστραφή Προγραμματισμό με Python
Επιπλέον ο τελεστής * έχει νόημα στις συμβολοσειρές, εκτελεί επανάληψη (Εικόνα 3.12). Εικόνα 3.12 Χρήση τελεστή * για συμβολοσειρές Ο ένας από τους πολλαπλασιαστέους πρέπει να είναι συμβολοσειρά και ο άλλος ακέραιος. Υπάρχουν ομοιότητες και διαφορές με τις αντίστοιχες πράξεις της αριθμητικής. Όπως το 3*4 είναι ισοδύναμο με το 4+4+4, έτσι και το 3* Hello είναι ισοδύναμο με το Hello + Hello + Hello. Στην Python υπάρχει η δυνατότητα σύνθεσης μεταβλητών, εκφράσεων και εντολών (Εικόνα 3.13). Μπορούμε να τυπώνουμε όχι μόνο τιμές, όχι μόνο μεταβλητές, αλλά και εκφράσεις. Στην Εικόνα 3.13 βλέπετε μια έκφραση αριθμητική, ενώ από κάτω έχουμε έκφραση με ομάδες χαρακτήρων. Εικόνα 3.13 Σύνθεση μεταβλητών, εκφράσεων και εντολών 3.3 Σχόλια Οι γλώσσες προγραμματισμού συμπυκνώνουν νοήματα, γι αυτό και είναι δύσκολο να τις διαβάσει κανείς, να καταλάβει τι θέλει να επιτελέσει ένα κομμάτι κώδικα και 34 I Κ. ΜΑΓΚΟΥΤΗΣ, Χ. ΝΙΚΟΛΑΟΥ, Εισαγωγή στον Αντικειμενοστραφή Προγραμματισμό με Python
γιατί. Γι αυτό και χρειάζεται να προσθέτουμε σχόλια στα προγράμματα που γράφουμε. Τα σχόλια στην Python αρχίζουν πάντα με το χαρακτήρα # (Εικόνα 3.14). Οτιδήποτε ακολουθεί μετά το # αγνοείται από την Python μέχρι το τέλος της γραμμής. Εικόνα 3.14 Σχόλια στην Python Τέλος, ας δούμε πώς αναγνωρίζει ο interpreter πού τελειώνει το σχόλιο και πού αρχίζει η επόμενη εκτελέσιμη γραμμή. Η απάντηση είναι ένας ειδικός χαρακτήρας ο οποίος εισέρχεται, όταν διαβάζει αυτά που του δίνουμε από την κονσόλα (console ή command line) ή στο αρχείο που γράφουμε. Υπάρχει πάντα ένας ειδικός χαρακτήρας που χαρακτηρίζει το τέλος γραμμής και ότι μετά από αυτό αλλάζει η γραμμή. Άρα, όταν ο διερμηνευτής δει αυτόν τον ειδικό χαρακτήρα (ο οποίος δεν τυπώνεται), καταλαβαίνει ότι τέλειωσε το σχόλιό μας, βλέποντας το τέλος γραμμής. Καθώς, λοιπόν, διαβάζει σειρά-σειρά το πρόγραμμα, βλέπει τον ειδικό χαρακτήρα ο οποίος δηλώνει το τέλος της γραμμής. 3.4 Επίλογος 35 I Κ. ΜΑΓΚΟΥΤΗΣ, Χ. ΝΙΚΟΛΑΟΥ, Εισαγωγή στον Αντικειμενοστραφή Προγραμματισμό με Python
Σε αυτό το κεφάλαιο κάναμε μια εισαγωγή στις έννοιες των εκφράσεων, των τελεστών και της προτεραιότητάς τους, και των σχολίων του προγραμματιστή μέσα σε ένα πρόγραμμα Python. Στο επόμενο κεφάλαιο θα μελετήσουμε την έννοια της συνάρτησης και της εκτέλεσης υπό συνθήκη. Βιβλιογραφία/Αναφορές Purplemath. (2015). The Order of Operations: PEMDAS. Retrieved from http://www. purplemath.com/modules/orderops.htm Κριτήρια αξιολόγησης Κριτήριο αξιολόγησης 1 (Βαθμός δυσκολίας: ) Υπολογίστε το αποτέλεσμα της εξής έκφρασης: print 3 + 2 + 1-5 + 4 % 2-1 / 8 + 4 Κριτήριο αξιολόγησης 2 (Βαθμός δυσκολίας: ) Ποια θα είναι η τιμή της μεταβλητής c στο εξής παράδειγμα; a=50 b=15 36 I Κ. ΜΑΓΚΟΥΤΗΣ, Χ. ΝΙΚΟΛΑΟΥ, Εισαγωγή στον Αντικειμενοστραφή Προγραμματισμό με Python
c=0 c=a&b print c 37 I Κ. ΜΑΓΚΟΥΤΗΣ, Χ. ΝΙΚΟΛΑΟΥ, Εισαγωγή στον Αντικειμενοστραφή Προγραμματισμό με Python
Κριτήριο αξιολόγησης 3 (Βαθμός δυσκολίας: ) Η εκτέλεση του συγκεκριμένου κώδικα, τι θα έχει ως αποτέλεσμα; Κριτήριο αξιολόγησης 4 (Βαθμός δυσκολίας: ) Μπορείτε να σκεφτείτε μια ιδιότητα που έχει η πρόσθεση (addition) αριθμών, ενώ η αλληλουχία (concatenation) συμβολοσειρών δεν την έχει; 38 I Κ. ΜΑΓΚΟΥΤΗΣ, Χ. ΝΙΚΟΛΑΟΥ, Εισαγωγή στον Αντικειμενοστραφή Προγραμματισμό με Python