Ένας τελεστής σύγκρισης στην Python (ονομάζεται επίσης τελεστής σχέσης), εξετάζει τις τιμές δύο τελεστέων και επιστρέφει μια Boolean τιμή True ή False, ανάλογα με το αν πληρούται ή όχι η συνθήκη comparison.
Ο παρακάτω πίνακας δείχνει τους πιο συνηθισμένους τελεστές σύγκρισης της Python:
| Τελεστής | Πράξη | Περιγραφή |
|---|---|---|
> |
"μεγαλύτερο από" |
a > b είναι True αν το a είναι αυστηρά μεγαλύτερο σε τιμή από το b
|
< |
"μικρότερο από" |
a < b είναι True αν το a είναι αυστηρά μικρότερο σε τιμή από το b
|
== |
"ίσο με" |
a == b είναι True αν το a είναι αυστηρά ίσο σε τιμή με το b
|
>= |
"μεγαλύτερο από ή ίσο με" |
a >= b είναι True αν a > b Ή a == b σε τιμή |
<= |
"μικρότερο από ή ίσο με" |
a <= b είναι True αν a < b ή a == b σε τιμή |
!= |
"όχι ίσο με" |
a != b είναι True αν το a == b είναι False
|
is |
"ταυτότητα" |
a is b είναι True αν και μόνο αν τα a και b είναι το ίδιο αντικείμενο
|
is not |
"αρνημένη ταυτότητα" |
a is not b είναι True αν και μόνο αν τα a και b δεν είναι το ίδιο αντικείμενο
|
in |
"έλεγχος περιεκτικότητας" |
a in b είναι True αν το a είναι μέλος, υποσύνολο ή στοιχείο του b
|
not in |
"αρνημένος έλεγχος περιεκτικότητας" |
a not in b είναι True αν το a δεν είναι μέλος, υποσύνολο ή στοιχείο του b
|
Όλοι έχουν την ίδια προτεραιότητα (η οποία είναι υψηλότερη από αυτή των πράξεων Boolean, αλλά χαμηλότερη από αυτή των αριθμητικών ή των πράξεων bit).
Τα αντικείμενα που έχουν διαφορετικούς τύπους (εκτός από τους αριθμητικούς τύπους) δεν συγκρίνονται ποτέ ως ίσα από προεπιλογή.
Μη ταυτόσημα στιγμιότυπα μιας class επίσης δεν θα συγκρίνονται ως ίσα, εκτός αν η class ορίζει ειδικές μεθόδους πλούσιας σύγκρισης που προσαρμόζουν την προεπιλεγμένη συμπεριφορά σύγκρισης του object.
Για (πολύ) περισσότερες λεπτομέρειες, δες τις Συγκρίσεις τιμών στην τεκμηρίωση της Python.
Οι αριθμητικοί τύποι αποτελούν (ως επί το πλείστον) εξαίρεση σε αυτόν τον κανόνα αντιστοίχισης τύπων.
Ένας integer μπορεί να θεωρηθεί ίσος με έναν float (ή ένας octal ίσος με έναν hexadecimal), αρκεί οι τύποι να μπορούν να μετατραπούν έμμεσα για τη σύγκριση.
Για τους άλλους αριθμητικούς τύπους (μιγαδικοί αριθμοί, δεκαδικοί αριθμοί, κλάσματα), οι τελεστές σύγκρισης ορίζονται εκεί που "έχουν νόημα" (όπου η έμμεση μετατροπή δεν αλλάζει το αποτέλεσμα), αλλά πετούν ένα TypeError αν τα υποκείμενα αντικείμενα δεν μπορούν να μετατραπούν με ακρίβεια για τη σύγκριση.
Για περισσότερες πληροφορίες σχετικά με τους κανόνες που χρησιμοποιεί η Python για την αριθμητική μετατροπή, δες τις αριθμητικές μετατροπές στην τεκμηρίωση της Python.
>>> import fractions
# A string cannot be converted to an int.
>>> 17 == '17'
False
# An int can be converted to float for comparison.
>>> 17 == 17.0
True
# The fraction 6/3 can be converted to the int 2
# The int 2 can be converted to 0b10 in binary.
>>> 6/3 == 0b10
True
# An int can be converted to a complex
# number with a 0 imaginary part.
>>> 17 == complex(17)
True
# The fraction 2/5 can be converted to the float 0.4
>>> 0.4 == 2/5
True
>>> complex(2/5, 1/2) == complex(0.4, 0.5)
True
Οποιαδήποτε διάταξη σύγκρισης ενός αριθμού με τύπο NaN (όχι αριθμός) είναι False.
Μια μπερδεμένη παρενέργεια του ορισμού του NaN στην Python είναι ότι το NaN δεν συγκρίνεται ποτέ ως ίσο με το NaN.
Αν είσαι περίεργος γιατί το NaN ορίστηκε έτσι στην Python, αυτή η ανάρτηση στο Stack Overflow για το NaN σχετικά με τη θέσπιση του διεθνούς προτύπου είναι μια ενδιαφέρουσα ανάγνωση.
>>> x = float('NaN')
>>> 3 < x
False
>>> x < 3
False
# NaN never compares equal to NaN
>>> x == x
False
Οι συμβολοσειρές (str) συγκρίνονται λεξικογραφικά, χρησιμοποιώντας τα επιμέρους σημεία κώδικα Unicode (το αποτέλεσμα της πέρασης κάθε σημείου κώδικα του str στην ενσωματωμένη συνάρτηση ord(), η οποία επιστρέφει ένα int).
Αν όλα τα σημεία κώδικα και στις δύο συμβολοσειρές ταιριάζουν και βρίσκονται στην ίδια σειρά, οι δύο συμβολοσειρές θεωρούνται ίσες.
Αυτή η σύγκριση γίνεται κατά ζεύγη: πρώτο με πρώτο, δεύτερο με δεύτερο κ.ο.κ.
Στην Python 3.x, τα str και bytes δεν μπορούν να εξαναγκαστούν/συγκριθούν άμεσα.
>>> 'Python' > 'Rust'
False
>>> 'Python' > 'JavaScript'
True
# Examples with Mandarin.
# hello < goodbye
>>> '你好' < '再见'
True
# ord() of first characters
>>> ord('你'), ord('再')
(20320, 20877)
# ord() of second characters
>>> ord('好'), ord('见')
(22909, 35265)
# And with Korean words.
# Pretty < beautiful.
>>> '예쁜' < '아름다운'
False
>>> ord('예'), ord('아')
(50696, 50500)
Οι τύποι δεδομένων περιεκτών (lists, tuples, sets, dicts κ.λπ.) συγκρίνονται επίσης λεξικογραφικά: είναι ίσοι αν και οι δύο περιέκτες έχουν τα ίδια δεδομένα και τους ίδιους τύπους δεδομένων (στην περίπτωση των lists και tuples, πρέπει επίσης να έχουν την ίδια σειρά), διαφορετικά είναι άνισοι.
>>> [1, 2] == [1, 2]
True
# But if the data is not in the same order, they are not equal.
>>> [2, 1] == [1, 2]
False
# The same holds true for tuples
>>> (3,4,5) == (5,4,3)
False
# Length is also compared
>>> [1, 2] < [1, 2, 3]
True
# Comparing dicts
>>> {'name': 'John', 'age': 19} == {'name': 'John', 'age': 18}
False
>>> {'name': 'John', 'age': 19} == {'name': 'John', 'age': 19}
True
Οι τελεστές σύγκρισης μπορούν να αλυσιδωθούν αυθαίρετα.
Σημείωσε ότι η αξιολόγηση μιας έκφρασης γίνεται από τα left προς τα right.
Για παράδειγμα, το x < y <= z είναι ισοδύναμο με το x < y and y <= z, με τη διαφορά ότι το y αξιολογείται μόνο μία φορά.
Και στις δύο περιπτώσεις, το z δεν αξιολογείται καθόλου όταν το x < y βρεθεί ότι είναι False.
Αυτό συχνά ονομάζεται short-circuit evaluation: η αξιολόγηση σταματά αν η τιμή αλήθειας της έκφρασης έχει ήδη προσδιοριστεί.
Το Short circuiting υποστηρίζεται από διάφορους Boolean τελεστές, συναρτήσεις, αλλά και από τις αλυσιδωτές συγκρίσεις στην Python.
Σε αντίθεση με πολλές άλλες γλώσσες προγραμματισμού, όπως οι C, C++, C# και Java, οι αλυσιδωτές εκφράσεις όπως a < b < c στην Python έχουν μια συμβατική μαθηματική ερμηνεία και προτεραιότητα.
>>> x = 2
>>> y = 5
>>> z = 10
>>> x < y < z
True
>>> x < y > z
False
>>> x > y < z
False
Οι τελεστές is και is not ελέγχουν την ταυτότητα ενός αντικειμένου, σε αντίθεση με την τιμή του.
Η ταυτότητα ενός αντικειμένου δεν αλλάζει ποτέ μετά τη δημιουργία του και μπορεί να βρεθεί χρησιμοποιώντας τη συνάρτηση id().
Το <apple> is <orange> αποτιμάται σε True αν και μόνο αν id(<apple>) == id(<orange>).
Το <apple> is not <orange> δίνει το αντίστροφο.
Επειδή το None και το NotImplemented είναι μοναδικά στιγμιότυπα, θα πρέπει πάντα να συγκρίνονται με άλλα στοιχεία χρησιμοποιώντας τα is και is not.
Δες την τεκμηρίωση αναφοράς της Python για τις συγκρίσεις τιμών και το PEP8 για περισσότερες λεπτομέρειες σχετικά με αυτή τη σύμβαση.
# A list of favorite numbers.
>>> my_fav_numbers = [1, 2, 3]
>>> your_fav_numbers = my_fav_numbers
>>> my_fav_numbers is your_fav_numbers
True
# The returned id will differ by system and Python version.
>>> id(my_fav_numbers)
4517478208
# your_fav_numbers is only an alias pointing to the original my_fav_numbers object.
# Assigning a new name does not create a new object.
>>> id(your_fav_numbers)
4517478208
>>> my_fav_numbers is not your_fav_numbers
False
>>> my_fav_numbers is not None
True
>>> my_fav_numbers is NotImplemented
False
Οι τελεστές in και not in ελέγχουν τη συμμετοχή.
Το <fish> in <soup> αποτιμάται σε True αν το <fish> είναι μέλος του <soup> (αν το <fish> είναι υποσύνολο του <soup> ή περιέχεται σε αυτό), και αποτιμάται σε False διαφορετικά.
Το <fish> not in <soup> επιστρέφει την άρνηση, ή το αντίθετο του <fish> in <soup>.
Για τους τύπους συμβολοσειράς και bytes, το <name> in <fullname> είναι True αν και μόνο αν το <name> είναι υποσυμβολοσειρά του <fullname>.
# A set of lucky numbers.
>>> lucky_numbers = {11, 22, 33}
>>> 22 in lucky_numbers
True
>>> 44 in lucky_numbers
False
# A dictionary of employee information.
>>> employee = {'name': 'John Doe', 'id': 67826, 'age': 33, 'title': 'ceo'}
# Checking for the membership of certain keys.
>>> 'age' in employee
True
>>> 33 in employee
False
>>> 'lastname' not in employee
True
# Checking for substring membership
>>> name = 'Super Batman'
>>> 'Bat' in name
True
>>> 'Batwoman' in name
False
Η συμπεριφορά σύγκρισης των αντικειμένων μπορεί να προσαρμοστεί μέσω της υλοποίησης rich comparison methods.
Για περισσότερες πληροφορίες, δες τον Οδηγό Python: κλάσεις, το Python Classes and Magic Methods (Dan Bader) και τα Ειδικά ονόματα μεθόδων.