Menu
Coddy logo textTech

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 cambiaand 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)  # True

Segunda 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 andor 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)  # True

Ejemplo 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
challenge icon

Desafío

Principiante

Está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_license con el valor True
  • has_space con el valor True
  • has_experience con el valor False

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 espacio
  • can_sell_exotic_pet: El cliente puede comprar una mascota exótica si tiene TANTO una licencia COMO experiencia, Y además debe tener espacio
  • cannot_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 (andor).

# 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)  # equivalente

Prué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)
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Fundamentals