Τελεστές και εκφράσεις
Εισαγωγή
Οι περισσότερες εντολές που γράφετε θα περιέχουν εκφράσεις (expressions). Ένα απλό παράδειγμα μίας έκφρασης είναι 2 + 3
. Μία έκφραση μπορεί να διαχωριστεί σε τελεστές (operators) και τελεστέους (operands).
Οι τελεστές επιτελούν μία λειτουργία και μπορούν να αναπαρασταθούν με σύμβολα όπως το +
ή με ειδικές λέξεις - κλειδιά. Οι τελεστές απαιτούν κάποια δεδομένα πάνω στα οποία θα λειτουργήσουν και αυτά τα δεδομένα ονομάζονται τελεστέοι. Στη συγκεκριμένη περίπτωση, οι τελεστέοι είναι το 2
και το 3
.
Τελεστές
Θα ρίξουμε μία γρήγορη ματιά στους τελεστές και τη χρήση τους:
Σημειώστε ότι μπορείτε να βρείτε την τιμή των εκφράσεων που δίνονται στα παραδείγματα χρησιμοποιώντας το διερμηνευτή διαδραστικά. Για παράδειγμα, για τον έλεγχο της έκφρασης 2 + 3
, χρησιμοποιήστε την κονσόλα του διαδραστικού διερμηνευτή της Python:
>>> 2 + 3 5 >>> 3 * 5 15 >>>
Τελεστές και η χρήση τους | |||
---|---|---|---|
Τελεστής | Όνομα | Εξήγηση | Παραδείγματα |
+ | Συν | Προσθέτει δύο αντικείμενα. | Το 3 + 5 δίνει 8 . Το 'a' + 'b' δίνει 'ab' . |
- | Μείον | Είτε δίνει έναν αρνητικό αριθμό, ή αφαιρεί έναν αριθμό από έναν άλλο. | Το -5.2 δίνει έναν αρνητικό αριθμό. Το 50 - 24 δίνει 26 . |
* | Επί | Δίνει το γινόμενο δύο αριθμών ή μιά συμβολοσειρά (string) επαναλαμβανόμενη τόσες φορές. | Το 2 * 3 δίνει 6 . Το 'la' * 3 δίνει 'lalala' . |
** | Δύναμη | Επιστρέφει το x υψωμένο στη δύναμη y. | Το 3 ** 4 δίνει 81 (δηλαδή 3 * 3 * 3 * 3 ). |
/ | Διά | Διαιρεί το x με το y. | Το 4 / 3 δίνει 1.3333333333333333 . |
// | Διαίρεση στρογγυλοποιημένη προς τα κάτω (Floor Division) | Επιστρέφει τον κοντινότερο (προς τα κάτω) ακέραιο στο πηλίκο. | Το 4 // 3 δίνει 1 . |
% | Υπόλοιπο | Επιστρέφει το υπόλοιπο της διαίρεσης. | Το 8 % 3 δίνει 2 . Το -25.5 % 2.25 δίνει 1.5 . |
<< | Αριστερή μετάθεση | Μεταθέτει τα δυαδικά ψηφία (bits) του αριθμού προς τα αριστερά κατά το πλήθος των θέσεων που καθορίστηκε. (Κάθε αριθμός αναπαρίσταται στη μνήμη με δυαδικά ψηφία (bits, binary digits) -δηλαδή με 0 και 1). | To 2 << 2 δίνει 8 . Το 2 αναπαριστάται ως σε bits ως 10 . Η μετάθεση προς τα αριστερά κατά 2 bits μας δίνει 1000 που παριστάνει το δεκαδικό 8 . |
>> | Δεξιά μετάθεση | Μεταθέτει τα bits του αριθμού προς τα δεξιά κατά το πλήθος των θέσεων που καθορίστηκε. | To 11 >> 1 δίνει 5 . Το 11 αναπαριστάται σε bits ως 1011 που όταν μετατεθούν δεξιά κατά 1 bit μας δίνει 101 το οποίο είναι το δεκαδικό 5 . |
& | Δυαδικό ΚΑΙ | Δυαδικό ΚΑΙ των αριθμών. | Το 5 & 3 δίνει 1 . |
| | Δυαδικό Ή | Δυαδικό Ή των αριθμών. | Το 5 | 3 δίνει 7 . |
^ | Δυαδικό αποκλειστικό Ή | Δυαδικό αποκλειστικό Ή των αριθμών. | Το 5 ^ 3 δίνει 6 . |
~ | Δυαδική αντιστροφή | Το δυαδικό αντίστροφο του x είναι -(x+1). | Το ~5 δίνει -6 . |
< | Μικρότερο από | Επιστρέφει το αν το x είναι μικρότερο από το y. Όλοι οι τελεστές σύγκρισης επιστρέφουν True (Αληθής) ή False (Ψευδής). Σημειώστε οτι τα ονόματα αυτά ξεκινούν με κεφαλαίο. | Το 5 < 3 δίνει False και το 3 < 5 δίνει True . Οι συγκρίσεις μπορούν να συνδυαστούν αλυσιδωτά κατά βούληση: Το 3 < 5 < 7 δίνει True . |
> | Μεγαλύτερο από | Επιστρέφει το αν το x είναι μεγαλύτερο από το y. | Το 5 > 3 επιστρέφει True . Αν και οι δύο τελεστέοι είναι αριθμοί, πρώτα μετατρέπονται σε έναν κοινό τύπο. Αλλιώς, επιστρέφει πάντα False . |
<= | Μικρότερο ή ίσο | Επιστρέφει το αν το x είναι μικρότερο από ή ίσο με το y. | Το x = 3; y = 6; x <= y επιστρέφει True . |
>= | Μεγαλύτερο ή ίσο | Επιστρέφει το αν το x είναι μεγαλύτερο από ή ίσο με το y. | Το x = 4; y = 3; x >= 3 επιστρέφει True . |
== | Ίσο | Συγκρίνει αν τα αντικείμενα είναι ίσα. | Το x = 2; y = 2; x == y επιστέφει True .Το x = 'str'; y = 'stR'; x == y επιστρέφει False .Το x = 'str'; y = 'str'; x == y επιστρέφει True . |
!= | Διαφορετικό | Συγκρίνει αν τα αντικείμενα ΔΕΝ είναι ίσα. | Το x = 2; y = 3; x != y επιστρέφει True . |
not | Λογικό ΌΧΙ | Αν το x είναι True, επιστρέφει False. Αν το x είναι False, επιστρέφει True. | Το x = True; not x επιστρέφει False . |
and | Λογικό ΚΑΙ | Το x and y επιστρέφει False αν το x είναι False, αλλιώς επιστρέφει υπολογίζει και επιστρέφει την τιμή του y. | Το x = False; y = True; x and y επιστρέφει False αφού το x είναι False . Σε αυτή την περίπτωση, η Python δε θα ελέγξει την τιμή του y αφού γνωρίζει οτι η αριστερή πλευρά της έκφρασης and είναι False που υποδηλώνει οτι ολόκληρη η έκφραση θα είναι False ανεξάρτητα από τις άλλες τιμές. Αυτή η τεχνική αποκαλείται short-circuit evaluation. |
or | Λογικό Ή | Αν το x είναι True, επιστρέφει True, αλλιώς υπολογίζει και επιστρέφει την τιμή του y. | Το x = True; y = False; x or y επιστρέφει True . Η short-circuit evaluation εφαρμόζεται και εδώ. |
Συντόμευση για μαθηματικές πράξεις και την ανάθεση
Είναι συνήθες φαινόμενο η εκτέλεση μίας μαθηματικής πράξης στα περιεχόμενα μίας μεταβλητής και στη συνέχεια η ανάθεση του αποτελέσματος πίσω στη μεταβλητή, γι' αυτό υπάρχει μία συντόμευση για αυτού του είδους τις εκφράσεις:
Μπορείτε να γράψετε το:
a = 2; a = a * 3
ως:
a = 2; a *= 3
Παρατηρήστε ότι η δήλωση μεταβλητή = μεταβλητή τέλεστής έκφραση
γίνεται μεταβλητή τελεστής= έκφραση
.
Σειρά υπολογισμού (προτεραιότητα τελεστών)
Ας πούμε ότι έχουμε μία έκφραση όπως 2 + 3 * 4
. Ποιο γίνεται πρώτα, η πρόσθεση ή ο πολλαπλασιασμός; Τα μαθηματικά μας λένε ότι πρώτα πρέπει να γίνει ο πολλαπλασιασμός. Αυτό σημαίνει ότι ο τελεστής του πολλαπλασιασμού έχει υψηλότερη προτεραιότητα από τον τελεστή της πρόσθεσης.
Ο ακόλουθος πίνακας μας δίνει τον πίνακα προτεραιοτήτων για την Python, από τη χαμηλότερη προς την υψηλότερη προτεραιότητα. Αυτό σημαίνει ότι σε μία δεδομένη έκφραση, η Python θα υπολογίσει τους τελεστές και τις εκφράσεις που βρίσκονται χαμηλότερα στον πίνακα πριν από αυτούς που βρίσκονται ψηλότερα.
Ο παρακάτω πίνακας, αντιγραμμένος από το εγχειρίδιο αναφοράς της Python, παρέχεται χάριν πληρότητας. Είναι πολύ καλύτερο να χρησιμοποιείτε παρενθέσεις για να ομαδοποιείτε σωστά τελεστές και τελεστέους ώστε να ορίσετε ξεκάθαρα την προτεραιότητα. Έτσι το πρόγραμμα γίνεται πιο ευανάγνωστο. Δείτε την παράγραφο "Αλλαγή της σειράς υπολογισμού" πιο κάτω για λεπτομέρειες.
Προτεραιότητα τελεστών | |
---|---|
Τελεστής | Περιγραφή |
lambda | Έκφραση Lambda |
or | Λογικό Ή |
and | Λογικό ΚΑΙ |
not x | Λογικό ΟΧΙ |
in, not in | Έλεγχοι συμμετοχής |
is, is not | Έλεγχοι ταυτότητας |
<, <=, >, >=, !=, == | Συγκρίσεις |
| | Δυαδικό Ή |
^ | Δυαδικό αποκλειστικό Ή |
& | Δυαδικό ΚΑΙ |
<<, >> | Μεταθέσεις |
+, - | Πρόσθεση και αφαίρεση |
*, /, //, % | Πολλαπλασιασμός, Διαίρεση, Διαίρεση στρογγυλοποιημένη προς τα κάτω, Υπόλοιπο |
+x, -x | Θετικό, Αρνητικό |
~x | Δυαδικό ΟΧΙ |
** | Ύψωση σε δύναμη |
x.attribute | Αναφορά σε χαρακτηριστικό |
x[index] | Subscription |
x[index1:index2] | Κομμάτιασμα (Slicing) |
f(arguments ...) | Κλήση συνάρτησης |
(expressions, ...) | Συνένωση ή εμφάνιση πλειάδας |
[expressions, ...] | Προβολή λίστας |
{key:datum, ...} | Προβολή λεξικού |
Οι τελεστές τους οποίους δεν έχουμε ακόμη συναντήσει θα εξηγηθούν σε επόμενα κεφάλαια.
Τελεστές με την ίδια προτεραιότητα βρίσκονται στην ίδια γραμμή στον παραπάνω πίνακα. Για παράδειγμα, το +
και το -
έχουν την ίδια προτεραιότητα.
Αλλαγή της σειράς υπολογισμού
Για να κάνουμε τις εκφράσεις πιο ευανάγνωστες, μπορούμε να χρησιμοποιήσουμε παρενθέσεις. Για παράδειγμα, το 2 + (3 * 4)
είναι σίγουρα πιο εύκολο να το καταλάβουμε από το 2 + 3 * 4
το οποίο απαιτεί τη γνώση των προτεραιοτήτων των τελεστών. Όπως και όλα τα άλλα, οι παρενθέσεις θα πρέπει να χρησιμοποιούνται με σύνεση (μην το παρακάνετε) και να μην είναι άχρηστες (όπως π.χ. στο 2 + (3 + 4)
).
Υπάρχει ένα επιπλέον πλεονέκτημα στη χρήση παρενθέσεων - μας βοηθά να αλλάξουμε τη σειρά υπολογισμού. Για παράδειγμα, αν θέλετε να γίνει η πρόσθεση πριν τον πολλαπλασιασμό σε μία έκφραση, τότε μπορείτε να γράψετε κάτι όπως (2 + 3) * 4
.
Συσχέτιση (Associativity)
Οι τελεστές συνήθως συσχετίζονται από τα αριστερά προς τα δεξιά δηλαδή οι τελεστές με την ίδια προτεραιότητα υπολογίζονται από τα αριστερά προς τα δεξιά. Για παράδειγμα, το 2 + 3 + 4
υπολογίζεται ως (2 + 3) + 4
. Μερικοί τελεστές όπως οι τελεστές ανάθεσης έχουν συσχέτιση από τα δεξιά προς τα αριστερά δηλ. το a = b = c
αντιμετωπίζεται ως a = (b = c)
.
Εκφράσεις (Expressions)
Παράδειγμα:
#!/usr/bin/python # Filename: expression.py length = 5 breadth = 2 area = length * breadth print('Area is', area) print('Perimeter is', 2 * (length + breadth))
Έξοδος:
$ python expression.py Area is 10 Perimeter is 14
Πώς δουλεύει:
Το μήκος (length) και το πλάτος (breadth) του ορθογωνίου αποθηκεύονται σε μεταβλητές με το ίδιο όνομα. Χρησιμοποιούμε αυτές τις μεταβλητές για να υπολογίσουμε το εμβαδόν και την περίμετρο του ορθογωνίου με τη βοήθεια εκφράσεων. Αποθηκεύουμε το αποτέλεσμα της έκφρασης length * breadth
στη μεταβλητή (variable) area
και έπειτα το τυπώνουμε χρησιμοποιώντας τη συνάρτηση print
. Στη δεύτερη περίπτωση, χρησιμοποιούμε απ' ευθείας την τιμή της έκφρασης 2 * (length + breadth)
στη συνάρτηση print
.
Επίσης, παρατηρήστε τον τρόπο με τον οποίο η Python "τυπώνει όμορφα" τα αποτελέσματα. Παρ' όλο που δεν έχουμε καθορίσει ένα κενό ανάμεσα στο 'Area is'
και στη μεταβλητή area
, η Python το τοποθετεί για εμάς έτσι ώστε να πάρουμε μία πιο καθαρή όμορφη έξοδο και το πρόγραμμα είναι πολύ πιο ευανάγνωστο με αυτό τον τρόπο (αφού δε χρειάζεται να ανησυχούμε για τα κενά στις συμβολοσειρές που χρησιμοποιούμε για έξοδο). Αυτό είναι ένα παράδειγμα του πώς η Python κάνει τη ζωή του προγραμματιστή εύκολη.
Σύνοψη
Είδαμε πως χρησιμοποιούμε τους τελεστές, τους τελεστέους και τις εκφράσεις - αυτά αποτελούν τα βασικά δομικά στοιχεία κάθε προγράμματος. Στη συνέχεια, θα δούμε πώς τα χρησιμοποιούμε στα προγράμματά μας χρησιμοποιώντας εντολές.