Maison >développement back-end >Tutoriel Python >Pourquoi « a == x ou y ou z » est-il toujours évalué à True en Python ?

Pourquoi « a == x ou y ou z » est-il toujours évalué à True en Python ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-23 19:10:14720parcourir

Why Does

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 :

  1. Multiple == Opérateurs :

    if name == "Kevin" or name == "Jon" or name == "Inbar":
     ...
  2. Dans l'opérateur d'adhésion :

    if name in {"Kevin", "Jon", "Inbar"}:
     ...
  3. 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn