Expression booléenne Python et ou
En python si vous écrivez quelque chose comme
foo==bar and spam or eggs
python semble revenir spam si le booléen est vrai et les œufs autrement. Quelqu'un pourrait expliquer ce comportement? Pourquoi l'expression n'étant pas évalués comme un long boolean?
Edit: plus Précisément, je suis à essayer de comprendre le mécanisme pourquoi "spam" ou "œufs" est retournée comme résultat de l'expression.
source d'informationauteur Zxaos
Vous devez vous connecter pour publier un commentaire.
Les opérateurs
and
etor
sont de court-circuit ce qui signifie que si le résultat de l'expression peut être déduite à partir de l'évaluation seulement le premier opérande, le deuxième n'est pas évalué. Par exemple, si vous avez l'expressiona or b
eta
est évaluée à vrai, alors il n'a pas d'importance ce queb
est, le résultat de l'expression est vraie sib
n'est pas évalué. Ils fonctionnent comme suit:a and b
: Si a est falsey, b n'est pas évaluée et est retourné, sinon b est renvoyé.a or b
: Si a est truthy, b n'est pas évaluée et est retourné, sinon b est renvoyé.Falsey et truthy faire référence à des valeurs false ou true dans un contexte booléen.
Toutefois ce et/ou idiome était utile à l'époque où il n'y a pas de meilleure alternative, mais maintenant il ya une meilleure façon:
Le problème avec le et/ou idiome (au-delà d'être source de confusion pour les débutants), c'est qu'il donne le mauvais résultat si la condition est vraie mais le spam donne un falsey valeur (par exemple, la chaîne vide). Pour cette raison, vous devez l'éviter.
De cette façon, le Python des opérateurs booléens travail.
De la documentation (le dernier paragraphe explique pourquoi c'est une bonne idée que le travail des opérateurs de la façon dont ils le font):
La raison en est que Python évalue l'expression booléenne en utilisant les valeurs réelles des variables, plutôt que de se limiter à
True
etFalse
valeurs. Les valeurs suivantes sont considérées comme des faux:None
False
''
()
[]
{}
)__nonzero__()
ou__len__()
méthode qui renvoie 0 ouFalse
Voir le Valeur De Vérité De Tests section de la documentation Python pour plus d'informations. En particulier:
Essayez d'utiliser des parenthèses pour rendre l'expression non ambiguë. La façon dont il est, vous obtenez: