Opérateur ternaire Python sans autre

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

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

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

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

Mais mon IDE ( MyEclipse) ne l'a pas aimé, Sans else.

45
demandé sur Filipp W. 2012-08-30 18:56:43

5 réponses

Oui, vous pouvez le faire:

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

Si <condition> est false, le court-circuit entrera en jeu et le côté droit ne sera pas évalué. Si <condition> est vrai, le côté droit sera évalué et l'élément sera ajouté.

Je vais juste souligner que faire ce qui précède est assez non-pythonique, et il serait probablement préférable d'écrire ceci, indépendamment:

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

Démonstration:

>>> myList = []
>>> False and myList.append('myString')
False
>>> myList
[]
>>> True and myList.append('myString')
>>> myList
['myString']
64
répondu Claudiu 2013-10-15 15:54:29

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

variable = "something" if a_condition

, Sans else, c'est que, dans le cas où a_condition == False, variable est soudainement inconnu. Peut-être qu'il pourrait par défaut à None, mais Python exige que toutes les affectations de variables entraînent réellement des affectations explicites. Cela s'applique également à des cas tels que votre appel de fonction, car la valeur transmise à la fonction est évaluée comme le serait RHS d'une instruction d'affectation.

De même, tous les return s doivent en fait 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 renvoyer explicitement quelque chose.

25
répondu Emmett J. Butler 2018-07-09 10:08:37
if <condition>: myList.append('myString')

Sinon, non. Pourquoi la nécessité de le mettre sur une ligne?

Remarque que "l'opérateur ternaire" est un opérateur. Comme tout opérateur, il doit retourner quelque chose, alors comment pouvez-vous avoir un opérateur ternaire sans les else clause? Qu'est-ce qu'il est censé retourner si la condition n'est pas vraie?

10
répondu mgilson 2012-08-30 14:57:47

myList.extend(['myString'] if condition else []) fonctionnerait aussi, bien que ce soit plus de travail que les autres solutions.

3
répondu Jake Biesinger 2012-08-30 15:21:42

Vous demandez essentiellement do_thing() if <condition> else pass construct (qui lancera SyntaxError, si couru). Comme je l'ai découvert au cours de la recherche pour (quelque peu) question similaire do_thing() if condition else None est aussi proche que vous pouvez obtenir (ce qui est juste une autre façon de faire <condition> and do_thing()). Donc, pour résumer cette idée et d'autres réponses, voici vos options:

  • if <condition>: myList.append('myString') - semble être le moyen le moins 'hacky' (et donc préféré)
  • <condition> and myList.append('myString')
  • myList.append('myString') if <condition> else None
2
répondu Filipp W. 2018-07-10 09:30:18