Une forme alternative de l'opérateur ternaire Python

J'ai récemment découvert une alternative à la construction standard de " expression_on_true if predicate else expression_on_false ", que je n'ai pas vue dans les répertoires:

(expression_on_false, expression_on_true)[predicate]

image

Comment ça fonctionne


  1. Entre parenthèses, un tuple de deux éléments est déclaré.
  2. Entre crochets, la valeur du prédicat est calculée.
  3. Un tuple est accessible à l'index 1 (si la valeur du prédicat est True) ou 0 (si la valeur du prédicat est False)

Regardons un exemple


Supposons que nous ayons un , et que nous devons imprimer «positif» si le nombre n'est pas inférieur à zéro, ou «nagatif» si le nombre est inférieur à zéro.


>>> a = 101
>>> ("negative", "positive")[a >= 0]
'positive'
>>> a = -42
>>> ("negative", "positive")[a >= 0]
'negative'
>>> a = 0
>>> ("negative", "positive")[a >= 0]
'positive'

Dans le premier cas, 101> = 0, le prédicat renvoie donc True. Lors de l'indexation, True passe à 1, donc l'appel va à l'élément d'index 1. Dans le deuxième cas, la même chose: le prédicat est False, l'appel va à l'élément d'index 0.

Construction ("négatif", "positif") [a> = 0] au moins et pas beaucoup plus court que "positif" si a> = 0 sinon "positif" , mais je trouve toujours cette fonctionnalité intéressante

Remarque


(merci à Dasdy )
Si au lieu de constantes nous substituons des expressions dans le tuple, dont une seule doit être exécutée, alors cette construction perd son sens.

All Articles