Python

Python

Tutorial Python: Estructuras control condicional

Descubre cómo gestionar el flujo de tus programas en Python, utilizando estructuras de control condicionales. Desde if hasta match-case.

Aprende Python y certifícate

Introducción y objetivos

En la programación, es esencial controlar el flujo de ejecución para dirigir el comportamiento de nuestros programas según distintas condiciones. Las estructuras de control condicionales nos permiten tomar decisiones automáticas dentro del código, ejecutando ciertas acciones solo cuando se cumplen criterios específicos.

En este tema, nos adentraremos en las distintas formas que ofrece Python para implementar este control condicional. A lo largo de esta sección, nuestros objetivos serán:

  • Comprender el uso básico de la declaración if y cómo establecer condiciones simples.
  • Explorar las declaraciones if-else y if-elif-else para manejar múltiples escenarios y tomar decisiones más complejas.
  • Conocer la declaración match-case, una potente herramienta para comparaciones más avanzadas y patrones específicos.
  • Aprender a utilizar operadores lógicos para combinar condiciones y refinar el control del flujo.
  • Profundizar en los condicionales anidados y cómo pueden ayudar a manejar decisiones jerárquicas.
  • Descubrir las expresiones condicionales (también conocidas como condicionales ternarios) para escribir código más conciso.
  • Entender la evaluación de cortocircuito y cómo aprovecharla para optimizar la eficiencia de nuestros programas.

La declaración if en Python

La declaración if es una de las estructuras de control más fundamentales en Python que permite ejecutar un bloque de código solo si se cumple una condición específica. Esta declaración evalúa una expresión y, si el resultado es verdadero (True), procede a ejecutar el bloque de código correspondiente.

La sintaxis básica de la declaración if es la siguiente:

if condición:
    # bloque de código a ejecutar si la condición es verdadera

Es importante destacar que en Python, la indentación es crucial para definir los bloques de código asociados a estructuras de control. Generalmente, se utiliza una sangría de cuatro espacios para el bloque subordinado al if.

Por ejemplo, consideremos el siguiente código:

edad = 20
if edad >= 18:
    print("Eres mayor de edad.")

En este caso, la variable edad se compara con el valor 18. Si la condición edad >= 18 es verdadera, se ejecuta el bloque dentro del if, mostrando el mensaje "Eres mayor de edad." en pantalla.

Si la condición no se cumple (es decir, si es falsa), el bloque de código dentro del if se omite y el programa continúa con la siguiente instrucción después de la estructura condicional.

Otro ejemplo práctico:

temperatura = 30
if temperatura > 25:
    print("Hace calor hoy.")

Aquí, si la variable temperatura es mayor que 25, el programa imprimirá "Hace calor hoy.". De lo contrario, no ocurrirá ninguna acción relacionada con esta condición.

Es común utilizar operadores de comparación para establecer condiciones en la declaración if. Algunos operadores de comparación son:

  • ==: igual a
  • !=: diferente de
  • > : mayor que
  • < : menor que
  • >=: mayor o igual que
  • <=: menor o igual que

También es posible utilizar expresiones lógicas más complejas combinando condiciones con los operadores lógicos and, or y not. Por ejemplo:

hora = 10
if hora >= 6 and hora < 12:
    print("Buenos días.")

En este ejemplo, el mensaje "Buenos días." se mostrará solo si hora es mayor o igual a 6 y menor que 12.

Es fundamental recordar que tras la condición en la declaración if, se debe colocar dos puntos :. Olvidar este detalle generará un error de sintaxis en Python.

La declaración if es esencial para la toma de decisiones en los programas, permitiendo que estos reaccionen de manera dinámica según las circunstancias o datos de entrada. Su correcto uso es clave para desarrollar código eficiente y funcional.

La declaración if-else

La declaración if-else en Python permite ejecutar un bloque de código cuando una condición es verdadera y otro bloque alternativo cuando dicha condición es falsa. De esta forma, el programa puede tomar decisiones binarias y seguir caminos diferentes según las circunstancias.

La sintaxis básica es la siguiente:

if condición:
    # Bloque de código si la condición es verdadera
else:
    # Bloque de código si la condición es falsa

Es fundamental mantener una indentación adecuada para que Python interprete correctamente los bloques asociados al if y al else. Ambos bloques deben estar alineados verticalmente y cada instrucción dentro de ellos debe tener una sangría uniforme.

Por ejemplo:

edad = 17
if edad >= 18:
    print("Puedes votar en las elecciones.")
else:
    print("Aún no tienes edad para votar.")

En este caso, si la variable edad es mayor o igual a 18, se imprimirá "Puedes votar en las elecciones."; de lo contrario, se imprimirá "Aún no tienes edad para votar.".

La declaración else se ejecuta únicamente cuando la condición del if es falsa. Esto asegura que siempre se ejecute uno de los dos bloques de código, proporcionando un flujo de control claro y predecible.

Otro ejemplo práctico utilizando entradas del usuario:

contrasena = input("Introduce la contraseña: ")
if contrasena == "secreta123":
    print("Acceso concedido.")
else:
    print("Contraseña incorrecta. Acceso denegado.")

Aquí, el programa compara la cadena de texto introducida por el usuario con la contraseña esperada. Si coinciden, se concede el acceso; de lo contrario, se deniega.

Es posible utilizar operadores lógicos para formar condiciones más complejas:

numero = 15
if numero % 2 == 0:
    print("El número es par.")
else:
    print("El número es impar.")

En este ejemplo, el programa determina si un número es par o impar utilizando el operador módulo %. Si el resto de dividir por 2 es cero, el número es par; si no, es impar.

La declaración else también puede contener múltiples instrucciones, al igual que el bloque if:

saldo = 300
retiro = 500
if saldo >= retiro:
    saldo -= retiro
    print("Retiro exitoso.")
    print(f"Nuevo saldo: {saldo}")
else:
    print("Fondos insuficientes.")
    print(f"Saldo actual: {saldo}")

Aquí, si el saldo es suficiente para el retiro, se actualiza el saldo y se informa al usuario. Si no es suficiente, se notifica al usuario y se muestra el saldo actual.

Es importante recordar que el bloque else es opcional. Sin embargo, su uso es recomendable cuando se desea manejar explícitamente el caso en que la condición inicial no se cumple, asegurando que el programa siempre responda de forma determinista ante cualquier situación.

La declaración if-else es esencial para controlar el comportamiento de los programas en función de diferentes escenarios, permitiendo implementar lógica condicional de manera eficaz y legible.

La declaración if-elif-else

La declaración if-elif-else en Python permite evaluar múltiples condiciones de forma secuencial, ejecutando el bloque de código correspondiente al primer caso que resulte verdadero. Esta estructura es esencial para manejar situaciones con más de dos posibilidades.

La sintaxis general es la siguiente:

if condición1:
    # Bloque de código si condición1 es verdadera
elif condición2:
    # Bloque de código si condición2 es verdadera
elif condición3:
    # Bloque de código si condición3 es verdadera
else:
    # Bloque de código si ninguna condición anterior es verdadera

Es importante destacar que pueden existir tantos bloques elif como sean necesarios, y la cláusula else es opcional. Esta última se ejecuta solo si todas las condiciones anteriores son falsas.

Por ejemplo, supongamos que queremos clasificar un número según su valor:

numero = 0

if numero > 0:
    print("El número es positivo.")
elif numero < 0:
    print("El número es negativo.")
else:
    print("El número es cero.")

En este caso, el programa evalúa si numero es mayor que cero. Si la condición es verdadera, imprime "El número es positivo." y finaliza la evaluación. Si no, procede a verificar si numero es menor que cero. Si esta segunda condición es verdadera, imprime "El número es negativo.". Si ninguna de las anteriores es cierta, ejecuta el bloque else, imprimiendo "El número es cero.".

La declaración elif (contracción de "else if") evita la necesidad de anidar múltiples estructuras if-else, lo que mejora la legibilidad y eficiencia del código. Cada condición se evalúa en orden, y una vez que se encuentra una verdadera, se ejecuta su bloque asociado y se omite el resto.

Otro ejemplo práctico es asignar una calificación basada en una nota numérica:

nota = 87

if nota >= 90:
    print("Calificación: Sobresaliente")
elif nota >= 80:
    print("Calificación: Notable")
elif nota >= 70:
    print("Calificación: Aprobado")
else:
    print("Calificación: Suspenso")

Aquí, el programa asigna una calificación en función del rango en el que se encuentre la nota. Si nota es 87, cumple la condición nota >= 80, por lo que imprime "Calificación: Notable" y no evalúa las siguientes condiciones.

Es fundamental comprender que solo se ejecuta el bloque de código correspondiente a la primera condición verdadera. Por ello, el orden de las condiciones es crucial. Si intercambiamos las cláusulas elif, podríamos obtener resultados incorrectos.

Además, las condiciones pueden incluir operadores lógicos y de comparación para evaluar expresiones más complejas:

edad = 45

if edad < 18:
    print("Eres menor de edad.")
elif 18 <= edad < 65:
    print("Eres adulto.")
else:
    print("Eres mayor de 65 años.")

En este ejemplo, utilizamos comparaciones encadenadas para determinar el rango de la edad. Si la condición 18 <= edad < 65 es verdadera, se considera adulto y se imprime el mensaje correspondiente.

La cláusula else es útil para manejar casos por defecto o situaciones no contempladas en las condiciones previas. No obstante, su uso es opcional y depende de si es necesario cubrir todos los posibles escenarios.

También es posible omitir la cláusula else si no se requiere una acción por defecto:

color = "azul"

if color == "rojo":
    print("El color es rojo.")
elif color == "verde":
    print("El color es verde.")
elif color == "azul":
    print("El color es azul.")

En este caso, si el valor de color no coincide con ninguna de las condiciones, simplemente no se ejecuta ningún bloque de código.

Es recomendable utilizar la estructura if-elif-else para mejorar la claridad y mantener un código limpio, especialmente cuando se manejan múltiples condiciones excluyentes. Esto facilita el mantenimiento y la comprensión del programa a largo plazo.

La declaración match-case

La declaración match-case en Python permite realizar coincidencia estructural de patrones, una forma avanzada de control de flujo que simplifica la evaluación de múltiples condiciones. Introducida en Python 3.10, esta estructura facilita la comparación de una expresión frente a varios patrones, ejecutando el bloque de código correspondiente al primer patrón que coincida.

La sintaxis básica de match-case es:

match expresión:
    case patrón1:
        # Bloque de código si patrón1 coincide
    case patrón2:
        # Bloque de código si patrón2 coincide
    case _:
        # Bloque de código por defecto si ningún patrón coincide

La variable _ actúa como un comodín que coincide con cualquier valor, funcionando como el caso por defecto.

Por ejemplo, considérese una función que clasifica tipos de frutas:

fruta = input("Introduzca una fruta: ")

match fruta:
    case "manzana":
        print("La fruta es una manzana.")
    case "naranja":
        print("La fruta es una naranja.")
    case "plátano":
        print("La fruta es un plátano.")
    case _:
        print("Fruta desconocida.")

Al introducir el nombre de una fruta mediante input(), el programa imprimirá lo que coincida con la expresión match

La declaración match-case es especialmente útil cuando se trabaja con estructuras de datos complejas. Por ejemplo, al procesar tuplas:

punto = (0, 0)

match punto:
    case (0, 0):
        print("El punto está en el origen.")
    case (0, y):
        print(f"El punto está en el eje Y en y={y}.")
    case (x, 0):
        print(f"El punto está en el eje X en x={x}.")
    case (x, y):
        print(f"El punto está en coordenadas x={x}, y={y}.")

En este ejemplo, el patrón (0, 0) coincide si el punto está en el origen. Si ninguna de las condiciones específicas se cumple, el último patrón (x, y) captura cualquier otra coordenada, permitiendo acceso a los valores de x e y.

Es posible agregar guardas a los patrones para refinar aún más las condiciones:

edad = 20

match edad:
    case edad if edad < 18:
        print("Eres menor de edad.")
    case edad if edad >= 18 and edad < 65:
        print("Eres adulto.")
    case edad if edad >= 65:
        print("Eres adulto mayor.")

Las guardas utilizan la palabra clave if para añadir condiciones adicionales al patrón, proporcionando mayor control sobre la lógica de coincidencia.

La declaración match-case también admite patrones anidados y la desestructuración de datos. Por ejemplo, al manejar una lista de diccionarios:

usuarios = [
    {"nombre": "Ana", "rol": "admin"},
    {"nombre": "Luis", "rol": "usuario"},
    {"nombre": "Marta", "rol": "moderador"}
]

for usuario in usuarios:
    match usuario:
        case {"rol": "admin"}:
            print(f"{usuario['nombre']} tiene permisos de administrador.")
        case {"rol": "moderador"}:
            print(f"{usuario['nombre']} puede moderar contenidos.")
        case {"rol": "usuario"}:
            print(f"{usuario['nombre']} es un usuario regular.")
        case _:
            print(f"Rol de {usuario['nombre']} desconocido.")

Aquí, cada diccionario en la lista usuarios se compara con patrones que verifican el valor asociado a la clave "rol", permitiendo acciones específicas según el rol del usuario.

Es importante tener en cuenta que la coincidencia de patrones es más que una simple comparación de valores; permite verificar la estructura y contenido de los datos. Por ejemplo, al evaluar listas con una cantidad variable de elementos:

numeros = [1, 2, 3, 4]

match numeros:
    case []:
        print("La lista está vacía.")
    case [uno]:
        print(f"Un solo elemento: {uno}.")
    case [uno, dos]:
        print(f"Dos elementos: {uno} y {dos}.")
    case [uno, *resto]:
        print(f"Primer elemento: {uno}, resto de la lista: {resto}.")

En este caso, el patrón [uno, *resto] utiliza el operador * para capturar el primer elemento en uno y el resto de los elementos en la lista resto.

La declaración match-case mejora la legibilidad y concisión del código, reduciendo la necesidad de múltiples declaraciones if-elif-else anidadas. Además, facilita el manejo de casos complejos que involucran múltiples variables y estructuras de datos anidadas.

Al utilizar match-case, es recomendable seguir buenas prácticas:

  • Ordenar los casos desde los patrones más específicos a los más generales para evitar coincidencias inesperadas.
  • Utilizar el comodín _ para capturar casos no previstos y evitar posibles errores de lógica.
  • Aprovechar las guardas para añadir condiciones adicionales sin complicar los patrones.

Es esencial comprender que la coincidencia de patrones en Python es una herramienta avanzada que, bien empleada, puede aumentar significativamente la eficiencia y claridad del código, especialmente en aplicaciones que requieren un procesamiento complejo de datos.

Operadores lógicos en condicionales

Los operadores lógicos permiten combinar y manipular múltiples condiciones en estructuras condicionales, proporcionando un mayor control y flexibilidad en la toma de decisiones dentro de los programas en Python. Los principales operadores lógicos son and, or y not, y se utilizan para construir expresiones lógicas más complejas.

Operador and

El operador and devuelve True si ambas condiciones son verdaderas. Se utiliza para asegurar que varias condiciones se cumplan simultáneamente.

Ejemplo:

edad = 25
ingresos = 30000

if edad >= 18 and ingresos >= 20000:
    print("Eres elegible para el crédito.")

En este caso, la condición es verdadera solo si edad es mayor o igual a 18 y ingresos es mayor o igual a 20000. Si alguna de las condiciones es falsa, el bloque de código no se ejecuta.

Operador or

El operador or devuelve True si al menos una de las condiciones es verdadera. Es útil cuando se desea que se cumpla una condición u otra.

Ejemplo:

dia = "sábado"

if dia == "sábado" or dia == "domingo":
    print("Es fin de semana.")

Aquí, se imprime "Es fin de semana." si dia es sábado o domingo. La condición se cumple si cualquiera de las dos comparaciones es verdadera.

Operador not

El operador not invierte el valor lógico de una condición. Si la condición es verdadera, not la convierte en falsa, y viceversa.

Ejemplo:

llueve = False

if not llueve:
    print("Podemos salir al parque.")

En este ejemplo, el mensaje se imprime si no está lloviendo. El operador not convierte llueve en True si su valor es False.

Combinación de operadores lógicos

Es posible combinar múltiples operadores lógicos para crear expresiones más complejas. Al hacerlo, es importante considerar el orden de evaluación y utilizar paréntesis para agrupar condiciones y mejorar la legibilidad.

Ejemplo:

edad = 17
permiso_parental = True

if (edad >= 18) or (edad >= 16 and permiso_parental):
    print("Puedes obtener la licencia de conducir.")
else:
    print("No cumples los requisitos para la licencia.")

En este caso, se verifica si la persona es mayor de 18 años o si tiene al menos 16 años y cuenta con permiso parental. El uso de paréntesis ayuda a definir claramente las condiciones combinadas.

Precedencia de operadores lógicos

En Python, el orden de precedencia de los operadores lógicos es:

  1. not
  2. and
  3. or

Esto significa que las expresiones con not se evalúan primero, luego and y finalmente or. Sin embargo, es una buena práctica usar paréntesis para hacer explícita la evaluación deseada y evitar confusiones.

Ejemplo sin paréntesis:

a = True
b = False
c = not b

resultado = a or b and c
print(resultado)  # Imprime True

En este ejemplo, la evaluación se realiza como a or (b and c). Si se desea modificar el orden de evaluación, se deben utilizar paréntesis:

resultado = (a or b) and c
print(resultado)  # Imprime True

Uso de condiciones complejas en declaraciones if

Los operadores lógicos permiten escribir condiciones más compactas y claras, evitando anidar múltiples declaraciones if. Esto mejora la legibilidad y facilita el mantenimiento del código.

Ejemplo sin operadores lógicos:

usuario = "admin"
contrasena = "1234"

if usuario == "admin":
    if contrasena == "1234":
        print("Acceso concedido.")

Ejemplo utilizando and:

if usuario == "admin" and contrasena == "1234":
    print("Acceso concedido.")

El segundo enfoque es más conciso y fácil de entender, combinando las condiciones con un operador lógico.

Consideraciones al usar operadores lógicos

  • Asegurarse de que las condiciones sean claras y estén correctamente agrupadas.
  • Evitar expresiones excesivamente largas que puedan dificultar la comprensión.
  • Utilizar paréntesis cuando sea necesario para definir el orden de evaluación deseado.

Los operadores lógicos son herramientas esenciales para construir condiciones complejas y controlar el flujo de los programas en Python de manera eficiente y legible.

Condicionales anidados

Los condicionales anidados son estructuras de control que permiten incluir una declaración if dentro de otra. Este enfoque es útil cuando se necesita evaluar múltiples condiciones que dependen unas de otras para determinar el flujo del programa. Sin embargo, es importante utilizarlos con cuidado para mantener la legibilidad del código.

Por ejemplo, supongamos que queremos clasificar a una persona según su edad y su estado civil:

edad = 30
estado_civil = 'soltero'

if edad >= 18:
    if estado_civil == 'casado':
        print('Eres un adulto casado.')
    else:
        print('Eres un adulto soltero.')
else:
    print('Eres menor de edad.')

En este ejemplo, el primer condicional verifica si la persona es mayor o igual a 18 años. Dentro de este bloque if, hay otro if que comprueba el estado civil. Dependiendo de ambas condiciones, el programa imprime un mensaje específico.

Los condicionales anidados también pueden combinarse con declaraciones elif y else para manejar múltiples casos:

edad = 16
permiso_padres = True

if edad >= 18:
    print('Puedes obtener la licencia de conducir.')
else:
    if edad >= 16:
        if permiso_padres:
            print('Puedes obtener la licencia con permiso de tus padres.')
        else:
            print('Necesitas el permiso de tus padres para obtener la licencia.')
    else:
        print('Eres demasiado joven para conducir.')

Aquí, el programa primero verifica si la edad es de 18 años o más. Si no es así, anida otro if para comprobar si la edad es al menos 16. Dentro de este, se evalúa si se cuenta con el permiso de los padres.

Es posible que al anidar muchos condicionales, el código se vuelva difícil de seguir debido a la indentación. Python utiliza la indentación para definir los bloques de código, por lo que es crucial mantenerla correctamente.

Para mejorar la claridad, a veces es preferible utilizar operadores lógicos como and y or en lugar de anidar condicionales. El ejemplo anterior puede reescribirse de manera más concisa:

edad = 16
permiso_padres = True

if edad >= 18:
    print('Puedes obtener la licencia de conducir.')
elif edad >= 16 and permiso_padres:
    print('Puedes obtener la licencia con permiso de tus padres.')
elif edad >= 16 and not permiso_padres:
    print('Necesitas el permiso de tus padres para obtener la licencia.')
else:
    print('Eres demasiado joven para conducir.')

Sin embargo, en algunos casos, los condicionales anidados son necesarios, especialmente cuando una condición solo debe evaluarse dentro del contexto de otra. Por ejemplo:

usuario = 'admin'
contrasena = '1234'

if usuario == 'admin':
    if contrasena == '1234':
        print('Acceso concedido.')
    else:
        print('Contraseña incorrecta.')
else:
    print('Usuario no reconocido.')

En este caso, solo se verifica la contraseña si el usuario es 'admin'. Esto refleja una jerarquía lógica donde cierta verificación depende de un requisito previo.

También es posible anidar más de dos niveles de condicionales, aunque esto puede afectar negativamente a la legibilidad:

a = 5
b = 10
c = 15

if a > b:
    if a > c:
        print('a es el mayor.')
    else:
        if c > b:
            print('c es el mayor.')
        else:
            print('b es el mayor.')
else:
    if b > c:
        print('b es el mayor.')
    else:
        print('c es el mayor.')

Este código determina cuál de las tres variables es la mayor. Sin embargo, su complejidad puede dificultar su comprensión. Una alternativa más clara es:

mayor = a

if b > mayor:
    mayor = b

if c > mayor:
    mayor = c

print(f'El número mayor es {mayor}.')

Utilizar una estructura lineal de condicionales simples puede mejorar la eficiencia y la legibilidad.

Al manipular condicionales anidados, es importante tener en cuenta el alcance y el flujo lógico del programa. Además, considerar el uso de estructuras como match-case o funciones puede simplificar el código en situaciones complejas.

Expresiones condicionales (condicional ternario)

En Python, una expresión condicional o condicional ternario es una forma concisa de realizar una evaluación condicional en una sola línea de código. Permite asignar un valor u ejecutar una expresión en función de una condición, mejorando la legibilidad y reduciendo la cantidad de código necesario.

La sintaxis general de una expresión condicional es:

valor_si_verdadero if condición else valor_si_falso

Este formato evalúa la condición; si es verdadera, devuelve valor_si_verdadero, de lo contrario, devuelve valor_si_falso.

Por ejemplo, consideremos el siguiente caso:

edad = 17
mensaje = "Eres mayor de edad." if edad >= 18 else "Eres menor de edad."
print(mensaje)

Aquí, la variable mensaje recibe el valor "Eres mayor de edad." si edad es mayor o igual a 18. Si no, toma el valor "Eres menor de edad.". Esto evita el uso de una estructura if-else más extensa.

Las expresiones condicionales son especialmente útiles para asignaciones y retornos de funciones donde se necesita decidir entre dos opciones. Por ejemplo:

a = 1

b = 2

print("El máximo es:", a if a > b else b)

La expresión condicional devuelve el número mayor entre a y b.

Es posible anidar expresiones condicionales, aunque se debe tener cuidado de no comprometer la legibilidad del código. Un ejemplo de anidación sería:

edad = 20
categoria = "Menor" if edad < 18 else ("Joven Adulto" if edad < 30 else "Adulto")
print(categoria)

En este caso, si edad es menor que 18, categoria es "Menor"; si no, se evalúa la siguiente expresión condicional para determinar si es "Joven Adulto" o "Adulto".

Sin embargo, cuando las condiciones se vuelven complejas, es preferible utilizar estructuras if-elif-else tradicionales para mantener el código claro.

Las expresiones condicionales también pueden utilizarse dentro de listas por comprensión y otras construcciones. Un ejemplo:

numeros = [1, 2, 3, 4, 5]
paridad = ["par" if n % 2 == 0 else "impar" for n in numeros]
print(paridad)  # Salida: ['impar', 'par', 'impar', 'par', 'impar']

Aquí, se crea una lista paridad que contiene "par" o "impar" según la condición aplicada a cada elemento de numeros.

Es importante notar que la expresión condicional en Python evalúa únicamente la expresión correspondiente al resultado de la condición. Por tanto, si una de las expresiones implica una operación costosa o podría causar un error, es esencial asegurarse de que solo se ejecute cuando corresponda.

Por ejemplo:

dividendo = 10
divisor = 0
resultado = dividendo / divisor if divisor != 0 else "División por cero no permitida"
print(resultado)

En este caso, si divisor es cero, el mensaje "División por cero no permitida" se asigna a resultado, evitando así un error de división entre cero.

Las expresiones condicionales mejoran la concisión del código, pero es fundamental usarlas con criterio para no sacrificar la claridad. En situaciones donde la lógica es compleja o abarca múltiples condiciones, es preferible optar por estructuras condicionales más explícitas.

Otro aspecto a considerar es que, a diferencia de algunos lenguajes que utilizan el operador ternario ? :, en Python se emplea una sintaxis más legible que refleja el lenguaje natural.

Comparando con el uso tradicional de if-else, el beneficio principal de las expresiones condicionales radica en su capacidad para escribir código más compacto sin crear bloques adicionales. Por ejemplo:

# Uso de if-else tradicional
if condición:
    variable = valor_verdadero
else:
    variable = valor_falso

# Uso de expresión condicional
variable = valor_verdadero if condición else valor_falso

Este enfoque puede hacer el código más elegante y facilitar su mantenimiento, siempre que se mantenga la claridad.

Evaluación de cortocircuito y optimización

La evaluación de cortocircuito es una característica fundamental en Python que permite optimizar la ejecución de expresiones lógicas y condicionales. Al comprender y utilizar este comportamiento, podemos escribir código más eficiente y seguro, evitando evaluaciones innecesarias y posibles errores.

En Python, los operadores lógicos and, or y not emplean evaluación de cortocircuito para determinar el resultado de una expresión sin tener que evaluar todas las condiciones. Este mecanismo es especialmente útil para optimizar el flujo de control y mejorar el rendimiento de nuestros programas.

Por ejemplo, consideremos la siguiente expresión con el operador and:

if condicion_a and condicion_b:
    # Código a ejecutar si ambas condiciones son verdaderas

Aquí, si condicion_a es falsa, Python no evalúa condicion_b, ya que el resultado del operador and será necesariamente falso. Esto puede ahorrar tiempo de ejecución, especialmente si condicion_b es una operación costosa o compleja.

Del mismo modo, con el operador or:

if condicion_a or condicion_b:
    # Código a ejecutar si al menos una condición es verdadera

En este caso, si condicion_a es verdadera, Python no evalúa condicion_b, dado que el resultado de or ya es verdadero. La evaluación de cortocircuito permite evitar evaluaciones innecesarias y potenciales errores en condicion_b.

Uso para prevenir errores

Una de las aplicaciones más importantes de la evaluación de cortocircuito es prevenir errores que podrían surgir al evaluar ciertas condiciones. Por ejemplo, al verificar si una lista no está vacía antes de acceder a uno de sus elementos:

lista = []

if lista and lista[0] == 'Python':
    print("El primer elemento es 'Python'.")

En este ejemplo, si lista está vacía, la primera condición lista es falsa, y Python no intenta evaluar lista[0] == 'Python', evitando así un IndexError por intentar acceder a un índice inexistente.

Otro caso común es evitar una división por cero:

dividendo = 10
divisor = 0

if divisor != 0 and dividendo / divisor > 1:
    print("El resultado de la división es mayor que 1.")
else:
    print("No es posible dividir entre cero.")

Aquí, si divisor es cero, la primera condición divisor != 0 es falsa, y Python no evalúa dividendo / divisor > 1, evitando un ZeroDivisionError.

Optimización del rendimiento

La evaluación de cortocircuito también puede ser utilizada para mejorar el rendimiento de los programas, especialmente cuando trabajamos con operaciones que requieren mucho tiempo de cómputo. Al ubicar las condiciones más simples o rápidas al principio de una expresión lógica, podemos reducir el tiempo de ejecución general.

Por ejemplo:

if usuario_esta_autenticado and tiene_permiso_avanzado and realizar_operacion_cara():
    # Ejecutar operación

Si usuario_esta_autenticado es falso, Python no evaluará tiene_permiso_avanzado ni llamará a realizar_operacion_cara(), ahorrando recursos y tiempo.

Es recomendable ordenar las condiciones desde la más simple o más probable de ser falsa (en el caso de and) al principio, para aprovechar al máximo la evaluación de cortocircuito. En el caso de or, conviene ubicar primero las condiciones más propensas a ser verdaderas.

Consideraciones sobre efectos secundarios

Es importante tener precaución al utilizar funciones con efectos secundarios dentro de condiciones que pueden ser cortocircuitadas. Si una función modifica el estado del programa o tiene acciones como escribir en un archivo o base de datos, es posible que no se ejecute si la condición anterior determina el resultado.

Por ejemplo:

acceso_registrado = True

acceso_permitido = False

if acceso_permitido or acceso_registrado:
    print("Acceso concedido.")

En este caso, si acceso_permitido es verdadero, la variable acceso_registrado no se evaluará debido al cortocircuito del operador or. Si es necesario que acceso_registrado se evalue siempre, debemos reorganizar el código:

if acceso_permitido:
    print("Acceso concedido.")
else:
    if acceso_registrado:
        print("Acceso concedido.")

O separar la llamada a la variable:

if acceso_permitido or (acceso_registrado and True):
    print("Acceso concedido.")

Evaluación en expresiones condicionales

La evaluación de cortocircuito también se aplica en las expresiones condicionales y puede ser aprovechada para escribir código más seguro. Por ejemplo:

resultado = funcion_pesada() if condicion else valor_por_defecto

Aquí, funcion_pesada() solo se ejecutará si condicion es verdadera, optimizando el uso de recursos.

Uso con any() y all()

Las funciones integradas any() y all() también emplean evaluación de cortocircuito. Por ejemplo, con any(), se detiene la evaluación al encontrar un valor verdadero:

numeros = [0, 0, 1, 0]

if any(numeros):
    print("Al menos un número es no cero.")

En este caso, any() no evalúa todos los elementos una vez que encuentra 1.

Con all(), la evaluación se detiene al encontrar un valor falso:

condiciones = [True, True, False, True]

if all(condiciones):
    print("Todas las condiciones son verdaderas.")
else:
    print("Al menos una condición es falsa.")

La función all() detecta el falso y no continúa evaluando, optimizando el rendimiento.

Buenas prácticas

Para aprovechar al máximo la evaluación de cortocircuito y optimizar el código:

  • Ordenar las condiciones adecuadamente: ubicar primero las que pueden determinar el resultado sin necesidad de evaluar las demás.
  • Evitar colocar funciones con efectos secundarios en condiciones que podrían no evaluarse.
  • Utilizar la evaluación de cortocircuito para prevenir errores y excepciones.
  • Ser consciente del comportamiento de los operadores lógicos y cómo afectan el flujo de ejecución.

CONSTRUYE TU CARRERA EN IA Y PROGRAMACIÓN SOFTWARE

Accede a +1000 lecciones y cursos con certificado. Mejora tu portfolio con certificados de superación para tu CV.

30 % DE DESCUENTO

Plan mensual

19.00 /mes

13.30 € /mes

Precio normal mensual: 19 €
63 % DE DESCUENTO

Plan anual

10.00 /mes

7.00 € /mes

Ahorras 144 € al año
Precio normal anual: 120 €
Aprende Python online

Ejercicios de esta lección Estructuras control condicional

Evalúa tus conocimientos de esta lección Estructuras control condicional con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.

Módulo math

Python
Puzzle

Reto herencia

Python
Código

Excepciones

Python
Test

Introducción a Python

Python
Test

Reto variables

Python
Código

Funciones Python

Python
Puzzle

Reto funciones

Python
Código

Módulo datetime

Python
Test

Reto acumulación

Python
Código

Reto estructuras condicionales

Python
Código

Polimorfismo

Python
Test

Módulo os

Python
Test

Reto métodos dunder

Python
Código

Diccionarios

Python
Puzzle

Reto clases y objetos

Python
Código

Reto operadores

Python
Código

Operadores

Python
Test

Estructuras de control

Python
Puzzle

Funciones lambda

Python
Test

Reto diccionarios

Python
Código

Reto función lambda

Python
Código

Encapsulación

Python
Puzzle

Reto coleciones

Python
Proyecto

Reto funciones auxiliares

Python
Código

Crear módulos y paquetes

Python
Puzzle

Módulo datetime

Python
Puzzle

Excepciones

Python
Puzzle

Operadores

Python
Puzzle

Diccionarios

Python
Test

Reto map, filter

Python
Código

Reto tuplas

Python
Código

Proyecto gestor de tareas CRUD

Python
Proyecto

Tuplas

Python
Puzzle

Variables

Python
Puzzle

Tipos de datos

Python
Puzzle

Conjuntos

Python
Test

Reto mixins

Python
Código

Módulo csv

Python
Test

Módulo json

Python
Test

Herencia

Python
Test

Análisis de datos de ventas con Pandas

Python
Proyecto

Reto fechas y tiempo

Python
Proyecto

Reto estructuras de iteración

Python
Código

Funciones

Python
Test

Reto comprehensions

Python
Código

Variables

Python
Test

Reto serialización

Python
Proyecto

Módulo csv

Python
Puzzle

Reto polimorfismo

Python
Código

Polimorfismo

Python
Puzzle

Clases y objetos

Python
Código

Reto encapsulación

Python
Código

Estructuras de control

Python
Test

Importar módulos y paquetes

Python
Test

Módulo math

Python
Test

Funciones lambda

Python
Puzzle

Reto excepciones

Python
Código

Listas

Python
Puzzle

Reto archivos

Python
Proyecto

Encapsulación

Python
Test

Reto conjuntos

Python
Código

Clases y objetos

Python
Test

Instalación de Python y creación de proyecto

Python
Test

Reto listas

Python
Código

Tipos de datos

Python
Test

Crear módulos y paquetes

Python
Test

Tuplas

Python
Test

Herencia

Python
Puzzle

Reto acceso a sistema

Python
Proyecto

Proyecto sintaxis calculadora

Python
Proyecto

Importar módulos y paquetes

Python
Puzzle

Clases y objetos

Python
Puzzle

Módulo os

Python
Puzzle

Listas

Python
Test

Conjuntos

Python
Puzzle

Reto tipos de datos

Python
Código

Reto matemáticas

Python
Proyecto

Módulo json

Python
Puzzle

Todas las lecciones de Python

Accede a todas las lecciones de Python y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Introducción A Python

Python

Introducción

Instalación Y Creación De Proyecto

Python

Introducción

Tema 2: Tipos De Datos, Variables Y Operadores

Python

Introducción

Instalación De Python

Python

Introducción

Tipos De Datos

Python

Sintaxis

Variables

Python

Sintaxis

Operadores

Python

Sintaxis

Estructuras De Control

Python

Sintaxis

Funciones

Python

Sintaxis

Estructuras Control Iterativo

Python

Sintaxis

Estructuras Control Condicional

Python

Sintaxis

Testing Con Pytest

Python

Sintaxis

Listas

Python

Estructuras De Datos

Tuplas

Python

Estructuras De Datos

Diccionarios

Python

Estructuras De Datos

Conjuntos

Python

Estructuras De Datos

Comprehensions

Python

Estructuras De Datos

Clases Y Objetos

Python

Programación Orientada A Objetos

Excepciones

Python

Programación Orientada A Objetos

Encapsulación

Python

Programación Orientada A Objetos

Herencia

Python

Programación Orientada A Objetos

Polimorfismo

Python

Programación Orientada A Objetos

Mixins Y Herencia Múltiple

Python

Programación Orientada A Objetos

Métodos Especiales (Dunder Methods)

Python

Programación Orientada A Objetos

Composición De Clases

Python

Programación Orientada A Objetos

Funciones Lambda

Python

Programación Funcional

Aplicación Parcial

Python

Programación Funcional

Entrada Y Salida, Manejo De Archivos

Python

Programación Funcional

Decoradores

Python

Programación Funcional

Generadores

Python

Programación Funcional

Paradigma Funcional

Python

Programación Funcional

Composición De Funciones

Python

Programación Funcional

Funciones Orden Superior Map Y Filter

Python

Programación Funcional

Funciones Auxiliares

Python

Programación Funcional

Reducción Y Acumulación

Python

Programación Funcional

Archivos Comprimidos

Python

Entrada Y Salida Io

Entrada Y Salida Avanzada

Python

Entrada Y Salida Io

Archivos Temporales

Python

Entrada Y Salida Io

Contexto With

Python

Entrada Y Salida Io

Módulo Csv

Python

Biblioteca Estándar

Módulo Json

Python

Biblioteca Estándar

Módulo Datetime

Python

Biblioteca Estándar

Módulo Math

Python

Biblioteca Estándar

Módulo Os

Python

Biblioteca Estándar

Módulo Re

Python

Biblioteca Estándar

Módulo Random

Python

Biblioteca Estándar

Módulo Time

Python

Biblioteca Estándar

Módulo Collections

Python

Biblioteca Estándar

Módulo Sys

Python

Biblioteca Estándar

Módulo Statistics

Python

Biblioteca Estándar

Módulo Pickle

Python

Biblioteca Estándar

Módulo Pathlib

Python

Biblioteca Estándar

Importar Módulos Y Paquetes

Python

Paquetes Y Módulos

Crear Módulos Y Paquetes

Python

Paquetes Y Módulos

Entornos Virtuales (Virtualenv, Venv)

Python

Entorno Y Dependencias

Gestión De Dependencias (Pip, Requirements.txt)

Python

Entorno Y Dependencias

Python-dotenv Y Variables De Entorno

Python

Entorno Y Dependencias

Acceso A Datos Con Mysql, Pymongo Y Pandas

Python

Acceso A Bases De Datos

Acceso A Mongodb Con Pymongo

Python

Acceso A Bases De Datos

Acceso A Mysql Con Mysql Connector

Python

Acceso A Bases De Datos

Novedades Python 3.13

Python

Características Modernas

Operador Walrus

Python

Características Modernas

Pattern Matching

Python

Características Modernas

Instalación Beautiful Soup

Python

Web Scraping

Sintaxis General De Beautiful Soup

Python

Web Scraping

Tipos De Selectores

Python

Web Scraping

Web Scraping De Html

Python

Web Scraping

Web Scraping Para Ciencia De Datos

Python

Web Scraping

Autenticación Y Acceso A Recursos Protegidos

Python

Web Scraping

Combinación De Selenium Con Beautiful Soup

Python

Web Scraping

Accede GRATIS a Python y certifícate

En esta lección

Objetivos de aprendizaje de esta lección

  • Entender la declaración "if" y su sintaxis básica.
  • Manejar "if-else" para decisiones binarias.
  • Implementar "if-elif-else" para múltiples condiciones.
  • Usar "match-case" para patrones complejos.
  • Utilizar operadores lógicos para combinar condiciones.
  • Profundizar en condicionales anidados.
  • Implementar expresiones condicionales para un código conciso.
  • Aplicar la evaluación de cortocircuito para optimización.