operator - Usando el operador "y" y "o" con cadenas de Python
python type string (6)
Comprueba si el parameter
tiene un valor. Si lo hace antepone un espacio. Si no devuelve una cadena vacía.
$ 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''
No entiendo el significado de la línea:
parameter and (" " + parameter) or ""
donde parámetro es cadena
¿Por qué querría uno usar and
/ or
operador, en general, con cuerdas de pitón?
Con todas las buenas respuestas, encontré que estas declaraciones me ayudan a recordar esto mejor y se adaptan a cómo funciona mi cerebro (y espero que haya más):
"Y" devuelve el primer elemento Falso (por ejemplo, Ninguno, "", [], (), {}, 0) o el último elemento si no hay ninguno (por ejemplo, no se encontró Falso)
"O" devuelve el primer elemento True o el último elemento (por ejemplo, no se encontró True)
En resumen, todos devuelven el primer elemento que decide el resultado de la declaración. (En el peor de los casos, el último elemento de la secuencia)
Tenga en cuenta que esta regla también se aplica a todos los enunciados "y" o todos "o" encadenados.
Considere este TTL. Entonces solo se está conectando en diferentes escenarios para ver qué sucede :)
Tenga en cuenta que and
or
y evalúe el primer valor que los hizo "tener éxito" o "fallar" , ¡y esto no tiene por qué ser Verdadero o Falso!
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 y F representan los valores de "Verdad-y" y "Falso-y". Este encadenamiento de expresiones funciona porque los operadores no necesitan devolver Verdadero o Falso: será el valor de a
o b
.
La cadena vacía en Python es equivalente a un valor booleano False
, de la misma manera que una lista vacía. La línea que ha presentado es la versión Python de un operador ternario (como se señala en el comentario a continuación, hoy en día es una construcción obsoleta, ya que Python ahora tiene un operador ternario real ). Se basa en tres reglas:
- para
a and b
sia
esFalse
entoncesb
no será evaluado - para
a or b
sia
esTrue
entoncesb
no será evaluado - el valor de una cláusula lógica es el valor de su expresión evaluada más recientemente
Si el parameter
evalúa como True
la segunda parte de la cláusula and
se evaluará: (" " + parameter)
. Por lo tanto, agregará espacio inicial a un parameter
si no es una cadena vacía. La segunda parte de la cláusula or
no se evaluará, ya que puedes decir que toda la expresión es True
( True
o algo así siempre es True
).
Si el parameter
es False
(cadena vacía en este contexto), la segunda parte de la cláusula y no se evaluará, ya que se puede decir que es False
( False
y todo es siempre False
). Por lo tanto, la segunda parte de la cláusula or
se evalúa devolviendo una cadena vacía.
Puedes escribirlo de una manera más detallada:
if parameter:
return " " + parameter
else:
return ""
Python considera que las cadenas vacías tienen un valor booleano de "falso" y que las cadenas no vacías tienen un valor booleano de "verdadera".
Así que solo hay dos resultados posibles de la expresión, es decir, para una cadena vacía y para una cadena no vacía.
La segunda cosa a tener en cuenta es aquel valor de "o" y "y" operador que se devuelve. Python no devuelve solo un valor verdadero o falso, para las cadenas y / o el operador devuelve una de las cadenas (considerando que tienen un valor de verdadero o falso). Python utiliza un enfoque perezoso:
Para "y" operador si el valor izquierdo es verdadero, entonces el valor correcto se verifica y se devuelve. Si el valor a la izquierda es falso, entonces se devuelve
Para "o" operador si el primer valor es verdadero, entonces se devuelve. de lo contrario, si el segundo valor es falso, entonces se devuelve el segundo valor
parameter = ''test''
print( parameter and (" " + parameter) or "" )
salida: prueba
parameter = ''''
print( parameter and (" " + parameter) or "" )
salida: (cadena vacía)
Supongamos que está utilizando el valor del parameter
, pero si el valor es decir None
, entonces le gustaría tener una cadena vacía ""
lugar de None
. ¿Qué harías en general?
if parameter:
# use parameter (well your expression using `" " + parameter` in this case
else:
# use ""
Esto es lo que está haciendo esa expresión. Primero debes entender lo que y or
y el operador hacen:
-
a and b
devuelveb
si a esTrue
, de lo contrario devuelvea
. -
a or b
devuelvea
si a esTrue
, de lo contrario devuelveb
.
Entonces, tu expresión:
parameter and (" " + parameter) or ""
que es efectivamente equivalente a:
(parameter and (" " + parameter)) or ""
# A1 A2 B
# A or B
Cómo se evalúa la expresión si:
parameter - A1
se evalúa comoTrue
:result = (True and " " + parameter) or "" result = (" " + parameter) or "" result = " " + parameter
parameter - A1
esNone
:result = (None and " " + parameter) or "" result = None or "" result = ""
Como sugerencia general, es mejor y más legible utilizar A if C else B
forma una expresión para la expresión condicional. Por lo tanto, deberías usar mejor:
" " + parameter if parameter else ""
En lugar de la expresión dada. Ver PEP 308 - Expresión condicional para la motivación detrás de la expresión if-else
.