Operadores booleanos
Combina condiciones con and, or, not, los conectores lógicos de Python.
- Usar and, or y not para combinar expresiones booleanas
- Entender la evaluación de cortocircuito
- Aplicar las leyes de De Morgan en Python
- Escribir condiciones complejas con claridad
Construir condiciones a partir de condiciones
Los operadores de comparación te entregan un solo valor de verdad: True o False. La puerta del club hace dos preguntas a la vez,“¿eres mayor de edad y llevas entrada?”, y esa conjunción es en sí misma una condición. Python, como la lógica que conociste en matemáticas, ofrece los tres conectivos que combinan proposiciones:
- se escribe
and - se escribe
or - se escribe
not
Los tres conectivos
Su comportamiento es la tabla de verdad que ya conoces. Escríbela en Python y se lee idéntica:
True and True # True
True and False # False
False or True # True
not True # FalseDónde ganan su sal es pegando comparaciones en una sola compuerta. Un local, una alerta meteorológica, un día laborable:
age = 20
has_ticket = True
if age >= 18 and has_ticket:
print("Welcome in")
temperature = 30
if temperature < 0 or temperature > 40:
print("Extreme weather!")
is_weekend = False
if not is_weekend:
print("Time to work")Cada una es una pregunta única ensamblada a partir de otras menores, exactamente como armaba intervalos en la lección anterior.
Evaluación de cortocircuito
La tabla de verdad completa lista cuatro filas, pero Python no siempre las necesita. Evalúa and con : la respuesta es False sea cual sea , así que nunca se calcula. El mismo muro vale para or: una vez que es True, el resultado está decidido. Python lee de izquierda a derecha y se detiene en la primera respuesta decisiva.
No es una comodidad de rendimiento; es un dispositivo de seguridad:
x = 0
# No hay división siquiera — 0 es falso, la segunda mitad se salta
result = x != 0 and 10 / x > 2Si Python evaluara ambos lados, se rompería por división entre cero. La palabra and es una compuerta de pre-vuelo: se niega a volar la segunda condición salvo que la primera la libere. Por eso Python escribe and/or donde las familias C escriben &&/||, las palabras llevan el mismo cortocircuito sin los símbolos crípticos.
Los dos intercambios de De Morgan
Las identidades más reutilizables de la lógica cruzan una negación por encima de un conectivo:
- ,
not (A and B)≡not A or not B - ,
not (A or B)≡not A and not B
En Python, la negación de una condición unida se vuelve una condición unida de negaciones:
# Son equivalentes:
not (age >= 18 and has_ticket)
age < 18 or not has_ticketLa forma reescrita se lee de corrido: la puerta no abre a ningún menor de edad ni a ningún sin entrada. Las leyes de De Morgan son la herramienta para convertir un denso not (…) que hay que desenmarañar en la lectura llana.
Las tablas de verdad, de un vistazo
| True | True | True | True |
| True | False | False | True |
| False | True | False | True |
| False | False | False | False |
Y voltea el único valor de verdad: not True → False, not False → True.
Un ejemplo resuelto: la puerta del club, contada dos veces
Una puerta, un veredicto, dos redacciones. La regla de admisión rechaza a quien no sea mayor o no traiga boleto:
age = 20
has_ticket = True
denied = not (age >= 18 and has_ticket) # False
denied_again = age < 18 or not has_ticket # False — De Morgan, equivaleLa primera línea dice “no es cierto que (mayor Y con boleto)”; la segunda dice “menor O sin boleto”, los dos lados de la ley de De Morgan, y ambos responden lo mismo. La versión desanudada se lee como la frase que describe.
Errores comunes
and/ordevuelven un operando, no un booleano.0 and 5es0;0 or 5es5. Python entrega el valor que decidió. El 0 falso hizo la decisión, así que se devuelve 0.notse anuda más fuerte que==.not a == bse analiza comonot (a == b), no(not a) == b. Pon paréntesis cuando dudes.- Palabras, no símbolos bit a bit.
True and FalseesFalse;True & Falsees una operación bit a bit sobre booleanos con otro comportamiento. Reserva&/|para el trabajo a nivel de bits. and/orson perezosos de un modo que esconde errores. Si el lado decisivo ya es truthy/falsy, el otro lado jamás se ejecuta,1 or missing_function()nunca llama a la función. Una mitad muerta que no chocó puede esconder un nombre que olvidaste.
🧩 Desafíos
🧩 Desafío, piensa primero, luego revela
Sin ejecutarlo, predice: 0 and 5, 0 or 5, 3 and 5, 3 or 5. ¿Qué patrón ves?
💡 Respuesta: 0 and 5 → 0, 0 or 5 → 5, 3 and 5 → 5, 3 or 5 → 3. Patrón: and entrega el primer operando falso (o el último si todos son verdaderos); or entrega el primer verdadero (o el último si todos son falsos).
🧩 Desafío, piensa primero, luego revela
Reescribe not (x > 5 and y < 10) con la ley de De Morgan. ¿Es más legible la versión reescrita?
💡 Respuesta: not (x > 5 and y < 10) ≡ x <= 5 or y >= 10, una lectura directa sin negación compuesta que desenredar.
🧩 Desafío, piensa primero, luego revela
Escribe la condición de año bisiesto: divisible por 4, salvo los siglos (divisibles por 100) a menos que también sean divisibles por 400. Usa and, or, not.
💡 Respuesta: (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0), divisible por 4 pero no por 100, o divisible por 400.
🤔 Preguntas socráticas
0 and 5da0, noFalse. ¿Por qué Python devuelve el valor que decide en lugar de un booleano? ¿Cuándo se vuelve útil esto?- Si
ordevuelve el primer operando verdadero, ¿qué es"hello" or "world"? ¿Y"" or "world"? - ¿Por qué Python prefiere las palabras
and,or,nota los símbolos&&,||,!? ¿Qué compra el inglés llano al lector?
✅ Comprobación rápida
1. ¿Cuánto es True and False?
2. ¿A qué evalúa 0 or 5?
3. ¿Cuál equivale a not (a and b)?