Έχει η Python έναν τεταρτοβάθμιο τελεστή υπό συνθήκη;

Αν η 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 "", 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'τον χρησιμοποιούν (μπορεί να αντιστρέψουν τη σειρά των επιχειρημάτων).
  • Κάποιοι το βρίσκουν "δυσκίνητο", αφού έρχεται σε αντίθεση με τη φυσιολογική ροή της σκέψης (να σκεφτόμαστε πρώτα τη συνθήκη και μετά τα αποτελέσματα).
  • Στυλιστικοί λόγοι. (Αν και το 'inline if' μπορεί να είναι πραγματικά χρήσιμο, και να κάνει το σενάριό σας πιο συνοπτικό, περιπλέκει πραγματικά τον κώδικά σας)

Αν'δυσκολεύεστε να θυμηθείτε τη σειρά, τότε θυμηθείτε ότι όταν διαβάζετε δυνατά, λέτε (σχεδόν) αυτό που εννοείτε. Για παράδειγμα, x = 4 αν b > 8 αλλιώς 9 διαβάζεται δυνατά ως x θα είναι 4 αν το b είναι μεγαλύτερο από 8 αλλιώς 9.

Επίσημη τεκμηρίωση:

Σχόλια (10)

Για τις εκδόσεις πριν από την έκδοση 2.5, υπάρχει το κόλπο:

[expression] and [on_true] or [on_false]

Μπορεί να δώσει λανθασμένα αποτελέσματα όταν το on_true έχει ψευδή τιμή boolean.1

Σχόλια (4)

Από [την τεκμηρίωση]:

Οι εκφράσεις υπό όρους (μερικές φορές αποκαλούνται "τριμερής τελεστής") έχουν τη χαμηλότερη προτεραιότητα από όλες τις λειτουργίες της Python. &gt, Η έκφραση x if C else y αξιολογεί πρώτα τη συνθήκη, C (not x)- αν C είναι αληθής, x αξιολογείται και επιστρέφεται η τιμή του- διαφορετικά, y αξιολογείται και επιστρέφεται η τιμή του. &gt, Ανατρέξτε στο [PEP 308] για περισσότερες λεπτομέρειες σχετικά με τις εκφράσεις υπό συνθήκη.

Νέα από την έκδοση 2.5.

[the documentation]: https://docs.python.org/3/reference/expressions.html#conditional-expressions "Conditional expressions&quot, [PEP 308]: https://www.python.org/dev/peps/pep-0308/ "PEP 308 -- Εκφράσεις υπό όρους&quot,

Σχόλια (0)