Maison >développement back-end >Tutoriel Python >Pourquoi « a == x ou y ou z » est-il toujours évalué à True en Python ?
Dévoiler le mystère de "a == x ou y ou z" : pourquoi il est toujours évalué comme vrai
En Python, l'omniprésent La comparaison « a == x ou y ou z » est une source de confusion récurrente. Bien qu'apparemment simple, cela peut conduire à des résultats inattendus, en particulier dans les applications de sécurité.
Le problème :
Considérez le code suivant, destiné à accorder l'accès aux utilisateurs autorisés :
name = input("Hello. Please enter your name: ") if name == "Kevin" or "Jon" or "Inbar": print("Access granted.") else: print("Access denied.")
Étonnamment, ce code permet également l'accès aux utilisateurs non autorisés !
La solution : Décoder la syntaxe
Le problème réside dans l'interprétation de l'opérateur "ou". En Python, cet opérateur suit les règles de l'algèbre booléenne. Par conséquent, "a == x ou y ou z" est équivalent à l'expression ci-dessous :
(a == x) or (y) or (z)
Lorsqu'un utilisateur comme "Bob" tente d'accéder, l'expression est évaluée comme :
(False) or ("Jon") or ("Inbar")
Selon l'algèbre booléenne, l'opérateur "ou" renvoie la première valeur véridique rencontrée. Dans ce cas, "Jon" est véridique, ce qui fait que l'expression est évaluée comme vraie et accorde l'accès aux utilisateurs non autorisés.
Construction conditionnelle appropriée
Pour éviter cet écueil, il existe trois méthodes principales pour écrire correctement l'instruction conditionnelle :
Multiple == Opérateurs :
if name == "Kevin" or name == "Jon" or name == "Inbar": ...
Dans l'opérateur d'adhésion :
if name in {"Kevin", "Jon", "Inbar"}: ...
n'importe lequel( ) avec générateur Expression :
if any(name == auth for auth in ["Kevin", "Jon", "Inbar"]): ...
Considérations relatives aux performances
Bien que l'opérateur in soit généralement préféré pour la lisibilité et la vitesse, voici une performance comparaison :
name = "Inbar" >>> timeit.timeit("name == \"Kevin\" or name == \"Jon\" or name == \"Inbar\"", ... setup="name=\"Inbar\"") 0.0960568820592016 >>> timeit.timeit("name in {\"Kevin\", \"Jon\", \"Inbar\"}", setup="name=\"Inbar\"") 0.034957461059093475 >>> timeit.timeit("any(name == auth for auth in [\"Kevin\", \"Jon\", \"Inbar\"])", ... setup="name=\"Inbar\"") 0.6511583919636905
Conclusion
Comprendre les nuances subtiles de "a == x ou y ou z" est crucial pour écrire des instructions conditionnelles efficaces en Python, en particulier ceux liés au contrôle d’accès. N'oubliez pas d'utiliser les constructions alternatives décrites ici pour garantir un code précis et sécurisé.
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!