Maison >développement back-end >Tutoriel Python >Pourquoi l'opérateur « ou » de Python se comporte-t-il de manière inattendue avec plusieurs valeurs ?

Pourquoi l'opérateur « ou » de Python se comporte-t-il de manière inattendue avec plusieurs valeurs ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-26 20:54:18385parcourir

Why Does Python's `or` Operator Behave Unexpectedly with Multiple Values?

Pourquoi les opérations logiques avec plusieurs valeurs sont évaluées différemment en Python

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 ?

Comprendre l'opérateur Or en Python

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.

Comment comparer correctement une valeur à plusieurs autres

Pour comparer correctement une valeur à plusieurs autres, il existe plusieurs méthodes recommandées :

  1. Comparaisons d'égalité multiples : Comparez explicitement chaque valeur à l'aide du == opérateur :
if name == "Kevin" or name == "Jon" or name == "Inbar":
  1. Test d'adhésion : Utilisez une collection de valeurs valides et testez l'adhésion :
if name in {"Kevin", "Jon", "Inbar"}:
  1. Expression du générateur et any() : Vérifiez explicitement chaque valeur à l'aide d'une boucle et de any() function :
if any(name == auth for auth in ["Kevin", "Jon", "Inbar"]):

Comprendre l'analyse des expressions logiques

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!

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