Γράφοντας δηλώσεις if σε μία γραμμή με τον τεταρτοβάθμιο τελεστή της Python (τελεστής υπό συνθήκη)

Επιχείρηση

Η Python έχει ένα στυλ γραφής που ονομάζεται τριμερής τελεστής (τελεστές υπό συνθήκη) που μπορεί να περιγράψει μια διαδικασία όπως μια δήλωση if σε μια μόνο γραμμή.

Τα παρακάτω εξηγούνται εδώ, μαζί με δείγμα κώδικα.

  • Βασική γραφή τριαδικών τελεστών
  • if ... elif ... else ...Περιγράψτε το σε μια γραμμή
  • Συνδυαστική λίστα Πλήρης συμβολισμός και τριαδικοί τελεστές
  • Συνδυασμός ανώνυμων συναρτήσεων (lambda expressions) και τριμερών τελεστών

Δείτε το ακόλουθο άρθρο για περισσότερες πληροφορίες σχετικά με την κανονική δήλωση if.

Βασική γραφή τριαδικών τελεστών

Στην Python, ο τελεστής ternary μπορεί να γραφτεί ως εξής

Expression evaluated when the conditional expression is true if conditional expression else Expression evaluated when the conditional expression is false

Αν θέλετε να αλλάζετε τιμές ανάλογα με τις συνθήκες, απλά γράψτε κάθε τιμή ως έχει.

Value to return if conditional expression is true if conditional expression else Value to return if conditional expression is false
a = 1
result = 'even' if a % 2 == 0 else 'odd'
print(result)
# odd

a = 2
result = 'even' if a % 2 == 0 else 'odd'
print(result)
# even

Αν θέλετε να αλλάζετε την επεξεργασία ανάλογα με τις συνθήκες, περιγράψτε κάθε έκφραση.

a = 1
result = a * 2 if a % 2 == 0 else a * 3
print(result)
# 3

a = 2
result = a * 2 if a % 2 == 0 else a * 3
print(result)
# 4

Οι εκφράσεις που δεν επιστρέφουν τιμή (εκφράσεις που επιστρέφουν None) είναι επίσης αποδεκτές. Ανάλογα με τη συνθήκη, αξιολογείται μία από τις εκφράσεις και εκτελείται η διαδικασία.

a = 1
print('even') if a % 2 == 0 else print('odd')
# odd

Ισοδυναμεί με τον ακόλουθο κώδικα που γράφτηκε με μια κανονική εντολή if.

a = 1

if a % 2 == 0:
    print('even')
else:
    print('odd')
# odd

Πολλαπλές εκφράσεις υπό όρους μπορούν επίσης να συνδεθούν μεταξύ τους χρησιμοποιώντας λογικούς τελεστές (και, ή, κ.λπ.).

a = -2
result = 'negative and even' if a < 0 and a % 2 == 0 else 'positive or odd'
print(result)
# negative and even

a = -1
result = 'negative and even' if a < 0 and a % 2 == 0 else 'positive or odd'
print(result)
# positive or odd

if ... elif ... else ...Περιγραφή μιας γραμμής

if ... elif ... else ...Δεν υπάρχει ειδικός τρόπος για να το γράψετε αυτό σε μία μόνο γραμμή. Ωστόσο, μπορεί να υλοποιηθεί με τη χρήση ενός άλλου τελεστικού τελεστή στην έκφραση που αξιολογείται όταν η υπό συνθήκη έκφραση του τελεστικού τελεστή είναι ψευδής. Εικόνα φωλιασμού τριαδικών τελεστών.

Ωστόσο, ίσως είναι καλύτερο να μην το χρησιμοποιείτε εκτενώς, διότι μειώνει την αναγνωσιμότητα.

a = 2
result = 'negative' if a < 0 else 'positive' if a > 0 else 'zero'
print(result)
# positive

a = 0
result = 'negative' if a < 0 else 'positive' if a > 0 else 'zero'
print(result)
# zero

a = -2
result = 'negative' if a < 0 else 'positive' if a > 0 else 'zero'
print(result)
# negative

Η ακόλουθη υπό συνθήκη έκφραση μπορεί να ερμηνευθεί με τους ακόλουθους δύο τρόπους, αλλά αντιμετωπίζεται ως ο πρώτος (1).

A if condition 1 else B if condition 2 else C
1. A if condition 1 else ( B if condition 2 else C )
2. ( A if condition 1 else B ) if condition 2 else C 

Ένα συγκεκριμένο παράδειγμα έχει ως εξής. Η πρώτη έκφραση θεωρείται σαν να ήταν η δεύτερη.

a = -2
result = 'negative' if a < 0 else 'positive' if a > 0 else 'zero'
print(result)
# negative

result = 'negative' if a < 0 else ('positive' if a > 0 else 'zero')
print(result)
# negative

result = ('negative' if a < 0 else 'positive') if a > 0 else 'zero'
print(result)
# zero

Συνδυαστική λίστα Πλήρης συμβολισμός και τριαδικοί τελεστές

Μια χρήσιμη χρήση του τριμερούς τελεστή είναι όταν επεξεργάζεστε λίστες σε συμβολισμό κατανόησης λίστας.

Συνδυάζοντας τον τριμερή τελεστή και τον συμβολισμό κατανόησης λίστας, είναι δυνατή η αντικατάσταση στοιχείων μιας λίστας ή η εκτέλεση κάποιας άλλης επεξεργασίας ανάλογα με τις συνθήκες.

l = ['even' if i % 2 == 0 else i for i in range(10)]
print(l)
# ['even', 1, 'even', 3, 'even', 5, 'even', 7, 'even', 9]
l = [i * 10 if i % 2 == 0 else i for i in range(10)]
print(l)
# [0, 1, 20, 3, 40, 5, 60, 7, 80, 9]

Για περισσότερες πληροφορίες σχετικά με τη σημειογραφία κατανόησης λίστας, ανατρέξτε στο ακόλουθο άρθρο.

Συνδυασμός ανώνυμων συναρτήσεων (lambda expressions) και τριμερών τελεστών

Ο τριμερής τελεστής, ο οποίος μπορεί να περιγραφεί συνοπτικά ακόμη και σε μια ανώνυμη συνάρτηση (έκφραση λάμδα), είναι χρήσιμος.

get_odd_even = lambda x: 'even' if x % 2 == 0 else 'odd'

print(get_odd_even(1))
# odd

print(get_odd_even(2))
# even

Σημειώστε ότι, αν και δεν σχετίζεται με τον τελεστικό τελεστή, το παραπάνω παράδειγμα εκχωρεί ένα όνομα στην έκφραση lambda. Ως εκ τούτου, εργαλεία αυτόματου ελέγχου, όπως η σύμβαση κωδικοποίησης PEP8 της Python, ενδέχεται να δημιουργήσουν μια Προειδοποίηση.

Αυτό οφείλεται στο γεγονός ότι η PEP8 συνιστά τη χρήση της def κατά την ανάθεση ονομάτων σε συναρτήσεις.

Η έννοια του PEP8 έχει ως εξής

  • Οι εκφράσεις Lambda χρησιμοποιούνται για να περάσουν αντικείμενα που μπορούν να κληθούν ως ορίσματα, για παράδειγμα, χωρίς να τους δοθεί όνομα
  • Σε εκφράσεις λάμδα, χρησιμοποιήστε def για να ορίσετε με όνομα