Opérateur ternaire Python sans autre
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']
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.
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?
myList.extend(['myString'] if condition else [])
fonctionnerait aussi, bien que ce soit plus de travail que les autres solutions.
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