98 votes

Opérateur ternaire Python sans else

Est-il possible de faire cela sur une seule ligne en Python ?

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

J'ai essayé l'opérateur ternaire :

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

mais mon IDE ( MyEclipse ) n'a pas aimé, sans un else .

140voto

Claudiu Points 58398

Oui, vous pouvez le faire :

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

Si <condition> est faux, alors le court-circuitage interviendra et le côté droit ne sera pas évalué. Si <condition> est vrai, alors le côté droit sera évalué et l'élément sera ajouté.

Je tiens à préciser que ce qui précède est tout à fait non pythique, et qu'il serait probablement préférable d'écrire ceci, malgré tout :

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

Démonstration :

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

51voto

Emmett J. Butler Points 1629

La raison pour laquelle le langage ne vous permet pas d'utiliser la syntaxe

variable = "something" if a_condition

sans else est que, dans le cas où a_condition == False , variable est soudainement inconnu. Il pourrait peut-être s'agir par défaut de None mais Python exige que toutes les affectations de variables donnent lieu à des affectations explicites. Cela s'applique également à des cas tels que votre appel de fonction, car la valeur passée à la fonction est évaluée tout comme la variable RHS d'une déclaration d'affectation serait.

De même, tous les return doivent effectivement revenir, même si elles sont conditionnelles. return s. Par exemple :

return variable if a_condition

n'est pas autorisé, mais

return variable if a_condition else None

est autorisé, puisque le deuxième exemple est garanti pour retourner explicitement quelque chose.

13voto

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

Sinon, non. Pourquoi avoir besoin de le mettre sur une seule ligne ?

Notez que l'"opérateur ternaire" est un opérateur . Comme tout opérateur, il doit retourner quelque chose alors comment peut-on avoir un opérateur ternaire sans l'élément else clause ? Que doit-elle retourner si la condition n'est pas vraie ?

11voto

Vous demandez essentiellement do_thing() if <condition> else pass (qui lancera SyntaxError si elle a été exécutée). Comme je l'ai découvert lors de mes recherches pour (un peu) question similaire do_thing() if condition else None est aussi proche que vous pouvez l'être (ce qui est juste une autre manière de faire <condition> and do_thing() ). Donc, pour résumer cette idée et les autres réponses, voici vos options :

  • if <condition>: myList.append('myString') - semble être le moyen le moins "bricolé" (et donc préféré).
  • <condition> and myList.append('myString')
  • myList.append('myString') if <condition> else None

3voto

Jake Biesinger Points 717

myList.extend(['myString'] if condition else []) fonctionnerait également, bien que cela représente plus de travail que les autres solutions.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X