Operadores lógicos Parte 4
Parte de la sección Fundamentals del Journey de Python de Coddy — lección 19 de 77.
Al trabajar con expresiones lógicas, a veces necesitamos simplificarlas o reorganizarlas. Esto es particularmente útil cuando se trata de condiciones complejas que combinan múltiples operadores and y or.
Las leyes de De Morgan proporcionan reglas para transformar expresiones lógicas. Estas transformaciones ayudan a que el código sea más legible y fácil de entender.
Primera ley: not (A and B) es lo mismo que (not A) or (not B)
Observa que ocurren dos cosas cuando distribuyes not en la expresión: cada operando se niega (A se convierte en not A, B se convierte en not B), y el operador cambia — and se convierte en or. El not no solo niega los valores; también cambia el operador de conexión entre ellos.
Por ejemplo:
# Vamos a comprobar si un número NO está (entre 1 y 10)
number = 15
# Estas dos expresiones son equivalentes:
result1 = not (number >= 1 and number <= 10)
result2 = (not number >= 1) or (not number <= 10)
print(result1) # True
print(result2) # TrueSegunda ley: not (A or B) es lo mismo que (not A) and (not B)
La misma regla de dos pasos se aplica aquí: cada operando se niega, y el operador se invierte — esta vez or se convierte en and. Piénsalo de esta manera: distribuir not siempre invierte and ↔ or mientras se niega cada parte.
Por ejemplo:
# Comprobando si una persona NO es (estudiante o empleada)
is_student = False
is_employed = False
# Estas dos expresiones son equivalentes:
result1 = not (is_student or is_employed)
result2 = (not is_student) and (not is_employed)
print(result1) # True
print(result2) # TrueEjemplo complejo con AND y OR: A veces necesitas condiciones que combinen ambos operadores. Aquí tienes un ejemplo práctico:
# Comprobando si NO PODEMOS aceptar una solicitud de empleo
# Rechazamos si: (sin experiencia Y sin título) O no cumple con el requisito de edad
has_experience = False
has_degree = False
meets_age = True
# Condición compleja usando tanto AND como OR
reject_application = (not has_experience and not has_degree) or not meets_age
print(reject_application) # True (rechazado porque no tiene experiencia Y no tiene título)# Esto también se puede escribir usando las leyes de De Morgan:
# aceptar = (experiencia O título) Y cumple edad; rechazar = no aceptar
accept_application = (has_experience or has_degree) and meets_age
reject_application2 = not accept_application
print(reject_application2) # True (mismo resultado, diferente lógica)Cuándo usar las leyes de De Morgan:
- Para hacer que las condiciones negativas sean más fáciles de leer
- Para simplificar expresiones lógicas complejas
- Para convertir entre diferentes representaciones de la misma lógica
Desafío
PrincipianteEstás ayudando a una tienda de mascotas a crear un sistema para determinar si pueden vender una mascota a un cliente.
Inicializa las siguientes variables:
has_licensecon el valorTruehas_spacecon el valorTruehas_experiencecon el valorFalse
Escribe expresiones lógicas para determinar si:
can_sell_regular_pet: El cliente puede comprar una mascota regular si tiene O BIEN una licencia O experiencia, Y además debe tener espaciocan_sell_exotic_pet: El cliente puede comprar una mascota exótica si tiene TANTO una licencia COMO experiencia, Y además debe tener espaciocannot_sell_any_pet: La tienda NO PUEDE vender ninguna mascota si el cliente NO tiene licencia Y NO tiene experiencia, O si NO tiene espacio
Resultados esperados con los valores dados:
can_sell_regular_pet:True(tiene licencia y espacio)can_sell_exotic_pet:False(no tiene experiencia)cannot_sell_any_pet:False(tiene tanto licencia como espacio)
Hoja de referencia
Leyes de De Morgan — reglas para transformar expresiones lógicas:
not (A and B)→(not A) or (not B)not (A or B)→(not A) and (not B)
Al distribuir not: cada operando se niega y el operador se invierte (and ↔ or).
# Ejemplo de la primera ley
result = not (number >= 1 and number <= 10)
result = (not number >= 1) or (not number <= 10) # equivalente
# Ejemplo de la segunda ley
result = not (is_student or is_employed)
result = (not is_student) and (not is_employed) # equivalentePruébalo tú mismo
# Inicializar variables
# Calcular condiciones
can_sell_regular_pet =
can_sell_exotic_pet =
cannot_sell_any_pet =
# No elimines las líneas de abajo
print("Can sell regular pet:", can_sell_regular_pet)
print("Can sell exotic pet:", can_sell_exotic_pet)
print("Cannot sell any pet:", cannot_sell_any_pet)Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Fundamentals
4Operadores Parte 2
Operadores lógicos Parte 1Operadores lógicos Parte 2Repaso - Lógica simpleOperadores lógicos Parte 3Operadores lógicos Parte 47Calculadora para dividir la cuenta
Mensaje de bienvenidaObtener la entrada de datos10FizzBuzz con un giro
Descripción general del juegoLa función FizzBuzz2Variables
NúmerosStringBooleanConvenciones de nomenclaturaVariables vacíasRepaso - Inicializar variables8Bucles
Bucle ForBucle WhileBreakContinueRepaso - FactorialLa función RangeBucle anidadoRepaso - Entrada dinámica3Operadores Parte 1
Operadores aritméticosOperador móduloAtajos aritméticosResumen - Matemáticas simplesOperadores de comparación9Funciones
Declarar una funciónArgumentosRetornoResumen - Función SigmaResumen - Función de validaciónValores por defecto