Σε αυτό το σεμινάριο, θα μάθετε πώς η προτεραιότητα και η συσχέτιση των χειριστών επηρεάζουν τη σειρά των λειτουργιών στο Python.
Προτεραιότητα των χειριστών Python
Ο συνδυασμός τιμών, μεταβλητών, τελεστών και λειτουργιών ονομάζεται έκφραση. Ο διερμηνέας Python μπορεί να αξιολογήσει μια έγκυρη έκφραση.
Για παράδειγμα:
>>> 5 - 7 -2
Εδώ 5 - 7
είναι μια έκφραση. Μπορεί να υπάρχουν περισσότεροι από ένας τελεστές σε μια έκφραση.
Για την αξιολόγηση αυτών των τύπων εκφράσεων υπάρχει ένας κανόνας προτεραιότητας στο Python. Καθοδηγεί τη σειρά με την οποία εκτελούνται αυτές οι εργασίες.
Για παράδειγμα, ο πολλαπλασιασμός έχει μεγαλύτερη προτεραιότητα από την αφαίρεση.
# Multiplication has higher precedence # than subtraction >>> 10 - 4 * 2 2
Αλλά μπορούμε να αλλάξουμε αυτήν τη σειρά χρησιμοποιώντας παρενθέσεις ()
καθώς έχει μεγαλύτερη προτεραιότητα από τον πολλαπλασιασμό.
# Parentheses () has higher precedence >>> (10 - 4) * 2 12
Η προτεραιότητα του χειριστή στο Python παρατίθεται στον παρακάτω πίνακα. Είναι σε φθίνουσα σειρά (η ανώτερη ομάδα έχει μεγαλύτερη προτεραιότητα από τις χαμηλότερες).
Χειριστές | Εννοια |
---|---|
() | Παρενθέσεις |
** | Εκθέτης |
+x , -x ,~x | Unary plus, Unary μείον, Bitwise ΟΧΙ |
* , / , // ,% | Πολλαπλασιασμός, διαίρεση, διαίρεση δαπέδου, συντελεστής |
+ , - | Προσθήκη, αφαίρεση |
<< , >> | Τελεστές μετατόπισης bitwise |
& | Bitwise ΚΑΙ |
^ | Bitwise XOR |
| | Bitwise Ή |
== , != , > , >= , < , <= , is , is not , in ,not in | Συγκρίσεις, ταυτότητα, τελεστές ιδιότητας μέλους |
not | Λογικά ΟΧΙ |
and | Λογική ΚΑΙ |
or | Λογική Ή |
Ας δούμε μερικά παραδείγματα:
Ας υποθέσουμε ότι κατασκευάζουμε ένα if… else
μπλοκ που λειτουργεί if
όταν το μεσημεριανό γεύμα είναι είτε φρούτο είτε σάντουιτς και μόνο εάν τα χρήματα είναι περισσότερα από ή ίσα με 2.
# Precedence of or & and meal = "fruit" money = 0 if meal == "fruit" or meal == "sandwich" and money>= 2: print("Lunch being delivered") else: print("Can't deliver lunch")
Παραγωγή
Παράδοση γεύματος
Αυτό το πρόγραμμα λειτουργεί if
μπλοκ ακόμα και όταν τα χρήματα είναι 0. Δεν μας δίνει την επιθυμητή έξοδο, δεδομένου ότι η προτεραιότητα and
είναι υψηλότερη από or
.
Μπορούμε να πάρουμε την επιθυμητή έξοδο χρησιμοποιώντας παρένθεση ()
με τον ακόλουθο τρόπο:
# Precedence of or & and meal = "fruit" money = 0 if (meal == "fruit" or meal == "sandwich") and money>= 2: print("Lunch being delivered") else: print("Can't deliver lunch")
Παραγωγή
Δεν είναι δυνατή η παράδοση μεσημεριανού γεύματος
Συνεργασία των χειριστών Python
Μπορούμε να δούμε στον παραπάνω πίνακα ότι υπάρχουν περισσότεροι από ένας χειριστές στην ίδια ομάδα. Αυτοί οι χειριστές έχουν την ίδια προτεραιότητα.
Όταν δύο χειριστές έχουν την ίδια προτεραιότητα, η συνάφεια βοηθά στον προσδιορισμό της σειράς των λειτουργιών.
Η συσχέτιση είναι η σειρά στην οποία αξιολογείται μια έκφραση που έχει πολλούς τελεστές της ίδιας προτεραιότητας. Σχεδόν όλοι οι χειριστές έχουν σχέση αριστερά προς δεξιά.
Για παράδειγμα, ο πολλαπλασιασμός και η διαίρεση δαπέδου έχουν την ίδια προτεραιότητα. Ως εκ τούτου, εάν και οι δύο είναι παρόντες σε μια έκφραση, η αριστερή αξιολογείται πρώτα.
# Left-right associativity # Output: 3 print(5 * 2 // 3) # Shows left-right associativity # Output: 0 print(5 * (2 // 3))
Παραγωγή
3 0
Σημείωση : Ο εκθεσιακός χειριστής **
έχει σχέση από αριστερά προς τα αριστερά στο Python
# Shows the right-left associativity of ** # Output: 512, Since 2**(3**2) = 2**9 print(2 ** 3 ** 2) # If 2 needs to be exponated fisrt, need to use () # Output: 64 print((2 ** 3) ** 2)
Μπορούμε να δούμε ότι 2 ** 3 ** 2
ισοδυναμεί με 2 ** (3 ** 2)
.
Μη συνεργαζόμενοι χειριστές
Ορισμένοι τελεστές όπως οι χειριστές ανάθεσης και οι χειριστές σύγκρισης δεν έχουν συσχετισμό στο Python. Υπάρχουν ξεχωριστοί κανόνες για ακολουθίες αυτού του είδους του τελεστή και δεν μπορούν να εκφραστούν ως συσχετισμός.
Για παράδειγμα, x < y < z
ούτε σημαίνει (x < y) < z
ούτε x < (y < z)
. x < y < z
είναι ισοδύναμο με x < y and y < z
, και αξιολογείται από αριστερά προς δεξιά.
Επιπλέον, ενώ η αλυσίδα αναθέσεων όπως x = y = z = 1
είναι απολύτως έγκυρη, x = y = z+= 2
θα οδηγήσει σε σφάλμα.
# Initialize x, y, z x = y = z = 1 # Expression is invalid # (Non-associative operators) # SyntaxError: invalid syntax x = y = z+= 2
Παραγωγή
Αρχείο "", γραμμή 8 x = y = z + = 2 Σύνταξη Σφάλμα: μη έγκυρη σύνταξη