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 ""
Où paramètre est Chaîne
Pourquoi voudrait-on utiliser l'opérateur and et or, en général, avec des chaînes python?
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 bretournebsi a estTrue, sinon retournea. -
a or bretourneasi a estTrue, sinon retourneb.
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 - A1est évalué àTrue:result = (True and " " + parameter) or "" result = (" " + parameter) or "" result = " " + parameter -
parameter - A1estNone: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.
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)
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 bsiaestFalse, puisbne sera pas évalué - pour
a or bsiaestTrue, puisbne 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 ""
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'
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.
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