21 Domanda: Python ha un operatore condizionale ternario?

domanda creata a Sat, Mar 23, 2019 12:00 AM

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

    
5269
  1. Anche se Python di età superiore a 2,5 stanno lentamente andando alla deriva, ecco un elenco di vecchi trucchi per operatori ternari pre-2.5: " Idiomi di Python ", cerca il testo" Espressione condizionale ". Wikipedia è anche abbastanza utile Ж: -)
    2011-05-26 00: 48: 06Z
  2. Nella documentazione ufficiale di Python 3.0 a cui si fa riferimento in un commento sopra, questo è indicato come "espressioni condizionali" ed è definito in modo molto enigmatico. Tale documentazione non include nemmeno il termine "ternario", quindi sarebbe difficile trovarlo tramite Google se non sapessi esattamente cosa cercare. La documentazione della versione 2 è un po 'più utile e include un link a "PEP 308" , che include molti interessanti riferimenti storici correlati a questa domanda.
    2013-01-10 05: 57: 30Z
  3. "ternary" (con tre input) è una proprietà consequenziale di questa impelmentazione, non una proprietà di definizione del concetto. ad esempio: SQL ha case [...] { when ... then ...} [ else ... ] end per un effetto simile ma non per niente ternario.
    2014-12-15 21: 14: 24Z
  4. anche ISO /IEC 9899 (lo standard del linguaggio di programmazione C) sezione 6.5.15 lo chiama "l'operatore condizionale"
    2014-12-15 21: 20: 22Z
  5. Wikipedia copre completamente l'articolo " ?: ".
    2016-06-09 08: 11: 03Z
21 risposte                              21                         

Sì, era aggiunta nella versione 2.5. La sintassi dell'espressione è:

 
a if condition else b

Il primo condition viene valutato, quindi uno dei a o b viene valutato e restituito in base a Valore booleano di condition. Se condition passa a True, viene valutato e restituito a ma b viene ignorato, oppure quando b viene valutato e restituito ma a viene ignorato.

Ciò consente cortocircuiti perché quando condition è vero viene valutato solo a e b non viene valutato affatto, ma quando condition è falso solo b viene valutato e a non viene valutato affatto.

Ad esempio:

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

Si noti che i condizionali sono un'espressione , non una istruzione . Ciò significa che non puoi utilizzare istruzioni di assegnazione o pass o altre istruzioni all'interno di un'espressione condizionale :

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

Tuttavia, puoi utilizzare le espressioni condizionali per assegnare una variabile in questo modo:

 
x = a if True else b

Pensa all'espressione condizionale come al passaggio tra due valori. È molto utile quando sei in una situazione "un valore o un altro", ma non fa molto altro.

Se devi utilizzare le istruzioni, devi utilizzare una normale istruzione if invece di un'espressione condizionale .


Tieni presente che alcuni Pythonistas lo disapprovano per diversi motivi:

  • L'ordine degli argomenti è diverso da quello del classico operatore ternario condition ? a : b da molti altri linguaggi (come C, C ++, Go, Perl, Ruby, Java, Javascript, ecc.),che può portare a bug quando le persone non hanno familiarità con il comportamento "sorprendente" di Python, lo usano (potrebbero invertire l'ordine degli argomenti).
  • Alcuni lo trovano "ingombrante", poiché va contro il normale flusso del pensiero (pensando prima alla condizione e poi agli effetti).
  • Ragioni stilistiche. (Sebbene il 'inline if' possa essere veramente utile, e rendere il tuo script più conciso, complica davvero il tuo codice)

Se hai difficoltà a ricordare l'ordine, ricorda che quando leggi ad alta voce, puoi (quasi) dire 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:

6227
2019-05-18 10: 26: 57Z
  1. L'ordine può sembrare strano per i programmatori, tuttavia f(x) = |x| = x if x > 0 else -x sembra molto naturale per i matematici. Puoi anche capirlo come A nella maggior parte dei casi, tranne quando C allora dovresti fare B invece ...
    2016-01-25 15: 07: 08Z
  2. Fai attenzione con l'ordine delle operazioni quando usi questo. Ad esempio, la riga z = 3 + x if x < y else y. Se x=2 e y=1, potresti aspettarti di ottenere 4, ma in realtà produrrebbe 1. z = 3 + (x if x > y else y) è l'uso corretto.
    2016-03-06 09: 23: 11Z
  3. Il punto era se si desidera eseguire ulteriori valutazioni dopo viene valutato il condizionale, come aggiungere un valore al risultato, o è necessario aggiungere l'espressione aggiuntiva su entrambi i lati (z = 3 + x if x < y else 3 + y) o raggruppare il condizionale (z = 3 + (x if x < y else y) o z = (x if x < y else y) + 3)
    2016-04-15 00: 36: 05Z
  4. cosa succede se ci sono più condizioni?
    2017-05-26 15: 31: 44Z
  5. @ MrGeek, capisco cosa intendi, quindi fondamentalmente stai annidando le operazioni: "" foo "se Bool else (" bar "se Bool else" foobar " ) `
    2017-08-11 00: 04: 32Z

Puoi indicizzare in una tupla:

 
(falseValue, trueValue)[test]

test deve restituire True o False .
Potrebbe essere più sicuro implementarlo sempre come:

 
(falseValue, trueValue)[test == True]

oppure puoi usare il title = "launch"> bool() ="https://docs.python.org/3/. a> per assicurare un valore booleano :

 
(falseValue, trueValue)[bool(<expression>)]
    
689
2015-10-17 07: 35: 10Z
  1. Si noti che questo valuta sempre tutto, mentre il costrutto if /else valuta solo l'espressione vincente.
    2011-02-04 02: 25: 24Z
  2. (lambda: print("a"), lambda: print("b"))[test==true]()
    2012-03-08 19: 31: 48Z
  3. Si noti che ciò che si trova all'interno dei [] s può essere un'espressione arbitraria. Inoltre, per sicurezza puoi testare esplicitamente la verità scrivendo [bool(<expression>)]. La funzione bool() è presente in tutto dalla v2.2.1.
    2012-05-31 18: 20: 15Z
  4. Questo è ottimo per il codice-golf, non tanto per il codice reale. Anche se mi sono così abituato che lo uso a volte per concisione quando faccio qualcosa di ovvio come scegliere tra due costanti di stringa.
    2014-12-05 17: 52: 12Z
  5. Ho fatto un trucco simile - solo una o due volte, ma l'ho fatto - indicizzando in un dizionario con True e False come chiavi: {True:trueValue, False:falseValue}[test] I don Non so se questo è meno efficiente, ma almeno evita l'intero dibattito "elegante" contro "brutto". Non c'è alcuna ambiguità che tu abbia a che fare con un booleano piuttosto che con un int.
    2016-03-01 18: 43: 37Z

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 valore booleano falso. 1 Anche se ha il vantaggio di valutare le espressioni da sinistra a destra, il che è più chiaro a mio parere.

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

    
289
2014-01-13 07: 16: 48Z
  1. Il rimedio è di usare (test e [true_value] o [false_value]) [0], che evita questa trappola.
    2009-10-21 15: 33: 59Z
  2. L'operatore ternario di solito esegue più velocemente (a volte del 10-25%).
    2014-01-13 07: 52: 08Z
  3. @ vulcano Hai qualche fonte per me?
    2014-08-05 12: 30: 33Z
  4. 2018-03-19 20: 59: 54Z

<expression 1> if <condition> else <expression 2>

 
a = 1
b = 2

1 if a > b else -1 
# Output is -1

1 if a > b else -1 if a < b else 0
# Output is -1
    
200
2019-05-15 15: 03: 41Z
  1. Qual è la differenza tra questa e la risposta in alto?
    2010-05-27 07: 59: 27Z
  2. Questo enfatizza l'intento primario dell'operatore ternario: selezione del valore. Mostra anche che più di un ternario può essere incatenato insieme in una singola espressione.
    2010-10-04 21: 14: 21Z
  3. @ Craig, sono d'accordo, ma è anche utile sapere cosa accadrà quando non ci sono parentesi. Nel codice reale, anch'io tenderei a inserire espliciti parens.
    2014-12-01 21: 30: 51Z
  4. In qualche modo, sono in grado di capirlo meglio della risposta top.
    2018-03-23 ​​05: 46: 05Z

Da la 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 ulteriori dettagli sulle espressioni condizionali.

Nuovo dalla versione 2.5.

    
125
2015-10-17 07: 43: 53Z

Un operatore per un'espressione condizionale in Python è stato aggiunto nel 2006 come parte di Python Enhancement Proposta 308 . La sua forma differisce dall'operatore ?: comune ed è:

 
<expression1> if <condition> else <expression2>

che è equivalente a:

 
if <condition>: <expression1> else: <expression2>

Ecco un esempio:

 
result = x if a > b else y

Un'altra sintassi che può essere utilizzata (compatibile con le versioni precedenti alla 2.5):

 
result = (lambda:y, lambda:x)[a > b]()

dove gli operandi sono valutati pigramente .

Un altro modo è indicizzare una tupla (che non è coerente con l'operatore condizionale della maggior parte delle altre lingue):

 
result = (y, x)[a > b]

o dizionario esplicitamente costruito:

 
result = {True: x, False: y}[a > b]

Un altro (meno affidabile), ma il metodo più semplice è utilizzare gli operatori and e or:

 
result = (a > b) and x or y

tuttavia questo non funzionerà se x sarebbe False.

Una possibile soluzione è quella di creare liste o tuple x e y come segue:

 
result = ((a > b) and [x] or [y])[0]

o

 
result = ((a > b) and (x,) or (y,))[0]

Se stai lavorando con i dizionari, invece di usare un condizionale ternario, puoi sfruttare get(key, default) , ad esempio:

 
shell = os.environ.get('SHELL', "/bin/sh")

Fonte: ?: in Python su Wikipedia

    
95
2017-08-07 14: 22: 32Z
  1. result = {1: x, 0: y}[a > b] è un'altra variante possibile (True e False sono in realtà numeri interi con valori 1 e 0)
    2019-02-09 18: 07: 40Z

Sfortunatamente,

 
(falseValue, trueValue)[test]
la soluzione

non ha un comportamento di cortocircuito; pertanto, sia falseValue che trueValue vengono valutati indipendentemente dalla condizione. Questo potrebbe essere non ottimale o addirittura infestato (vale a dire che entrambi i trueValue e falseValue potrebbero essere metodi e avere effetti collaterali).

Una soluzione a questo sarebbe

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

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

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

    
86
2019-05-09 09: 45: 33Z
  1. Mentre la tupla del trucco di lambda funziona, impiega all'incirca 3 volte l'operatore ternario. È probabile che sia un'idea ragionevole se può sostituire una lunga catena di if else if.
    2018-10-11 17: 34: 51Z

Operatore ternario in diverse lingue di programmazione

Qui cerco solo di mostrare alcune importanti differenze in 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
    
56
2019-01-26 14: 05: 18Z
  1. 2017-02-15 23: 08: 50Z
  2. Ruby funziona anche con a = true ? 1 : 0
    2017-05-15 17: 50: 10Z
  3. "Ora puoi vedere la bellezza del linguaggio Python, è altamente leggibile e mantenibile." Non vedo la rilevanza di questa frase, né come la sintassi dell'operatore ternario lo dimostra.
    2017-12-08 15: 38: 17Z
  4. Può sembrare supponente; ma quello che essenzialmente dice è che la sintassi di Python può essere compresa da una persona che non ha mai visto un operatore ternario, mentre pochissime persone capiranno la sintassi più comune a meno che non sia stato informato prima di ciò che significa.
    2018-01-10 17: 12: 28Z
  5. Algol68: a = .if. .vero. .poi. 1. 0 .fi. Questo può essere espresso anche a = (. True. | 1 | 0) Come al solito Algol68 è un miglioramento rispetto ai suoi successori.
    2018-06-17 12: 55: 29Z

Per Python 2.5 e versioni successive esiste una sintassi specifica:

 
[on_true] if [cond] else [on_false]

Nei vecchi Python un operatore ternario non è implementato ma è possibile simularlo.

 
cond and on_true or on_false

Tuttavia, esiste un potenziale problema, che se cond valuta True e on_true valuta False, viene restituito on_false anziché on_true. Se vuoi questo comportamento, il metodo è OK, altrimenti usa questo:

 
{True: on_true, False: on_false}[cond is True] # is True, not == True

che può essere racchiuso da:

 
def q(cond, on_true, on_false)
    return {True: on_true, False: on_false}[cond is True]

e usato in questo modo:

 
q(cond, on_true, on_false)

È compatibile con tutte le versioni di Python.

    
55
2012-04-25 12: 02: 06Z
  1. Il comportamento non è identico - q("blob", on_true, on_false) restituisce on_false, mentre on_true if cond else on_false restituisce on_true. Una soluzione alternativa è sostituire cond con cond is not None in questi casi, anche se non è una soluzione perfetta.
    2012-09-26 09: 09: 29Z
  2. Perché non bool(cond) invece di cond is True? Il primo controlla la veridicità del cond, quest'ultimo controlla l'uguaglianza del puntatore con l'oggetto True. Come evidenziato da @AndrewCecil, "blob" è veritiero ma è is not True.
    2013-11-11 16: 11: 06Z
  3. Wow, sembra davvero hacky! :) Tecnicamente, puoi anche scrivere [on_false, on_True][cond is True] in modo che l'espressione diventi più corta.
    2014-02-24 11: 51: 08Z
  4. Non c'è cortocircuito in questa risposta. Se on_true e on_false sono costosi da chiamare, questa è una brutta risposta.
    2019-03-28 14: 08: 20Z

Potresti trovare spesso

 
cond and on_true or on_false

ma questo porta a un problema quando on_true == 0

 
>>> x = 0
>>> print x == 0 and 0 or 1 
1
>>> x = 1
>>> print x == 0 and 0 or 1 
1

dove ti aspetteresti per un normale operatore ternario questo risultato

 
>>> x = 0
>>> print 0 if x == 0 else 1 
0
>>> x = 1
>>> print 0 if x == 0 else 1 
1
    
35
2013-01-14 15: 56: 09Z
  

Python ha un operatore condizionale ternario?

Sì. Dal file di grammatica :

 
test: or_test ['if' or_test 'else' test] | lambdef

La parte di interesse è:

 
or_test ['if' or_test 'else' test]

Quindi, un'operazione condizionale ternaria ha la forma:

 
expression1 if expression2 else expression3

expression3 sarà valutato pigramente (cioè valutato solo iof expression2 è falso in un contesto booleano). E a causa della definizione ricorsiva, puoi incatenarli indefinitamente (anche se potrebbe essere considerato uno stile negativo).

 
expression1 if expression2 else expression3 if expression4 else expression5 # and so on

Una nota sull'utilizzo:

Nota che ogni if deve essere seguito con un else. Le persone che imparano le comprensioni delle liste e le espressioni generatrici possono trovare che questa sia una lezione difficile da imparare - il seguente non funzionerà, dato che Python si aspetta una terza espressione per un altro:

 
[expression1 if expression2 for element in iterable]
#                          ^-- need an else here

che genera un SyntaxError: invalid syntax. Quindi quanto sopra è una parte di logica incompleta (forse l'utente si aspetta un no-op nella falsa condizione) o quello che può essere inteso è usare expression2 come filtro - nota che il seguente è legale Python:

 
[expression1 for element in iterable if expression2]

expression2 funziona come filtro per la comprensione delle liste ed è non un operatore condizionale ternario.

Sintassi alternativa per un caso più stretto:

Potresti trovare un po 'doloroso scrivere quanto segue:

 
expression1 if expression1 else expression2

expression1 dovrà essere valutato due volte con l'uso di cui sopra. Può limitare la ridondanza se è semplicemente una variabile locale. Tuttavia, un idioma Pythonic comune e performante per questo caso d'uso è usare il comportamento di shortcut del or:

 
expression1 or expression2

che è equivalente in semantica. Nota che alcune guide di stile possono limitare questo utilizzo per motivi di chiarezza: esso racchiude molto significato in pochissima sintassi.

    
28
2016-08-08 18: 56: 31Z
  1. expression1 or expression2 è simile e ha gli stessi svantaggi /positivi di expression1 || expression2 in javascript
    2016-02-18 13: 05: 59Z
  2. Grazie, @selurvedu - può essere fonte di confusione fino a quando non viene chiarito. Ho imparato nel modo più duro, quindi la tua strada potrebbe non essere così difficile. ;) Usando se senza il resto, alla fine di un'espressione di un generatore o di una list comprehension filtrerà l'iterabile. Nella parte anteriore, è un'operazione condizionale ternaria e richiede il resto. Evviva !!
    2016-05-27 04: 37: 39Z
  3. @ AaronHall Sebbene l'uso del metasintatico expressionN per tutte le istanze sia coerente, potrebbe essere più facile capire con la denominazione che distingue l'espressione di test condizionale dalle due espressioni di risultato; ad es. result1 if condition else result2. Ciò è particolarmente evidente durante la nidificazione (aka concatenamento): result1 if condition1 else result2 if condition2 else result3. Vedi quanto meglio si legge in questo modo?
    2019-01-26 14: 12: 47Z
  4. @ tchrist grazie per la recensione - se si guarda alla cronologia delle revisioni, questo post ha attualmente due revisioni. La maggior parte delle mie altre risposte, specialmente le migliori, sono state riviste di nuovo e di nuovo. Questa risposta non attira la mia attenzione perché lo stato della wiki della wiki non mi dà credito per il contenuto, quindi non vedo mai voti. Dato che in questo momento non ho davvero tempo per una modifica, la rana sa quando tornerà alla mia attenzione in futuro. Vedo che hai modificato la risposta principale, quindi sentiti libero di prendere in prestito /citare il mio materiale da questo post in quello (e citami se a proposito!)
    2019-01-26 18: 24: 21Z

Simulazione dell'operatore ternario Python.

Ad esempio

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

uscita:

 
'b greater than a'
    
17
2013-11-20 10: 44: 12Z
  1. Perché non semplicemente result = (y, x)[a < b] Perché usi la funzione lambda ?
    2013-12-27 05: 50: 06Z
  2. @ GrijeshChauhan Perché su espressioni "compliated", e. g. coinvolgendo una chiamata di funzione ecc., questo sarebbe eseguito in entrambi i casi. Questo potrebbe non essere desiderato.
    2014-02-13 08: 14: 33Z

puoi farlo: -

[condition] and [expression_1] or [expression_2] ;

Esempio:-

print(number%2 and "odd" or "even")

Questo verrebbe stampato "dispari" se il numero è dispari o "pari" se il numero è pari.


Il risultato: - Se la condizione è vera exp_1 viene eseguita altrimenti exp_2 viene eseguito.

Nota: - 0, None, False, emptylist, emptyString viene valutato come False. E qualsiasi dato diverso da 0 è True.

Ecco come funziona:

se la condizione [condizione] diventa "Vero", quindi expression_1 sarà valutata ma non espressione_2. Se noi "e" qualcosa con 0 (zero), il risultato sarà sempre fasullo. Quindi, nella seguente istruzione,

 
0 and exp

L'espressione exp non verrà valutata affatto poiché "e" con 0 valuterà sempre a zero e non è necessario valutare l'espressione. Ecco come funziona lo stesso compilatore, in tutte le lingue.

In

 
1 or exp

l'espressione exp non verrà valutata affatto poiché "o" con 1 sarà sempre 1. Quindi non si preoccuperà di valutare l'espressione exp poiché il risultato sarà 1 comunque. (metodi di ottimizzazione del compilatore).

Ma in caso di

 
True and exp1 or exp2

La seconda espressione exp2 non verrà valutata poiché True and exp1 sarebbe True se exp1 non è falso.

Allo stesso modo in

 
False and exp1 or exp2

L'espressione exp1 non sarà valutata poiché False equivale a scrivere 0 e fare "e" con 0 sarebbe 0 stesso ma dopo exp1 poiché "o" è usato, valuterà l'espressione exp2 dopo "o".


Nota: - questo tipo di diramazione che usa "or" e "and" può essere usato solo quando expression_1 non ha un valore di verità di False (o 0 o None o lista vuota [] o stringa vuota ''.), poiché se expression_1 diventa False, quindi expression_2 verrà valutato a causa della presenza "o" tra exp_1 e exp_2.

Se vuoi comunque farlo funzionare per tutti i casi indipendentemente dai valori di verità exp_1 e exp_2, fai questo: -

[condition] and ([expression_1] or 1) or [expression_2] ;

    
15
2017-08-20 07: 48: 54Z
  1. Se si desidera utilizzarlo nel contesto di x = [condition] and ([expression_1] or 1) or [expression_2] e expression_1 viene valutato come falso, x sarà 1, non expression_1. Usa la risposta accettata.
    2017-10-20 06: 37: 01Z

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, Dictionary 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 if-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
    
14
2018-04-04 14: 02: 17Z
  1. Notare che l'operatore ternario è più piccolo (in memoria) e più veloce del if annidato. Inoltre, il tuo nidificato if-else non è in realtà una riscrittura dell'operatore ternario e produrrà un output diverso per i valori selezionati di aeb (in particolare se uno è un tipo che implementa un metodo strano __ne__).
    2018-10-11 17: 28: 46Z

Più un suggerimento che una risposta (non c'è bisogno di ripetere l'ovvio per il tempo del hundreth), 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.

    
12
2016-05-23 19: 16: 26Z
  1. Preferisco il print( 'yes' if conditionX else 'nah' ) alla tua risposta. : -)
    2017-08-20 06: 07: 17Z
  2. Questo è se si vuole print() in entrambi i casi - e sembra un po 'più pitonico, devo ammettere :) Ma cosa succede se le espressioni /funzioni non sono le stesse - come print('yes') if conditionX else True - per ottenere il print() solo in verità conditionX
    2017-10-26 11: 40: 17Z
  3. Per aggiungere all'osservazione di Frederick99, un'altra ragione per evitare print('yes') if conditionX else print('nah') è che fornisce un SyntaxError in Python2.
    2018-10-21 21: 51: 29Z
  4. L'unico motivo per cui dà un errore di sintassi è perché in Python 2 print è un'istruzione - print "yes", mentre in Python 3 è una funzione - print("yes"). Questo può essere risolto usando o come istruzione, o meglio - from future import print_function.
    2018-10-22 04: 09: 00Z
 
a if condition else b

Memorizza questa piramide solo se hai difficoltà a ricordare:

 
     condition
  if           else
a                   b 
    
9
2018-12-06 14: 45: 27Z

YES, python ha un operatore ternario, ecco la sintassi e un codice di esempio per dimostrare lo stesso:)

 
#[On true] if [expression] else[On false]
# if the expression evaluates to true then it will pass On true otherwise On false


a= input("Enter the First Number ")
b= input("Enter the Second Number ")

print("A is Bigger") if a>b else print("B is Bigger")
    
4
2018-10-21 20: 46: 34Z
  1. Ho aggiunto un esempio di istruzione a una riga per verificare quale numero è grande per elaborarlo ulteriormente
    2018-10-21 20: 45: 54Z
  2. print non è davvero una buona scelta, poiché ciò darà un SyntaxError in Python2.
    2018-10-21 21: 52: 56Z
  3. @ Thierry Lathuille qui ho usato print () function not print statement, print function è per Python 3 mentre print statement è per Python 2
    2018-10-21 21: 54: 21Z
  4. La domanda è già stata posta su SO, provalo con Python 2 e vedrai da solo. 'print (' hello ') è una sintassi perfettamente valida in Python 2.7, ma il modo in cui viene analizzato rende il codice sopra generato un SyntaxError.
    2018-10-21 21: 58: 23Z
  5. Qual è la risposta corretta per favore
    2018-10-21 22: 00: 52Z

Molti linguaggi di programmazione derivati ​​da C di solito hanno la seguente sintassi dell'operatore condizionale ternario:

 
<condition> ? <expression1> : <expression2>
  

All'inizio, il Python B enevolent D ictator F o L ife (intendo Guido van Rossum , ovviamente) respinto (come stile non-Pythonic), dal momento che è piuttosto difficile da capire per le persone non abituate al linguaggio C. Inoltre, il segno dei due punti : ha già molti usi in Python. Dopo l'approvazione di PEP 308 , Python ha finalmente ricevuto la propria espressione condizionale di scelta rapida (ciò che usiamo ora):

 
<expression1> if <condition> else <expression2>

Quindi, in primo luogo valuta la condizione. Se restituisce True, espressione1 verrà valutato per fornire il risultato, altrimenti verrà valutata espressione2 . A causa della meccanica valutazione pigra , verrà eseguita solo un'espressione.

Ecco alcuni esempi (le condizioni verranno valutate da sinistra a destra):

 
pressure = 10
print('High' if pressure < 20 else 'Critical')

# Result is 'High'

Gli operatori ternari possono essere concatenati in serie:

 
pressure = 5
print('Normal' if pressure < 10 else 'High' if pressure < 20 else 'Critical')

# Result is 'Normal'

Il seguente è uguale a quello precedente:

 
pressure = 5

if pressure < 20:
    if pressure < 10:
        print('Normal')
    else:
        print('High')
else:
    print('Critical')

# Result is 'Normal'

Spero che questo aiuti.

    
4
2019-01-04 22: 02: 14Z

Una delle alternative all'espressione condizionale di Python > è il seguente:

 
{True:"yes", False:"no"}[boolean]

che ha la seguente bella estensione:

 
{True:"yes", False:"no", None:"maybe"}[boolean_or_none]

Il più breve alterativo rimane:

 
("no", "yes")[boolean]

ma non c'è alternativa se si desidera evitare la valutazione di entrambi i yes() e no() in quanto segue:

 
yes() if [condition] else no()
    
3
2019-02-09 18: 23: 18Z

Un modo pulito per collegare più operatori:

 
f = lambda x,y: 'greater' if x > y else 'less' if y > x else 'equal'

array = [(0,0),(0,1),(1,0),(1,1)]

for a in array:
  x, y = a[0], a[1]
  print(f(x,y))

# Output is:
#   equal,
#   less,
#   greater,
#   equal

    
0
2019-05-12 13: 03: 48Z

se la variabile è definita e vuoi controllare se ha valore puoi solo a or b

 
def test(myvar=None):
    # shorter than: print myvar if myvar else "no Input"
    print myvar or "no Input"

test()
test([])
test(False)
test('hello')
test(['Hello'])
test(True)

emetterà

 
no Input
no Input
no Input
hello
['Hello']
True
    
- 1
2018-04-26 16: 22: 58Z
  1. Anche se utile per problemi simili, questo non è un condizionale ternario. Funziona per sostituire x if x else y, ma non x if z else y.
    2018-10-11 17: 13: 50Z
fonte posta Qui