| You are here: Inicio > Inmersión en Python > El poder de la introspección > La peculiar naturaleza de and y or | << >> | ||||
Inmersión en PythonPython de novato a experto |
|||||
En Python and y or realizan las operaciones de lógica booleana como cabe esperar, pero no devuelven valores booleanos; devuelven uno de los valores que están comparando.
>>> 'a' and 'b''b' >>> '' and 'b'
'' >>> 'a' and 'b' and 'c'
'c'
| Cuando se utiliza and, los valores se evalúan en un contexto booleano de izquierda a derecha. 0, '', [], (), {} y None son falsos en un contexto booleano; todo lo demás es verdadero. Bueno, casi todo. Por omisión, las instancias de clases son verdaderas en un contexto booleano, pero se pueden definir métodos especiales en las clases para hacer que una instancia se evalúe como falsa. Aprenderá todo sobre las clases y los métodos especiales en el Capítulo 5. Si todos los valores son verdaderos en un contexto booleano, and devuelve el último de ellos. En este caso, and evalúa 'a', que es verdadera, después 'b', que es verdadera, y devuelve 'b'. | |
| Si alguno de los valores es falso en contexto booleano, and devuelve el primer valor falso. En este caso, '' es el primer valor falso. | |
| Todos los valores son verdaderos, luego and devuelve el último valor, 'c'. |
>>> 'a' or 'b''a' >>> '' or 'b'
'b' >>> '' or [] or {}
{} >>> def sidefx(): ... print "en sidefx()" ... return 1 >>> 'a' or sidefx()
'a'
Si usted es un hacker de C, le será familiar la expresión booleano ? a : b, que se evalúa como a si booleano es verdadero, y b en caso contrario. Por el modo en que and y or funcionan en Python, se puede obtener el mismo efecto.
>>> a = "primero" >>> b = "segundo" >>> 1 and a or b'primero' >>> 0 and a or b
'segundo'
Sin embargo, como esta expresión de Python es simplemente lógica booleana, y no una construcción especial del lenguaje, hay una diferencia muy, muy, muy importante entre este truco and-or en Python y la sintaxis booleano ? a : b en C. Si el valor de a es falso, la expresión no funcionará como sería de esperar. (¿Puede creer que llegué a tener problemas con esto? ¿Más de una vez?)
El truco and-or, booleano and a or b, no funcionará como la expresión booleano ? a : b en C cuando a sea falsa en contexto booleano.
El truco real que hay tras el truco and-or es pues asegurarse de que el valor de a nunca es falso. Una forma habitual de hacer esto es convertir a en [a] y b en [b], y después tomar el primer elemento de la lista devuelta, que será a o b.
>>> a = "" >>> b = "segundo" >>> (1 and [a] or [b])[0]''
Hasta aquí puede parecer que este truco tiene más inconvenientes que ventajas. Después de todo, se podría conseguir el mismo efecto con una sentencia if así que, ¿por qué meterse en este follón? Bien, en muchos casos se elige entre dos valores constantes, luego se puede utilizar la sintaxis más simple sin preocuparse, porque se sabe que el valor de a será siempre verdadero. E incluso si hay que usar la forma más compleja, hay buenas razones para ello; en algunos casos no se permite la sentencia if, por ejemplo en las funciones lambda.
<< Filtrado de listas |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
Utilización de las funciones lambda >> |