Domanda Operatore ternario Python senza altro


È possibile farlo su una riga in Python?

if <condition>:
    myList.append('myString')

Ho provato l'operatore ternario:

myList.append('myString' if <condition>)

ma il mio IDE (MyEclipse) non gli piaceva, senza un else.


44
2017-08-30 14:56


origine


risposte:


Si, puoi fare questo:

<condition> and myList.append('myString')

Se <condition> è falso, quindi il cortocircuito entrerà in azione e il lato destro non verrà valutato. Se <condition> è vero, quindi il lato destro verrà valutato e l'elemento verrà aggiunto.

Mi limiterò a sottolineare che fare quanto sopra è abbastanza non-pitonico, e probabilmente sarebbe meglio scrivere questo, a prescindere:

if <condition>: myList.append('myString')

Dimostrazione:

>>> myList = []
>>> False and myList.append('myString')
False
>>> myList
[]
>>> True and myList.append('myString')
>>> myList
['myString']

59
2017-08-30 15:05



Il motivo per cui la lingua non ti permette di usare la sintassi

variable = "something" if a_condition

senza else è quello, nel caso in cui a_condition == False, variable è improvvisamente sconosciuto. Forse potrebbe essere l'impostazione predefinita None, ma Python richiede che tutte le assegnazioni di variabili portino effettivamente a assegnazioni esplicite. Questo vale anche per casi come la tua chiamata di funzione, in quanto il valore passato alla funzione viene valutato proprio come il RHS di una dichiarazione di assegnazione sarebbe.

Allo stesso modo, tutto returns deve effettivamente tornare, anche se sono condizionali returnS. Per esempio:

return variable if a_condition

non è permesso, ma

return variable if a_condition else None

è consentito, poiché il secondo esempio è garantito per restituire esplicitamente qualcosa.


25
2017-08-30 14:59



if <condition>: myList.append('myString')

Altrimenti no. Perché la necessità di metterlo su una riga?

Si noti che "l'operatore ternario" è un operatore. Come ogni operatore, deve restituire qualcosa, quindi come si può avere un operatore ternario senza il else clausola? Cosa dovrebbe restituire se la condizione non è vera?


9
2017-08-30 14:57



myList.extend(['myString'] if condition else []) funzionerebbe anche, anche se è più lavoro rispetto alle altre soluzioni.


3
2017-08-30 15:21



Stai praticamente chiedendo do_thing() if <condition> else pass costrutto (che getterà SyntaxError, se eseguito). Come ho scoperto durante la ricerca per (un po ') domanda simile  do_thing() if condition else None è il più vicino possibile (che è solo un altro modo di fare <condition> and do_thing()). Quindi, per riassumere questa idea e altre risposte, ecco le tue opzioni:

  • if <condition>: myList.append('myString') - sembra essere il modo meno "hacky" (e quindi preferito)
  • <condition> and myList.append('myString')
  • myList.append('myString') if <condition> else None

0
2017-07-10 09:30