python in - Python ha un operatore condizionale ternario?




12 Answers

Sì, è stato added nella versione 2.5.
La sintassi è:

a if condition else b

Viene valutata la prima condition , quindi a o b viene restituito in base al valore Boolean della condition
Se la condition restituisce True, viene restituito, altrimenti viene restituito b .

Per esempio:

>>> 'true' if True else 'false'
'true'
>>> 'true' if False else 'false'
'false'

Nota che i condizionali sono un'espressione , non un'affermazione . Ciò significa che non è possibile utilizzare assegnazioni o pass o altre dichiarazioni in modo condizionale:

>>> pass if False else x = 3
  File "<stdin>", line 1
    pass if False else x = 3
          ^
SyntaxError: invalid syntax

In tal caso, devi usare una normale istruzione if invece di una condizionale.

Tieni presente che è sfigurato da alcuni Pythonistas per diversi motivi:

  • L'ordine degli argomenti è diverso da molti altri linguaggi (come C, Ruby, Java, ecc.), Che possono portare a bug quando le persone che non hanno familiarità con il comportamento "sorprendente" di Python lo usano (potrebbero invertire l'ordine).
  • Alcuni lo trovano "ingombrante", poiché va contro il normale flusso del pensiero (pensando prima alla condizione e poi agli effetti).
  • Ragioni stilistiche

Se hai difficoltà a ricordare l'ordine, ricorda che se lo leggi ad alta voce, dici (quasi) cosa intendi. Ad esempio, x = 4 if b > 8 else 9 viene letto ad alta voce come x will be 4 if b is greater than 8 otherwise 9 .

Documentazione ufficiale:

ternary conditional

Se Python non ha un operatore condizionale ternario, è possibile simularne uno utilizzando altri costrutti linguistici?




Per le versioni precedenti alla 2.5, c'è il trucco:

[expression] and [on_true] or [on_false]

Può dare risultati errati quando on_true ha un falso valore booleano. 1
Anche se ha il vantaggio di valutare le espressioni da sinistra a destra, il che è più chiaro a mio avviso.

1. Esiste un equivalente di C "?:" Operatore ternario?




Dalla documentazione :

Le espressioni condizionali (a volte chiamate "operatori ternari") hanno la priorità più bassa di tutte le operazioni Python.

L'espressione x if C else y prima valuta la condizione, C ( non x ); se C è vero, x viene valutato e viene restituito il suo valore; altrimenti, y viene valutato e viene restituito il suo valore.

Vedi PEP 308 per maggiori dettagli sulle espressioni condizionali.

Novità dalla versione 2.5.




@su:

Sfortunatamente, il

(falseValue, trueValue)[test]

la soluzione non ha un comportamento di cortocircuito; quindi sia falseValue che trueValue vengono valutati indipendentemente dalla condizione. Questo potrebbe essere subottimale o addirittura buggato (cioè sia trueValue che falseValue potrebbero essere metodi e avere effetti collaterali).

Una soluzione a questo sarebbe

(lambda: falseValue, lambda: trueValue)[test]()

(l'esecuzione è ritardata fino a quando il vincitore non è noto;)), ma introduce un'incoerenza tra oggetti chiamabili e non richiamabili. Inoltre, non risolve il caso quando si utilizzano le proprietà.

E così la trama va - scegliere tra 3 soluzioni menzionate è un compromesso tra avere la caratteristica di cortocircuito, usare almeno python 2.5 (IMHO non è più un problema) e non essere incline a "trueValue-evaluation-to-false" errori.




Operatore ternario in diversi linguaggi di programmazione

Qui cerco solo di mostrare alcune importanti differenze nell'operatore ternary operator tra un paio di linguaggi di programmazione.

Operatore ternario in Javascript

var a = true ? 1 : 0;
# 1
var b = false ? 1 : 0;
# 0

Operatore ternario in Ruby

a = true ? 1 : 0
# 1
b = false ? 1 : 0
# 0

Operatore ternario in Scala

val a = true ? 1 | 0
# 1
val b = false ? 1 | 0
# 0

Operatore ternario nella programmazione R

a <- if (TRUE) 1 else 0
# 1
b <- if (FALSE) 1 else 0
# 0

Operatore ternario in Python

a = 1 if True else 0
# 1
b = 1 if False else 0
# 0

Ora puoi vedere la bellezza del linguaggio Python. è altamente leggibile e mantenibile.




Assolutamente, ed è incredibilmente facile da capire.

general syntax : first_expression if bool_expression_is_true else second_expression

Example: x= 3 if 3 > 2 else 4 
# assigns 3 to x if the boolean expression evaluates to true or 4 if it is false



Simulazione dell'operatore ternario di Python.

Per esempio

a, b, x, y = 1, 2, 'a greather than b', 'b greater than a'
result = (lambda:y, lambda:x)[a > b]()

produzione:

'b greater than a'



L'operatore condizionale ternario consente semplicemente di testare una condizione in una singola riga sostituendo la multilinea if-else rendendo il codice compatto.

Sintassi:

[on_true] if [expression] else [on_false]

1- Metodo semplice per utilizzare l'operatore ternario:

# Program to demonstrate conditional operator
a, b = 10, 20
# Copy value of a in min if a < b else copy b
min = a if a < b else b
print(min)  # Output: 10

2- Metodo diretto di utilizzo di tuple, dizionario e lambda:

# Python program to demonstrate ternary operator
a, b = 10, 20
# Use tuple for selecting an item
print( (b, a) [a < b] )
# Use Dictionary for selecting an item
print({True: a, False: b} [a < b])
# lamda is more efficient than above two methods
# because in lambda  we are assure that
# only one expression will be evaluated unlike in
# tuple and Dictionary
print((lambda: b, lambda: a)[a < b]()) # in output you should see three 10

3- L'operatore Ternario può essere scritto come nidificato se-else:

# Python program to demonstrate nested ternary operator
a, b = 10, 20
print ("Both a and b are equal" if a == b else "a is greater than b"
        if a > b else "b is greater than a")

L'approccio sopra può essere scritto come:

# Python program to demonstrate nested ternary operator
a, b = 10, 20
if a != b:
    if a > b:
        print("a is greater than b")
    else:
        print("b is greater than a")
else:
    print("Both a and b are equal") 
# Output: b is greater than a



Più un suggerimento che una risposta (non è necessario ripetere l'ovvio per il periodo di tempo), ma a volte lo uso come scorciatoia oneliner in questi costrutti:

if conditionX:
    print('yes')
else:
    print('nah')

, diventa:

print('yes') if conditionX else print('nah')

Alcuni (molti) potrebbero disapprovarlo come unpitonico (anche, rubino-ish :), ma personalmente lo trovo più naturale - cioè come lo si esprimerebbe normalmente, più un po 'più visivamente accattivante in grandi blocchi di codice.




Sì.

>>> b = (True if 5 > 4 else False)
>>> print b
True



Sì:

Diciamo che vuoi dare una variabile a qualche valore se qualche bool è vero e allo stesso modo

X = 5 se qualcos'altro x = 10

X = [qualche valore] se [se questo è vero il primo valore valuta] else [altro valore valuta]




Sintassi: l'operatore Ternario verrà indicato come:

[on_true] if [expression] else [on_false]

per esempio

x, y = 25, 50
big = x if x < y else y
print(big)



Related

python operators ternary-operator conditional-operator python-2.5