Lors de l'écriture de code, il est crucial de comprendre comment les opérations impliquant plusieurs valeurs sont interprétées. En Python, certains opérateurs logiques se comportent différemment de leurs homologues anglais apparents. Considérez le code suivant :
name = input("Hello. Please enter your name: ") if name == "Kevin" or "Jon" or "Inbar": print("Access granted.") else: print("Access denied.")
Ce code tente d'accorder l'accès aux utilisateurs nommés "Kevin", "Jon" ou "Inbar". Étonnamment, il accorde l'accès même aux utilisateurs non autorisés comme "Bob". Pourquoi cela se produit-il ?
L'opérateur or en Python ne suit pas strictement la signification anglaise conventionnelle. Lorsqu'il est appliqué à plusieurs expressions, il choisit la première expression qui est évaluée à True. Dans le code donné :
if name == "Kevin" or "Jon" or "Inbar":
est logiquement équivalent à :
if (name == "Kevin") or ("Jon") or ("Inbar"):
Puisque "Kevin" est True, le bloc if s'exécute quelle que soit la valeur de name. Cela signifie que chaque utilisateur, y compris les utilisateurs non autorisés, a accès.
Pour comparer correctement une valeur à plusieurs autres, il existe plusieurs méthodes recommandées :
if name == "Kevin" or name == "Jon" or name == "Inbar":
if name in {"Kevin", "Jon", "Inbar"}:
if any(name == auth for auth in ["Kevin", "Jon", "Inbar"]):
Pour illustrer comment Python analyse les expressions logiques avec plusieurs valeurs, voici un exemple utilisant le module ast :
import ast expr = ast.parse("a == b or c or d or e", "<string>", "eval") print(ast.dump(expr, indent=4))
Ce code révèle que l'expression est analysée comme suit :
Expression( body=BoolOp( op=Or(), values=[ Compare( left=Name(id='a', ctx=Load()), ops=[ Eq()], comparators=[ Name(id='b', ctx=Load())]), Name(id='c', ctx=Load()), Name(id='d', ctx=Load()), Name(id='e', ctx=Load())]))
Comme vous pouvez le voir, l'opérateur ou est appliqué à quatre sous-expressions : la comparaison a == b et les expressions simples c, d et e. Cela clarifie pourquoi l'analyse se comporte comme elle le fait.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!