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
Libérer: 2024-12-26 20:54:18
original
309 Les gens l'ont consulté

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.")
Copier après la connexion

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":
Copier après la connexion

est logiquement équivalent à :

if (name == "Kevin") or ("Jon") or ("Inbar"):
Copier après la connexion

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":
Copier après la connexion
  1. Test d'adhésion : Utilisez une collection de valeurs valides et testez l'adhésion :
if name in {"Kevin", "Jon", "Inbar"}:
Copier après la connexion
  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"]):
Copier après la connexion

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))
Copier après la connexion

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())]))
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal