You are here: Sommaire > Plongez au coeur de Python > Le pouvoir de l’introspection > Particularités de and et or | << >> | ||||
Plongez au coeur de PythonDe débutant à expert |
En Python, and et or appliquent la logique booléenne comme vous pourriez l’attendre, mais ils ne retournent pas de valeurs booléennes, ils retournent une des valeurs comparées.
>>> 'a' and 'b' 'b' >>> '' and 'b' '' >>> 'a' and 'b' and 'c' 'c'
Lorsqu’on utilise and les valeurs sont évaluées dans un contexte booléen de gauche à droite. 0, '', [], (), {} et None valent faux dans ce contexte, tout le reste vaut vrai.[1]Si toutes les valeurs valent vrai dans un contexte booléen, and retourne la dernière valeur. Ici and évalue 'a', qui vaut vrai, puis 'b', qui vaut vrai et retourne 'b'. | |
Si une des valeurs vaut faux and retourne la première valeur fausse. Ici '' est la première valeur fausse. | |
Toutes les valeurs sont vrai, donc and retourne la dernière valeur, 'c'. |
>>> 'a' or 'b' 'a' >>> '' or 'b' 'b' >>> '' or [] or {} {} >>> def sidefx(): ... print "in sidefx()" ... return 1 >>> 'a' or sidefx() 'a'
Si vous êtes un programmeur C, vous êtes certainement familier de l’expression ternaire bool ? a : b, qui s’évalue à a si bool vaut vrai et à b dans le cas contraire. Le fonctionnement de and et or en Python vous permet d’accomplir la même chose.
>>> a = "first" >>> b = "second" >>> 1 and a or b 'first' >>> 0 and a or b 'second'
Cependant, puisque cette expression en Python est simplement de la logique booléenne et non un dispositif spécial du langage, il y a une différence très, très importante entre l’astuce and-or en Python et la syntaxe bool ? a : b en C. Si a vaut faux, l’expression ne fonctionnera pas comme vous vous y attendez. (Vous devinez que cela m’a déjà joué des tours. Et plus d’une fois !)
L’astuce and-or, bool and a or b, ne fonctionne pas comme l’expression ternaire de C bool ? a : b quand a s’évalue à faux dans un contexte booléen.
La véritable astuce cachée derrière l’astuce and-or, c’est de s’assurer que a ne vaut jamais faux. Une manière habituelle de le faire est de changer a en [a] et b en [b] et de prendre le premier élément de la liste retournée, qui sera soit a soit b.
>>> a = "" >>> b = "second" >>> (1 and [a] or [b])[0] ''
On peut penser que cette astuce apporte plus de complication que d’avantages. Après tout, on peut obtenir le même résultat avec une instruction if, alors pourquoi s’embarasser de tout ces problèmes ? Mais dans de nombreux cas, le choix se fait entre deux valeurs constantes et donc vous pouvez utiliser cette syntaxe plus simple sans vous inquiéter puisque vous savez que a vaudra toujours vrai. Et même si vous devez utiliser la version sûre plus complexe, il y a parfois de bonnes raisons de le faire, il y a des cas en Python où les instructions if ne sont pas autorisées, comme dans les fonctions lambda.
[1] Presque tout, en fait. Par défaut, les instances de classes valent vrai dans un contexte booléen mais vous pouvez définir des méthodes spéciales de votre classe pour faire qu’une instance vale faux. Vous apprendrez tout sur les classes et les méthodes spéciales au Chapitre 5.
<< Filtrage de listes |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
Utiliser des fonctions lambda >> |