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