type operator logical example python string boolean-operations

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 si a es False entonces b no será evaluado
  • para a or b si a es True entonces b 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 devuelve b si a es True , de lo contrario devuelve a .
  • a or b devuelve a si a es True , de lo contrario devuelve b .

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 como True :

    result = (True and " " + parameter) or "" result = (" " + parameter) or "" result = " " + parameter

  • parameter - A1 es None :

    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 .