Αν η Python δεν έχει έναν τελεστικό τελεστή υπό συνθήκη, είναι δυνατόν να προσομοιωθεί ένας τελεστικός τελεστής χρησιμοποιώντας άλλες γλωσσικές δομές;
Ναι, [προστέθηκε][1] στην έκδοση 2.5. Η σύνταξη της έκφρασης είναι:
a if condition else b
Πρώτα αξιολογείται η condition
, στη συνέχεια αξιολογείται και επιστρέφεται ακριβώς ένα από τα a
ή b
με βάση την [Boolean][4] τιμή της condition
. Εάν η condition
αξιολογείται ως True
, τότε το a
αξιολογείται και επιστρέφεται αλλά το b
αγνοείται, ή αλλιώς όταν το b
αξιολογείται και επιστρέφεται αλλά το a
αγνοείται.
Αυτό επιτρέπει το βραχυκύκλωμα, επειδή όταν η condition
είναι αληθής μόνο το a
αξιολογείται και το b
δεν αξιολογείται καθόλου, αλλά όταν η condition
είναι ψευδής μόνο το b
αξιολογείται και το a
δεν αξιολογείται καθόλου.
Για παράδειγμα:
>>> 'true' if True else 'false'
'true'
>>> 'true' if False else 'false'
'false'
Σημειώστε ότι οι όροι είναι μια έκφραση, όχι μια δήλωση. Αυτό σημαίνει ότι δεν μπορείτε να χρησιμοποιήσετε δηλώσεις ανάθεσης ή pass
ή άλλες δηλώσεις μέσα σε μια υπό συνθήκη έκφραση:
>>> pass if False else x = 3
File "<stdin>", line 1
pass if False else x = 3
^
SyntaxError: invalid syntax
Μπορείτε, ωστόσο, να χρησιμοποιήσετε εκφράσεις υπό συνθήκη για να αναθέσετε μια μεταβλητή, όπως παρακάτω:
x = a if True else b
Σκεφτείτε την έκφραση υπό συνθήκη ως εναλλαγή μεταξύ δύο τιμών. Είναι πολύ χρήσιμη όταν βρίσκεστε σε μια κατάσταση 'η μία τιμή ή η άλλη', αλλά δεν κάνει και πολλά άλλα.
Αν πρέπει να χρησιμοποιήσετε δηλώσεις, πρέπει να χρησιμοποιήσετε μια κανονική 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, υπάρχει το κόλπο:
[expression] and [on_true] or [on_false]
Μπορεί να δώσει λανθασμένα αποτελέσματα όταν το on_true
έχει ψευδή τιμή boolean.1</sup>,
Αν και έχει το πλεονέκτημα ότι αξιολογεί τις εκφράσεις από αριστερά προς τα δεξιά, πράγμα που είναι πιο ξεκάθαρο κατά τη γνώμη μου.
1. Υπάρχει ισοδύναμος τελεστής του τριμερούς τελεστή ";:" της C;</sub>,
Από [την τεκμηρίωση]:
Οι εκφράσεις υπό όρους (μερικές φορές αποκαλούνται "τριμερής τελεστής") έχουν τη χαμηλότερη προτεραιότητα από όλες τις λειτουργίες της Python. >, Η έκφραση
x if C else y
αξιολογεί πρώτα τη συνθήκη, C (not x)- αν C είναι αληθής, x αξιολογείται και επιστρέφεται η τιμή του- διαφορετικά, y αξιολογείται και επιστρέφεται η τιμή του. >, Ανατρέξτε στο [PEP 308] για περισσότερες λεπτομέρειες σχετικά με τις εκφράσεις υπό συνθήκη.
Νέα από την έκδοση 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 -- Εκφράσεις υπό όρους",