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

Je ne comprends pas le sens de la ligne:

parameter and (" " + parameter) or ""

paramètre est Chaîne

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

21
demandé sur Kevin Guan 2013-10-07 00:22:19

6 réponses

Supposons que vous utilisez la valeur de parameter, mais si la valeur est à dire None, alors vous préférez disposer d'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 fait cette expression. Vous devez d'abord comprendre ce que fait l'opérateur and et or:

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

Donc, votre expression:

parameter and (" " + parameter) or ""

Qui est effectivement équivalent à:

(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 = ""
    

, Comme une suggestion générale, il est préférable et plus lisible d'utiliser A if C else B forme d'expression 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.

22
répondu Rohit Jain 2013-10-06 20:47:12

Python considère les chaînes vides comme ayant une valeur booléenne de "false" et les chaînes non vides comme ayant une valeur booléenne de "true".

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

Deuxième chose à remarquer est que la valeur de "ou" et "et" opérateur sont retournés. Python ne renvoie pas seulement la valeur true ou false, pour les chaînes et l'opérateur or/AND, il renvoie l'une des chaînes (considérant qu'elles ont la valeur true ou faux). Python utilise une approche paresseuse:

Pour l'opérateur " et " si la valeur left vaut true, la valeur right est vérifiée et renvoyée. si la valeur Left 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 false, la deuxième valeur est renvoyée

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

Sortie: test

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

Sortie:(chaîne vide)

6
répondu Pawel Bragoszewski 2013-10-06 20:38:16

La chaîne vide en Python équivaut à une valeur booléenne False, 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, de nos jours une construction obsolète, car Python a maintenant un véritable opérateur ternaire). Il est basé sur trois règles:

  • pour a and b si a est False, puis b ne sera pas évalué
  • pour a or b si a est True, puis b ne sera pas évalué
  • , la valeur d'un la clause logique est la valeur de son expression la plus récemment évaluée

Si parameter donne True la deuxième partie de la and clause est évalué: (" " + parameter). Il ajoutera donc un espace de début à un parameter si ce n'est pas une chaîne vide. La deuxième partie de la clause or ne sera pas évaluée, car vous pouvez déjà dire que toute l'expression est True (True ou tout est toujours True).

Si parameter est False (chaîne vide dans ce contexte) la deuxième partie du and la clause ne sera pas évaluée, comme vous pouvez déjà le dire False (False et tout est toujours False). Par conséquent, la deuxième partie de la clause or est évaluée en retournant une chaîne vide.

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

if parameter:
    return " " + parameter
else:
    return ""
4
répondu BartoszKP 2017-05-23 11:46:50

Il vérifie si parameter a une valeur. Si c'est le cas, cela ajoute un espace. Sinon il renvoie 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
répondu Cfreak 2013-10-06 20:25:49

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

Notez que and et or évaluez à la première valeur qui les a fait "réussir"ou" échouer " - et cela n'a pas besoin d'ê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 chaîne œuvres, car les opérateurs n'ont pas besoin de retourner Vrai ou Faux - il sera soit la valeur de a ou b.

2
répondu user2246674 2013-10-06 20:42:38

Avec toutes les bonnes réponses, j'ai trouvé que ces déclarations m'aident à mieux me souvenir de cela et à mieux adapter le fonctionnement de mon cerveau (et j'espère en avoir plus):

  • "et" les retours au premier Faux (par exemple, Aucun, "", [], (), {}, 0) ou le dernier élément si aucun (par exemple, pas de Fausse trouvé)

  • "ou" renvoie le premier Vrai article ou le dernier élément (par exemple, pas Vrai trouve)

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 à la chaîne, tous les "et" ou "ou de la" déclaration de

0
répondu Zhenhua 2017-08-01 23:30:27