Inicio > Inmersión en Python > El poder de la introspección > La peculiar naturaleza de and y or | << >> | ||||
diveintopython.org Python para programadores con experiencia |
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 reales que están comparando.
Ejemplo 2.16. Presentación de and
>>> '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.[3] Si todos los valores son verdaderos en un contexto booleano, and devuelve el último valor. 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'. |
Ejemplo 2.17. Presentación de or
>>> 'a' or 'b' 'a' >>> '' or 'b' 'b' >>> '' or [] or {} {} >>> def sidefx(): ... print "in sidefx()" ... return 1 >>> 'a' or sidefx() 'a'
Si es usted un hacker de C, le será familiar la expresión bool ? a : b, que se evalúa como a si bool es verdadero, y b en caso contrario. Por el modo en que and y or funcionan en Python, se puede obtener el mismo efecto.
Ejemplo 2.18. Presentación del truco and-or
>>> a = "first" >>> b = "second" >>> 1 and a or b 'first' >>> 0 and a or b 'second'
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 bool ? a : b en C. Si el valor de a es falso, la expresión no funcionará como sería de esperar. (¿Puedes decir que he estado obsesionado con esto? ¿Más de una vez?)
El truco and-or, bool and a or b, no funcionará como la expresión bool ? 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.
Ejemplo 2.20. Utilización segura del truco and-or
>>> a = "" >>> b = "second" >>> (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.
Lecturas complementarias
Footnotes
[3] 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á usted todo sobre las clases y los métodos especiales en el capítulo 3.
Filtrado de listas | 1 2 3 4 5 6 7 8 9 | Utilización de las funciones lambda |