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 b
retourneb
si a estTrue
, sinon retournea
. -
a or b
retournea
si 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 - A1
est évalué àTrue
:result = (True and " " + parameter) or "" result = (" " + parameter) or "" result = " " + parameter
-
parameter - A1
estNone
: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 b
sia
estFalse
, puisb
ne sera pas évalué - pour
a or b
sia
estTrue
, puisb
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 ""
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