El tipo Bool
-
- Veremos un poco mas en detalle el tipo Bool o Booleano.
- Presentaremos los operadores lógicos AND, OR y NOT.
- Volveremos a ver la instrucción if y algunas ampliaciones.
- Veremos como hacer comparaciones.
Material requerido.
![]() |
Raspberry Pi 3 o equivalente |
El tipo Bool y los operadores asociados
En esta, nuestra humilde introducción a Python, hemos ido haciendo una pequeña introducción a los tipos que tenemos disponibles, y ha llegado la hora de presentar uno que es habitual en todos los lenguajes de programación y que con frecuencia sorprende a los que se acercan por primera vez a este mundo.
Nos referimos naturalmente al tipo Bool o booleano, por homenaje al primer matemático inglés que los describió como un sistema formal de la lógica (Algo que emociona a los matemáticos y aun lamentamos los demás) George Boole.
No sé si aún se estudia el álgebra de Boole en los colegios, pero en mi época era una de esas materias que te hacia desear pasarte a letras, dado el entusiasmo y acierto con que los sucesivos profesores que fui teniendo demostraron en sus explicaciones. Y es curioso porque aunque comprendo que la parte formal, abstracta del algebra de Boole es durita si no hay anestesia, en la práctica es algo que fundamente toda la tecnología digital moderna y resulta imprescindible en los lenguajes de programación.
La idea básica es que podemos construir un sistema de cálculo completo, usando solamente dos valores que reciben, como el diablo, muchos nombres, que pueden ser 1 y 0, o Cierto y Falso, o High y LOW, pero que siempre es la misma idea.
Ya vimos en algún capitulo previo que toda la electrónica digital se fundamenta en el uso de dos estados eléctricos que llamamos High y Low y que usamos como base de todas las señales que obtenemos y presentamos en Arduino y Raspberry, Pero también vimos que podemos usar un sistema de representación de caracteres basado en la codificación de paquetes de bits digitales que representan caracteres y números.
Y ahora toca hablar de que también podemos definir un sistema de operaciones a partir de estos valores como base de un sistema lógico. Esto es algo que es común a todos los lenguajes de programación y que sin duda ya conocéis los que hayas usado otros lenguajes antes, pero necesitábamos un pequeño comentario al respecto, pensando en aquellos que se acerquen a Raspberry y Python como primer lenguaje.
Y esta es la idea de esta sesión. Presentar las variables booleanas en Python, ver como se opera con ellas y especialmente porque son claves a la hora de usar algunas instrucciones que emplean valores Bool para tomar decisiones como son el if y el while que ya vimos antes, pero que dejamos incompletas a la espera de esta digresión sobre los tipos Bool.
Operando con el tipo Bool
El tipo Bool puede tomar solo dos valores, que en programación llamaremos True y False. Los novatos suelen preguntar algo como ¿No es un poco excesivo tener todo un tipo para algo tan sencillo? Y la respuesta corta es: No señor.
El tipo Bool es imprescindible para todo tipo de problemas de lógica y para poder plantear de forma univoca cualquier problema de toma de decisiones en tus programas, de modo que no admita interpretaciones (Algo que es el fundamento básico de todos los programas)
De acuerdo pues ¿Cómo definimos una variable Bool en Python? Sencillamente asignándola el valor True o False.
>>> a = True >>> b = False >>> print(a) True >>> type(a) <class 'bool'>
Una vez que tenemos definidas un par de variables de tipo Bool podemos operar con ellas con bastante comodidad mediante los operadores lógicos que básicamente son AND, OR y NOT.
El operador AND devuelve True si ambos valores son True, y False si cualquiera de ellos es False. En cambio el Operador OR devuelve el valor TRUE si cualquiera de ellos o ambos, es True:
>>> a and b False >>> a or b True
Habitualmente se parece mucho a nuestra forma de hablar cuando dices que la puerta la pueden abrir o bien Pedro o bien Ana, si ambos tienen llave, Pero no te fíes y revisa la lógica detrás de las frases que nosotros no siempre somos todo lo estrictos hablando como lo es un ordenador.
El siguiente operador es el NOT, que resulta bastante fácil de entender: Es lo contrario del valor actual:
>>> print(a,b) True False >>> print(not a, not b) False True
El objetivo de todo esto es que al final, puedas tomar decisiones en tus programas. Ya vimos en una sesión anterior que podíamos utilizar la instrucción if para tomar decisiones en tu programa y ejecutar unas instrucciones u otras en función de la condición que le pasábamos.
Si haces un poco memoria recordaras que planteábamos algo asi:
If (condición) ……………….. ………………… Más instrucciones
La condición que le pasamos a la instrucción if DEBE poderse evaluar a un valor Bool, para determinar unívocamente si las intrucciones que siguen deben o no ejecutarse. Debe ser un True o False y nada de grises borrosos. Lo uno o lo otro. Y a veces tendrás que operar con condiciones múltiples que ligaras con los operadores AND, OR y NOT.
De hecho es un buen momento para ampliar la instrucción if, con más opciones. Puedes usar la cláusula else:
a = input ("Dame un numero") if int(a) > 5: print("Es mayor de 5") else: print("Es un número pequeño")
Como en tantos lenguajes, la cláusula else complementa el if, haciendo que si la condición que se le pasa es cierta ejecuta las instrucciones a continuación, y en caso de ser falsa, ejecuta el bloque de instrucciones que sigue al else. Nunca se ejecutaran ambos bloques: Sera uno u otro pero no ambos, y por eso es necesario que la condición que le pasemos sea clara.
- Fíjate que tanto if como else llevan dos puntos al final. Todas las cláusulas que aceptan bloques deben finalizar con dos puntos
Pero en Python la instrucción if acepta aún más cláusulas para facilitar la vida a los programadores. Veamos la instrucción elif:
a = int(input("Dame un numero: ")) if a < 0: print ("Es negativo.") elif a == 0: print("Es cero patatero.") elif a > 0: print("Es positivo.")
Cuando corras el programa verás que va comprobando las distintas condiciones de los elif hasta que encuentra una True y la ejecuta, obviando las demás:
Dame un numero: 0 Es cero patatero.
Elif permite ir evaluando a True o False una serie de condiciones dispersas en secuencia para realizar unas acciones u otras en función de las condiciones que le pasemos. Es un sistema cómodo de aplicar condiciones múltiples y actuar en consecuencia. Y por supuesto se puede combinar los elif con el else al final.
Por ejemplo, complicando un poco (Solo un poco) el programa podemos ilustrar un ejemplo de todo a la vez incluyendo el uso de and:
a = int(input("Dame un número: ")) if a > 0 and a < 10: print ("Es pequeño.") elif a>=10 and a < 100: print("Es mediano.") elif a >= 100: print("Es grande.") else: print("Debe ser negativo.")
Hemos ido pasando condiciones al if y elif que son eliminatorias, es decir solo una puede ser cierta, y para ello hemos tenido que aplicar condiciones que limiten el valor de los números entre unos márgenes y eso nos obliga a utilizar una condición compuesta por dos condiciones.
Si cualquiera de ellas se cumple disparamos el mensaje pertinente y si ninguna es cierta el último else, dispara y supone que el número es negativo.
La combinación de if, elif, else es una construcción excepcionalmente útil para comprobar condiciones concatenadas y más aún para hacerlo de un modo ordenado. (Los que vengáis de C++ o Java, veréis que es mucho más práctica que la instrucción Switch y con más posibilidades).
Evaluando condiciones
Los chicos listos os habréis fijado que hemos hablado de variables Bool que aceptan los valores True o False y de que se puede operar con ellas usando AND, OR y NOT y sin mediar palabra os he metido de matute unas ciertas condiciones que no tenían nada que ver con esto.
Por ejemplo hemos usado condiciones como:
if a > 0 and a < 10:
Donde ninguno de los operandos son una variable Bool, y sin embargo Python se lo ha tragado tranquilamente y probablemente la mayor parte de los que lo habéis leído os ha parecido tan normal.
El motivo es que para nosotros es muy intuitivo aceptar como ciertas o falsas el resultado de las comparaciones, y por eso los lenguajes de programación se aprovechan y nos permiten escribirlas de un modo que nos resulta natural, calculando el resultado de la comparación a True o False y pasándole ese resultado a la función if.
Pero necesitamos comentar un poco que operadores tenemos para hacerlas y que reglas siguen. En primer lugar podemos usar los siguientes operadores entre números para compararlos:
> | Mayor que |
>= | Mayor o igual que |
< | Menor que |
<= | Menor o igual que |
== | Igual que |
!= | Diferente que |
Fijaros especialmente en la comparación de igualdad, si sois novatos porque suele ser algo que despista mucho. Si escribes un programa así, te vas a llevar una sorpresa:
if a = 6:
Esto dispara un ladrido inmediato del compilador porque no acepta el operador de asignación =, como operador de comparación (A diferencia de C++ que hubiera tragado tranquilamente) pero hay ocasiones en que puedes llevarte una sorpresita con esto.
Conviene anotar aquí, que los operadores de comparación suelen estar sobrecargados (Overloaded) para realizar una función u otra dependiendo del tipo de los operandos. Por ejemplo si se usan con tipos String (De los que aún no hemos hablado, pero que tendremos que hacerlo pronto) puede dar resultados extraños al principio:
>>> a="Buenos" >>> b="Días" >>> a >b False
Este extraño resultado se debe a que las comparaciones entre Strings se hacen por orden alfabético y por eso la B de Buenos va antes de la D de Días, y Python considera por tanto, que la D es mayor porque va después que la a.
Puede parecer extraño pero resulta muy útil en algunas ocasiones como iremos viendo poco a poco.
Resumen de la sesión
-
- Presentamos el tipo Bool y su necesidad.
- Vimos como usarlos en Python y presentamos los operadores básico AND, OR y NOT. .
- Vimos como usar estos operadores para crear condiciones compuestas simples.
- Presentamos los ooperadores de comparación..