6 Sentencias condicionales
6.1 Introducción a las sentencias condicionales en Python
Las sentencias de condicionales ayudan a controlar el flujo de la ejecución del código cuando se cumplen ciertas condiciones. Al final de este capítulo los estudiantes podrán:
Explicar cómo las condicionales pueden ser usados en Python.
Describir las sintaxis de las condicionales.
Escribir sentencias de condicionales para controlar el flujo de ejecución.
Remover las repeticiones en el código
Es importante considerar evitar las repeticiones en el código, primero porque será más eficiente y fácil de leer y segundo porque será más fácil la contribución de tus pares. Imagine que se ha copiado y pegado el mismo bloque de código para repetir una tarea en particular. Cualquiera modificación que esa tarea requiera, va a necesitar que el cambio sea hecho en todos los bloques copiados. Esto aumenta el riesgo de cometer errores. Para evitar lo anterior es posible usar tres estrategias: condicionales, loops y funciones.
¿Por qué usar declaraciones condicionales?
Un condicional se usa para determinar si una cierta condición se cumple antes que ciertas líneas de código sean ejecutadas. Esto es muy útil para controlar el flujo de ejecución del código. Se ejecutarán ciertas líneas, mientras ciertas condiciones sean cumplidas. Por ejemplo, las condicionales sirven para revisar si una variable tiene cierto valor, o la existencia de un archivo antes de la ejecución del código.
Estructura de las condicionales
Un condicional usa una estructura de sintaxis basado en las sentencias if y else (cada una termina con :), que definen el potencial de acciones que pueden ser completados basadas en si la condición es verdadera o no.
Si la condición proporcionada en la sentencia if se cumple (como por ejemplo, un resultado True), entonces cierto código será ejecutado. Si esta condición no se cumple (como por ejemplo, un resultado False), entonces el código proporcionado en la sentencia else, será ejecutado.
“Indentación” (Sangrado/Sangría) y la ejecución de líneas de código
Se debe reconocer que Python utiliza la indentación para generar bloques de código. Las indentaciones del código después del if y else son una parte importante de la sintaxis de las condicionales. Estas indentaciones indican cual código debería ser ejecutado con cual sentencia, haciendo que el código sea más fácil de leer. En el ejemplo de arriba, la línea que contiene a print() puede ser reemplazada por cualquier otro código, pero la idea es saber que si la condición del if se cumple se ejecutará esa línea. Vamos a revisar algunos ejemplos.
Comparar valores numéricos usando sentencias condicionales
Es posible escribir sentencias condicionales que usen operadores de comparación (==, <, >, <=, >=) para revisar el valor de una variable contra otro valor o variable.
# Ejemplo de sentencias condicionales
# Asignar 10 a x
x = 10
# Compare x con 10
if x == 10: # Si x es igual a diez...
print("x es igual a 10") # Imprime esto
else: # Si no es asi...
print(f"x tiene un valor de {x} el cual no es igual a 10") # Imprime estox es igual a 10
# Asignar 0 a x
x = 0
# Comparar x con 10
if x == 10: # Si x es igual a diez...
print("x es igual a 10.") # Imprime esto
else: # Si no es asi...
print(f"x tiene una valor de {x} el cual no es igual a 10.") # Imprime estox tiene una valor de 0 el cual no es igual a 10.
Se puede además usar otros operadores para realizar la comparación.
# Asigna 0 a x
x = 0
# Revisar si x es menor que 10
if x < 10:
print(f"x tiene un valor de {x} el cual es menor que 10.")
else:
print(f"x tiene un valor de {x} el cual es mayor que 10.")x tiene un valor de 0 el cual es menor que 10.
Revisar valores usando condicionales
Se pueden usar operadores de pertenencia (ejemplo, in o not in) para escribir sentencias condicionales que permitan revisar si ciertos valores están contenidos dentro de una estructura de datos, tales como una lista, o incluso un string de texto.
# Creamos un lista con la precipitación mensual promedio (mm) en Valdivia, desde Mayo 2023 a Mayo 2024
precip_mensual_prom = [89.6, 187.6, 186.4, 146.4, 144.4 , 43,
92.2, 11, 4.2, 28.8, 11.6, 58.2]
# Revisar si el valor 11 está en la lista
if 11 in precip_mensual_prom:
print("Valor está en la lista.")
else:
print("Valor no está en la lista.")Valor está en la lista.
# Revisar si el valor 12 se encuentra en la lista
if 12 in precip_mensual_prom:
print("Valor está en la lista.")
else:
print("Valor no está en la lista.")Valor no está en la lista.
La condición anterior también puede ser hecha usando el operador de manera opuesta.
# Revisar si el valor 12 no está en la lista
if 12 not in precip_mensual_prom:
print("Valor no está en la lista.")
else:
print("Valor está en la lista.")Valor no está en la lista.
Se pueden usar también operadores de pertenencia para revisar por palabras dentro de un string.
Revisar el tipo de objetos usando sentencias condicionales
Se pueden usar operadores de identidad (ej, is o is not) para escribir sentencias condicionales que permitan revisar si un objeto es de un cierto tipo (ej, int, str, list).
# Asignar un cero a x
x = 0
# Revisar si x es del tipo integer
if type(x) is int:
print(f"{x} es un entero.")
else:
print(f"{x} no es un entero.")0 es un entero.
# Revisar si x es del tipo float
if type(x) is float:
print(f"{x} es un float.")
else:
print(f"{x} no es un float.")0 no es un float.
# Revisar si x no es un string
if type(x) is not str:
print(f"{x} no es un string.")
else:
print(f"{x} es un string.")0 no es un string.
Con operadores de identidad se puede también revisar si un objeto tiene una cierta estructura de datos, como una lista, o incluso comparar su tipo con el tipo de otro objeto.
6.2 Revisando rutas con sentencias condicionales
Se puede usar los condicionales para revisar las rutas (o paths, en inglés) a los accesos de los datos (como por ejemplo, ocupar la función os.path.exists() del paquete os). En el siguiente ejemplo se va a descargar datos que albergan precipitación mensual del año 2000 para la ciudad de Valdivia, Chile (Estación Pichoy). Los datos son proporcionados por el Explorador Climático del Centro de Cienca del Clima y la Resiliencia ((CR)2).
Jerarquía de importación
os (Operative System en inglés) es una librería de Python que entrega una forma de interactuar con el sistema operativo. Si bien, esta librería está instalada en nuestro ambiente, tenemos que llamarlo con el comando import (como se hace de forma similar en R a través de library(paquete)) . De no hacer esto, la librería no se cargará y no podremos ocupar las funciones que esta trae.
De igual manera numpy es un paquete fundamental para la computación científica en Python. NumPy proporciona una estructura de datos eficiente llamada ndarray (array de N-dimensiones) que permite almacenar y manipular grandes conjuntos de datos numéricos de manera rápida y sencilla. Algunas características clave de NumPy incluyen, por ejemplo, funciones matemáticas y lógicas sofisticadas sobre arrays, transformadas discretas de Fourier, álgebra lineal básica, operaciones estadísticas básicas, simulación aleatoria y mucho más. Al igual que os, se carga con import, pero contiene el comando as, el cual permite otorgar un alias a la librería. Esto permite abreviar el nombre del módulo para hacer el código más legible (pasando de numpy a np).
También, EarthPy es un paquete de Python que se creó con el propósito de trabajar más fácilmente con datos espaciales y de teledetección. El objetivo principal de este paquete es facilitar el análisis y la visualización de datos raster y vectoriales, incluyendo un conjunto de funciones que permiten realizar de manera más eficiente actividades comunes en la ciencia de datos geoespaciales. En este caso, la librería quedo abreviada como et.
Es por esto que, para poder ocupar los objetos de las librerías importadas se debe llamar al paquete y el método (o función) se quiera ejecutar siguiendo la sintaxis:
paquete.funcion()
La sintaxis que usa puntos para acceder a métodos y atributos en Python se llama notación de punto o dot notation en inglés.
¿Qué es la notación de punto?
Es la forma en la que accedes a los atributos (variables de instancia) y métodos (funciones) de un objeto en programación orientada a objetos.
En esta notación, el nombre del objeto va seguido de un punto (
.), y luego el nombre del atributo o método al que quieres acceder o invocar.
Por ejemplo, como se mencionó arriba, os.path.exists() llama, desde el módulo os, al submódulo path y por último, ejecuta exists(). Esto sirve para verificar si una ruta dada existe dentro del Sistema Operativo. Cabe destacar que cada módulo, submódulo o paquete tiene sus propias funciones y estructuras, por lo que es recomendable revisar la documentación de cada uno.
Cuando trabajos en Python, es fundamental saber como organizar y estructurar el código para que este sea reutilizable y entendible durante el tiempo. Python ofrece distintos niveles de organización, siendo estos:
Módulo: Es un archivo
.pyque contiene código. Es el nivel más básico.Paquete: Es una carpeta que contiene uno o varios módulos, y tiene un archivo
__init__.pypara indicar que es un paquete.Submódulo: Es un módulo dentro de un paqeute o subpaquete.
/usr/share/miniconda/envs/tallerpython/lib/python3.10/site-packages/earthpy/__init__.py:7: UserWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html. The pkg_resources package is slated for removal as early as 2025-11-30. Refrain from using this package or pin to Setuptools<81.
from pkg_resources import resource_string
Para hacer la descarga de los datos, el paquete earthpy llama al módulo data y luego a la función get_data(). Entonces, et.data.get_data() permite obtener un set de datos, disponibles de forma online a través del parámetro url. Por defecto, los datos descargados desde alguna URL serán guardadas dentro de “earth-analytics/data/earthpy-downloads/”, creando los directorios si estos no existen.
C:\Users\Tu usuario\earth-analytics\data\earthpy-downloads\pp-mensual-prom-pichoy.txt
El ejemplo de abajo ocupa las siguientes funciones:
os.chdir(path): Cambia el directorio de trabajo especificando una ruta (path).os.path.join(path, "ruta"): Permite combinar uno o más argumentos en una sola ruta, teniendo compatibilidad con el sistema operativo de la maquina (ya que por ejemplo, para navegar entre rutas del computador, Unix ocupa/, mientras que Windows usa\). Esta función puede ocupar rutas absolutas, objetos (que representen rutas) o strings.os.getcwd(): Imprime la ruta del directorio de trabajo actual. Similar apwddentro del terminal de Bash.et.io.HOME: Refiere al directorio de trabajo predeterminado.os.path.exist(path): Verifica si una ruta especificada existe en el sistema de archivos. Puede ser un archivo o un directorio. DevuelveTruesi la ruta existe yFalsesi no.np.loadtxt(): Se utiliza para cargar datos de un archivo de texto en un array de NumPy. Esta función es útil para leer datos numéricos en formato de texto, como archivos.csvo.txt.
C:\Users\Tu usuario\earth-analytics
data\earthpy-downloads\pp-mensual-prom-pichoy.txt
[ 22.7 155.6 45.4 125.2 132.6 784.2 271.3 157.7 161.6 66.6 74.7 65.7]
<class 'numpy.ndarray'>
6.3 Sentencias condicionales con alternativas o condiciones combinadas
En esta lección los estudiantes aprenderán:
Describir la sintaxis para sentencias condicionales con alternativas o combinaciones de condiciones en Python.
Escribir sentencias condicionales con condiciones alternativas o combinaciones de condiciones en Python.
Sentencias condicionales con condicionales alternativas
En la lección anterior se revisó cómo escribir sentencias condicionales que revisan por una condición antes de ejecutar algo de código.
# Ejecuta si la condición es verdadera
a = 10
if (a == 10):
print("Condición es verdadera.")
else:
print("Condición es falsa.")Condición es verdadera.
Ahora se puede expandir esta sintaxis para una condición alternativa con la sentencia elif:
Si la primera condición proporcionada por la sentencia condicional if no es verdadera, entonces Python revisará que la condición proporcionada por la sentencia elif.
Si la condición de la sentencia elifes satisfecha, entonces se ejecutará el bloque de código que está dentro de ella.
Sin embargo, si ninguna de las condiciones anteriores es satisfecha, entonces el código dentro del bloque else se ejecutará.
if (a != 10):
print("Primera condición es verdadera.")
elif (a > 10):
print("Primera condición nos es verdadera, pero la condición alternativa es verdadera.")
else:
print("Ninguna de las condiciones anteriores es verdadera.")Ninguna de las condiciones anteriores es verdadera.
Espaciamiento y ejecución de líneas de código
Es bueno recordar que el código de arriba que incluye la función print() puede ser reemplazado por cualquier código ejecutable en Python.
A medida que el código que está dentro de las sentencias if, elif y else se vuelve más grande, es común que se agreguen líneas en blanco para facilitar la lectura y ver cual código se ejecutará con cada sentencia. Sin embargo, la indentación permanece como una parte importante de la sintaxis de las sentencias condicionales.
Revisemos los ejemplos de abajo para ver como funciona elify entender como la sentencia de print() puede ser remplazada por otro código.
En el primer ejemplo, x es comparado con y. La primera condición revisa si x es menor que y, mientras que la condición alternativa revisa si x es mas grande que y.
Como x es menor que y, entonces se cumple la primera condición, lo cual resulta en agregar el valor de 5 a x.
# Setea x igual a 5, y igual a 10
x = 5
y = 10
# Ejecuta código basado en la comparación de x con y
if x < y:
print(f"x comenzó con el valor {x}")
x += 5
print(f"Ahora x tiene el valor {x} el cual es igual a y.")
elif x > y:
print(f"x comenzó con el valor de {x}")
x -= 5
print(f"Ahora x tiene el valor de {x} el cual es igual a y.")
else:
print(f"x comenzó con el valor de {x} el cual ya es igual a y.")x comenzó con el valor 5
Ahora x tiene el valor 10 el cual es igual a y.
En el ejemplo que se muestra a continuación, x posee un valor mas grande que y, de esta manera la primera condición no se cumple. Sin embargo, la segunda condición si se cumple, resultando en la sustracción del valor 5 desde la variable x.
# Setear x igual a 15
x = 15
# Ejecuta código basado en la comparación de x con y
if x < y:
print(f"x comenzó con el valor de {x}")
x += 5
print(f"Ahora x tiene el valor de {x} el cual es igual a y.")
elif x > y:
print(f"x comenzó con el valor de {x}")
x -= 5
print(f"Ahora x tiene el valor de {x} el cual es igual a y.")
else:
print(f"x comenzó con el valor de {x} el cual ya es igual a y.")x comenzó con el valor de 15
Ahora x tiene el valor de 10 el cual es igual a y.
Sin embargo, si se establece que x tiene que el mismo valor que y, ninguna de las dos primeras condiciones se cumplirá, y entonces se ejecutará el código dentro de la sentencia else.
# Setear a x igual a 10
x = 10
# Ejecuta código basado en la comparación de x con y
if x < y:
print(f"x comenzó con el valor de {x}")
x += 5
print(f"Ahora x tiene el valor de {x} el cual es igual a y.")
elif x > y:
print(f"x comenzó con el valor de {x}")
x -= 5
print(f"Ahora x tiene el valor de {x} el cual es igual a y.")
else:
print(f"x comenzó con el valor de {x} el cual ya es igual a y.")x comenzó con el valor de 10 el cual ya es igual a y.
Se puede aplicar también la sintaxis elif para estructurar sentencias condicionales que usen otros operadores, o que revisen valores para strings u objetos.
Por ejemplo, se puede verificar si un string está contenido en otro y definir un nombre de archivo basado en la condición que sea satisfecha.
# Entregar valor a una variable (fname) dependiendo del contenido de "precip"
if "precip" in "temp_mensual_prom":
fname = "temp_mensual_prom"
print(fname)
elif "precip" in "precip_mensual_prom":
fname = "precip_mensual_prom"
print(fname)
else:
print("Ningún textstring contiene la palabra precip.")precip_mensual_prom
Por otra parte, se pueden agregar valores a una lista dependiendo de cual condición se cumple. En el ejemplo mostrado abajo, la primera condición verifica si el último valor de la lista es igual a 58.2 (valor promedio de precipitación para Diciembre).
Como el útimo valor de la lista es 11.6 (precipitación de Noviembre), la primera condición no se cumple.
De esta forma se pasa a revisar la segunda condición. Como esta condición si se cumple (True), se ejecuta el código de elif.
# Lista con la precipitación promedio mensual (mm) para Valdivia, Chile. No incluye Diciembre
precip_mensual_prom = [89.6, 187.6, 186.4, 146.4, 144.4 , 43,
92.2, 11, 4.2, 28.8, 11.6]
# Agrega un valor a la lista dependiendo de los valores de la lista
if precip_mensual_prom[-1] == 58.2:
print(precip_mensual_prom[-1]) # Print último valor de la lista
elif precip_mensual_prom[-1] == 11.6:
precip_mensual_prom += [58.2] # Agrega el valor de Diciembre
print(precip_mensual_prom)
else:
print("El último item de la lista no era 58.2 ni 11.6")[89.6, 187.6, 186.4, 146.4, 144.4, 43, 92.2, 11, 4.2, 28.8, 11.6, 58.2]
Sentencias condicionales con combinación de condiciones
Los operadores lógicos (ejemplo, and, or, not) permiten crear sentencias condicionales que pueden revisar combinaciones de condiciones:
andpara ejecutar código si la totalidad de la condición especificada se cumple.orpara ejecutar código si al menos una de las condiciones especificadas se cumple.notpara ejecutar código solo si la condición especificada no se ha cumplido (se puede usar not en combinación conanduorpara revisar si múltiples condiciones son cumplidas o no)
Evaluar dos condiciones usando and
Se puede evaluar si se cumplen múltiples condiciones usando and entre dos condiciones. Ambas condiciones se deben cumplir para que se ejecute el código que está dentro del bloque if. Esto implica que si una de las condiciones no se cumple, entonces la sentencia condicional ejecuta el código que se encuentra dentro de else.
Por ejemplo, se puede evaluar si dos variables son enteros y si se cumple, sumarlas.
# Asignar los valores de 5 y 10 para x e y, respectivamente
x = 5
y = 10
# Sumar x e y si ambas son numeros enteros
if type(x) is int and type(y) is int:
print(x + y)
else:
print("Ninguna de ellas, ya sea x ó y son enteros.")15
# Asignar 5 a x y un string a y
x = 5
y = "Algo de texto"
# Sumar x con y, si ambas son enteros
if type(x) is int and type(y) is int:
print(x + y)
else:
print("Ninguna de ellas, ya sea x ó y son enteros.")Ninguna de ellas, ya sea x ó y son enteros.
Es posible también revisar si dos objetos son del mismo tipo y longitud.
# Crear una lista con abreviaciones de los meses del año, falta diciembre
meses = ["Ene", "Feb", "Mar", "Abr", "May", "Jun",
"Jul", "Ago", "Sep", "Oct", "Nov"]
# Longitud de precip_mensual_prom
precip_len = len(precip_mensual_prom)
print(precip_len)
# Longitud de la lista
meses_len = len(meses)
print(meses_len)12
11
Evalua si al menos se cumple una condición usando or
Se puede escribir sentencias condicionales que evaluen si al menos una de las condiciones es verdadera. Para esto se puede usar or entre dos condiciones. Acá solo es necesario que al menos una condición sea verdadera para ejecutar el bloque del if.
# Asigna 0 a x, 10 a y
x = 0
y = 10
# Revisa si alguna de ellas es igual a cero
if x == 0 or y == 0:
print("Ni x ó y es igual a 0.")
x += 1
y += 1
print(f"x es ahora {x} ahora y es {y}")
else:
print("Ni x o y es igual a 0.")Ni x ó y es igual a 0.
x es ahora 1 ahora y es 11
Otro ejemplo puede servir para recordar que las sentencias condicionales permiten comparar los tipos y longitudes de dos listas.
La primera condición es verdadera, de modo que ambos objetos comparados son listas, pero la segunda condición no es verdadera porque en la lista de meses, falta Dic.
Si se usa la sentencia de or, solo una condición necesita ser verdadadera para que el bloque de código de if puede ejecutarse.
# Evalua si hay coincidencia entre el tipo de dato y la longitud
if type(precip_mensual_prom) is type(meses) or precip_len == meses_len:
print("Los objetos, o tienen el mismo tipo de datos o la misma longitud.")
else:
print("Los objetos, o no tienen el mismo tipo de datos o la misma longitud.")Los objetos, o tienen el mismo tipo de datos o la misma longitud.
Ayudantía
Disponible la ayudantía que contiene los ejercicios visto en clase: