web-dev-qa-db-fra.com

Utilisation de l'opérateur "and" et "ou" avec les chaînes Python

Je ne comprends pas le sens de la ligne:

parameter and (" " + parameter) or ""

paramètre est une chaîne

Pourquoi voudrait-on utiliser les opérateurs and et or, en général, avec des chaînes python?

23
user1264304

Supposons que vous utilisiez la valeur parameter, mais si la valeur est say None, vous préféreriez plutôt avoir une chaîne vide "" au lieu de None. Que feriez-vous en général?

if parameter:
    # use parameter (well your expression using `" " + parameter` in this case
else:
    # use ""

C'est ce que cette expression fait. Vous devez d’abord comprendre ce que fait l'opérateur and et or:

  • a and b renvoie b si a est True, sinon renvoie a.
  • a or b renvoie a si a est True, sinon renvoie b.

Alors, ton expression:

parameter and (" " + parameter) or ""

ce qui équivaut effectivement à:

(parameter and (" " + parameter)) or  ""
#    A1               A2               B
#           A                     or   B

Comment l'expression est évaluée si:

  • parameter - A1 EST ÉVALUÉ À True:

    result = (True and " " + parameter) or ""
    
    result = (" " + parameter) or ""
    
    result = " " + parameter
    
  • parameter - A1 EST None:

    result = (None and " " + parameter) or ""
    
    result = None or ""
    
    result = ""
    

A titre de suggestion générale, il est préférable et plus lisible d'utiliser l'expression de formulaire A if C else B pour l'expression conditionnelle. Donc, vous devriez mieux utiliser:

" " + parameter if parameter else ""

au lieu de l'expression donnée. Voir PEP 308 - Expression conditionnelle pour la motivation derrière l'expression if-else.

24
Rohit Jain

Python considère que les chaînes vides ont une valeur booléenne «false» et que les chaînes non vides ont une valeur booléenne «true».

Il n’ya donc que deux résultats possibles de l’expression, c’est-à-dire une chaîne vide et une chaîne non vide.

La deuxième chose à noter est la valeur de "ou" et "et" opérateur retournée. Python ne renvoie pas uniquement les valeurs true ou false. Pour les chaînes et/ou, l'opérateur renvoie l'une des chaînes (en considérant qu'elles ont pour valeur true ou false). Python utilise l'approche paresseuse:

Pour l'opérateur "et" si la valeur de gauche est vraie, la valeur de droite est vérifiée et renvoyée. si la valeur laissée est false, elle est renvoyée

Pour l'opérateur "ou" si la première valeur est true, elle est renvoyée. sinon, si la deuxième valeur est fausse, la deuxième valeur est renvoyée

parameter = 'test'
print( parameter and (" " + parameter) or "" )

ouput: test

parameter = ''
print( parameter and (" " + parameter) or "" )

sortie: (chaîne vide)

6

Une chaîne vide en Python équivaut à une valeur False boolean, de la même manière qu'une liste vide. La ligne que vous avez présentée est la version Python d'un opérateur ternaire (comme indiqué dans le commentaire ci-dessous, une construction obsolète est devenue, car Python a maintenant un véritable opérateur ternaire ). Il repose sur trois règles:

  • pour a and b si a est False, alors b ne sera pas évalué
  • pour a or b si a est True, alors b ne sera pas évalué
  • la valeur d'une clause logique est la valeur de sa dernière expression évaluée

Si parameter est évalué à True, la deuxième partie de la clause and sera évaluée: (" " + parameter). Donc, cela ajoutera un espace de début à parameter s'il ne s'agit pas d'une chaîne vide. La deuxième partie de la clause or ne sera pas évaluée, car vous pouvez déjà dire que l'expression entière est True (True ou que tout est toujours True).

Si parameter est False (chaîne vide dans ce contexte), la deuxième partie de la clause and ne sera pas évaluée, car vous pouvez déjà savoir qu'il s'agit de False (False et tout est toujours False). Par conséquent, la deuxième partie de la clause or est évaluée et renvoie une chaîne vide.

Vous pouvez l'écrire d'une manière plus verbeuse:

if parameter:
    return " " + parameter
else:
    return ""
4
BartoszKP

Considérez ce TTL. Ensuite, il suffit de brancher différents scénarios pour voir ce qui se passe :)

Notez que and et or sont évalués à la première valeur qui les a fait "réussir" ou "échouer" - et que cela ne doit pas nécessairement être Vrai ou Faux!

a    b    a or b   a and b
--   --   ------   ------- 
T    T    a (T)    b (T)
T    F    a (T)    b (F)
F    T    b (T)    a (F)
F    F    b (F)    a (F)

T et F représentent les valeurs "Truth-y" et "False-y". Cette expression d'enchaînement fonctionne parce que les opérateurs n'ont pas besoin de renvoyer Vrai ou Faux - ce sera soit la valeur de a ou b.

2
user2246674

Il vérifie si parameter a une valeur. Si c'est le cas, cela ajoute un espace. Sinon, il retourne une chaîne vide.

$ python
Python 2.7.2 (default, Oct 11 2012, 20:14:37) 
[GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> foo = 'bar'
>>> foo and (" " + foo) or ""
' bar'
2
Cfreak

Avec toutes les bonnes réponses, j'ai trouvé que ces déclarations m'aidaient à mieux m'en souvenir et à mieux comprendre le fonctionnement de mon cerveau (et, espérons-le, pour un peu plus): 

  • "Et" renvoie le premier élément faux (par exemple, aucun, "", [], (), {}, 0) ou le dernier élément si aucun (par exemple aucun faux trouvé)

  • "Ou" renvoie le premier élément True ou le dernier élément (par exemple, aucun True trouvé)

En résumé, ils renvoient tous le premier élément qui décide du résultat de la déclaration. (Dans le pire des cas, le dernier élément de la séquence) 

Notez que cette règle s’applique également à une instruction "et" ou "ou" tout en chaîne

0
Zhenhua