Je ne comprends pas le sens de la ligne:
parameter and (" " + parameter) or ""
où 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?
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
.
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)
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:
a and b
si a
est False
, alors b
ne sera pas évaluéa or b
si a
est True
, alors b
ne sera pas évalué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 ""
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
.
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'
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