Περισσότερα
Έχει η Python έναν τεταρτοβάθμιο τελεστή υπό συνθήκη;
Αν η Python δεν έχει έναν τελεστικό τελεστή υπό συνθήκη, είναι δυνατόν να προσομοιωθεί ένας τελεστικός τελεστής χρησιμοποιώντας άλλες γλωσσικές δομές;
5549
3
Ναι, [προστέθηκε][1] στην έκδοση 2.5. Η σύνταξη της έκφρασης είναι:
Πρώτα αξιολογείται η
condition
, στη συνέχεια αξιολογείται και επιστρέφεται ακριβώς ένα από ταa
ήb
με βάση την [Boolean][4] τιμή τηςcondition
. Εάν ηcondition
αξιολογείται ωςTrue
, τότε τοa
αξιολογείται και επιστρέφεται αλλά τοb
αγνοείται, ή αλλιώς όταν τοb
αξιολογείται και επιστρέφεται αλλά τοa
αγνοείται.Αυτό επιτρέπει το βραχυκύκλωμα, επειδή όταν η
condition
είναι αληθής μόνο τοa
αξιολογείται και τοb
δεν αξιολογείται καθόλου, αλλά όταν ηcondition
είναι ψευδής μόνο τοb
αξιολογείται και τοa
δεν αξιολογείται καθόλου.Για παράδειγμα:
Σημειώστε ότι οι όροι είναι μια έκφραση, όχι μια δήλωση. Αυτό σημαίνει ότι δεν μπορείτε να χρησιμοποιήσετε δηλώσεις ανάθεσης ή
pass
ή άλλες δηλώσεις μέσα σε μια υπό συνθήκη έκφραση:Μπορείτε, ωστόσο, να χρησιμοποιήσετε εκφράσεις υπό συνθήκη για να αναθέσετε μια μεταβλητή, όπως παρακάτω:
Σκεφτείτε την έκφραση υπό συνθήκη ως εναλλαγή μεταξύ δύο τιμών. Είναι πολύ χρήσιμη όταν βρίσκεστε σε μια κατάσταση 'η μία τιμή ή η άλλη', αλλά δεν κάνει και πολλά άλλα.
Αν πρέπει να χρησιμοποιήσετε δηλώσεις, πρέπει να χρησιμοποιήσετε μια κανονική
if
δήλωση αντί για μια υπό συνθήκη έκφραση.Λάβετε υπόψη ότι αυτό'είναι αποδοκιμασμένο από μερικούς Pythonistas για διάφορους λόγους:
condition ? a : b
από πολλές άλλες γλώσσες (όπως C, C++, Go, Perl, Ruby, Java, Javascript, κ.λπ.), γεγονός που μπορεί να οδηγήσει σε σφάλματα όταν άνθρωποι που δεν είναι εξοικειωμένοι με την "εκπληκτική" συμπεριφορά της Python'τον χρησιμοποιούν (μπορεί να αντιστρέψουν τη σειρά των επιχειρημάτων).if
' μπορεί να είναι πραγματικά χρήσιμο, και να κάνει το σενάριό σας πιο συνοπτικό, περιπλέκει πραγματικά τον κώδικά σας)Αν'δυσκολεύεστε να θυμηθείτε τη σειρά, τότε θυμηθείτε ότι όταν διαβάζετε δυνατά, λέτε (σχεδόν) αυτό που εννοείτε. Για παράδειγμα,
x = 4 αν b > 8 αλλιώς 9
διαβάζεται δυνατά ωςx θα είναι 4 αν το b είναι μεγαλύτερο από 8 αλλιώς 9
.Επίσημη τεκμηρίωση:
[Conditional expressions][2]
[Υπάρχει ισοδύναμος τελεστής του τριμερούς τελεστή ";:" της C;][3]
[1]: https://mail.python.org/pipermail/python-dev/2005-September/056846.html "[Python-Dev] Conditional Expression Resolution", [2]: https://docs.python.org/3/reference/expressions.html#conditional-expressions "Εκφράσεις υπό όρους", [3]: https://docs.python.org/3.3/faq/programming.html#is-there-an-equivalent-of-c-s-ternary-operator "Υπάρχει ισοδύναμος τελεστής του τεταρτοβάθμιου τελεστή ";:" της C; ", [4]: https://en.wikipedia.org/wiki/Boolean_data_type "Boolean data type",
Για τις εκδόσεις πριν από την έκδοση 2.5, υπάρχει το κόλπο:
Μπορεί να δώσει λανθασμένα αποτελέσματα όταν το
on_true
έχει ψευδή τιμή boolean.1Από [την τεκμηρίωση]:
Νέα από την έκδοση 2.5.
[the documentation]: https://docs.python.org/3/reference/expressions.html#conditional-expressions "Conditional expressions", [PEP 308]: https://www.python.org/dev/peps/pep-0308/ "PEP 308 -- Εκφράσεις υπό όρους",