# Crear una lista con 5 objetos
lista_valores = [1, 2, 3, 4, 5]
# Imprimir por pantalla cada valor separadamente
print(lista_valores[0])
print(lista_valores[1])
print(lista_valores[2])
print(lista_valores[3])
print(lista_valores[4])1
2
3
4
5
Los loops son útiles para reducir la escritura de código en circunstancias donde iterativamente se ejecuta el mismo código sobre un rango o una lista de valores.
En este capítulo se aprenderá los tipos básicos de loops en Python y cómo usarlos. Después de completarlo los estudiantes serán capaces de:
Explicar cómo el uso de Loops te ayuda a no repetir código.
Describir la sintaxis para los dos tipos básicos de Loops en Python el while y for.
Remover repeticiones de código a través de uso de Loops para automatizar tareas con datos
Un loop es una secuencia de operaciones que son ejecutadas una y otra vez en un orden específico. Los loops pueden ayudar a eliminar la repetición de código, remplazando líneas de código duplicadas con una iteración. Esto significa que se puede ejecutar iterativamente el mismo código o bloque hasta que se alcance un punto de término.
En lugar de estar copiando y pegando el mismo código una y otra vez para correrlo múltiples veces (ejemplo, sobre muchas variables o archivos), se puede crear un loop que contenga una instrucción para ser ejecutada iterativamente sobre una lista o un rango de valores proporcionados.
Por ejemplo, las líneas siguientes podrían ser reemplazadas por un loop que itere sobre una lista de nombres variables y ejecute la función print() hasta que se alcance el final de la lista:
# Crear una lista con 5 objetos
lista_valores = [1, 2, 3, 4, 5]
# Imprimir por pantalla cada valor separadamente
print(lista_valores[0])
print(lista_valores[1])
print(lista_valores[2])
print(lista_valores[3])
print(lista_valores[4])1
2
3
4
5
Se puede crear un loop que itere a través de cada valor de la lista, imprimiéndolo.
1
2
3
4
5
Una vez que se tiene acceso a los valores de la lista, se puede mejorar la sentencia del print agregando algo de texto.
# Loop que itera sobre cada objeto e imprime su valor
for valor in lista_valores:
print("El valor actual es: ", valor)El valor actual es: 1
El valor actual es: 2
El valor actual es: 3
El valor actual es: 4
El valor actual es: 5
También se pueden usar Loops para modificar iterativamente cada valor de la lista.
# Loop que itera sobre cada objeto, le suma 1 e imprime su valor
for valor in lista_valores:
print(f"El valor actual es: {valor + 1}")El valor actual es: 2
El valor actual es: 3
El valor actual es: 4
El valor actual es: 5
El valor actual es: 6
Se puede crear listas de variables, nombres de archivos, u otros objetos con estructuras de datos sobre los cuales se puede iterar y ejecutar el mismo código. Es posible también proporcionar un rango numérico de valores para controlar cuantas veces se tiene que ejecutar el código.
En Python hay dos estructuras principales para los Loops: while y for. Aprenderemos a usar cada uno de ellos para evitar escribir el mismo código.
for Loops en PythonUn Loop de tipo for ejecutará iterativamente el código para cada item a una lista predefinida. Esta lista puede estar compuesta de valores numéricos, nombres de archivos, caracteres individuales en un string de texto y objetos tales como estructuras de datos. La sintaxis para el for loop se compone de:
La palabra for que da inicio al loop.
El elemento que representará a cada elemento a iterar (usualmente se ocupa i por ítem, sin embargo, se le puede dar cualquier notación).
Una lista predefinida explícitamente referenciada en el loop.
Regla de los dos puntos (:) y la identación de las líneas de código que será iteradas, semejante a la estructura de las condicionales vistas en la sección anterior
Es importante resaltar que la lista sobre la cual se iterará debe definida antes del loop.
El elemento marcador que representa a los items de la lista lista_predefinida (el cual es i) tendrá, como valor inicial, el primer elemento de la lista. A medida de que el loop itere a través de esta, el valor de i cambiará para almacenar el valor de próximo elemento de la lista.
En el ejemplo mostrado abajo, se crea una lista con 4 elementos que no son secuenciales. El loop ejecuta el código proporcionado sobre cada item de la lista.
lista_predefinida = [12, 5, 136, 10]
for i in lista_predefinida: # para cada elemento (i) dentro de la lista...
i += 10 # suma y asigna el resultado a i
print(i) # muestra i22
15
146
20
Note que en este ejemplo, los valores de la lista no son secuenciales y no siguen un patrón. Sin embargo, el loop es ejecutado sobre cada uno de ellos en el mismo orden en los cuales están definidos en la lista. Esta es una característica única de los for Loops. El marcador representa el valor de cualquier item que esta siendo accedido desde la lista en esa iteración. De esta forma i no es un valor predefinido, sino mas bien es un marcador para el item actual sobre el cual el loop está trabajando con cada iteración del código.
Esto significa que se podría usar cualquier palabra o caracter para indicar el marcador, con la excepción de valores numéricos. Simplemente se emplea para reusar la misma palabra o caracter en las líneas de código que están siendo ejecutadas y así, usar el marcador para que acceda a los items de la lista. Por ejemplo, el marcador podría ser llamado x ó z ó loquesea.
# Crea una lista de valores enteros
lista_predefinida = [12, 5, 136, 10]
# Para cada elemento de la lista, se le suma 10 y se imprime el nuevo valor
for x in lista_predefinida:
x += 10
print(f"El valor de la variable 'x' es: {x}")El valor de la variable 'x' es: 22
El valor de la variable 'x' es: 15
El valor de la variable 'x' es: 146
El valor de la variable 'x' es: 20
# Crea una lista de valores enteros
lista_predefinida = [12, 5, 136, 10]
# Para cada elemento de la lista, se le suma 10 y se imprime el nuevo valor
for loquesea in lista_predefinida:
loquesea += 10
print("El valor de la variable 'loquesea' es: ", loquesea)El valor de la variable 'loquesea' es: 22
El valor de la variable 'loquesea' es: 15
El valor de la variable 'loquesea' es: 146
El valor de la variable 'loquesea' es: 20
En el primer ejemplo, lista_predefinida contenía solo valores numéricos, pero también se puede iterar sobre listas que contienen otros tipos, tales como texto string que represente el nombre de archivos o estructuras de datos (incluyendo incluso los nombres de otras listas!).
for Loops con textos StringsEn el ejemplo de abajo, una lista llamada archivos se define con strings que representan dos nombres de archivos. El for Loop se ejecutará iterativamente sobre cada string (representado por el marcador fname en cada iteración).
En la primera iteración del loop, fname es igual al texto "meses.txt", en la segunda iteración, fname es igual al texto "avg-mensual-precip.txt".
# Crea una lista de valores enteros
archivos = ["meses.txt", "avg-mensual-precip.txt"]
# Para cada elemento de la lista, se imprime su valor
for fname in archivos:
print(f"El valor de la variable 'fname' es: {fname}")El valor de la variable 'fname' es: meses.txt
El valor de la variable 'fname' es: avg-mensual-precip.txt
Tenga en cuenta que print() retorna el string que es el nombre del archivo, pero no los valores que existen dentro del archivo. Esto es porque la lista solo contiene los strings para los nombres de los archivos, pero no contiene los valores que alberga el archivo. De hecho, Python no sabe que esos strings son nombres de archivos, para él simplemente se tratan de textos como strings en una lista.
Demos otra mirada a la definición de la lista, se puede notar que los items son solo strings de texto, identificados por las "". Las listas no contienen variables u objetos que no hayan sido definidos (ejemplo, arrays de numpy, o dataframes de pandas). De esta forma, es importante recordar que los objetos que se usen en el Loop determinarán qué salidas serán obtenidas.
Por ejemplo, se puede definir una lista que contenga múltiples objetos (ejemplo, otras listas). En el ejemplo de abajo, la función print() retorna los valores actuales de cada item de la lista porque los items son los objetos definidos (en este ejemplo, cada item es su propia lista de valores).
En cada iteración del loop, dlist representa la lista de datos que se definió: en la primera iteración, meses, y avg_mensual_precip en la segunda iteración.
# Creamos una lista con los nombres abreviados de los meses
meses = ["Ene", "Feb", "Mar", "Abr", "Jun", "Jul", "Ago",
"Sep", "Oct", "Nov", "Dec"]
# Creamos una lista con los valores promedio mensuales (mm) de precipitación
avg_mensual_precip = [17.78, 19.05, 46.99, 74.42, 77.47, 51.31, 49.02,
41.15, 46.74, 33.27, 35.31, 21.34]
# Lista compuesta de listas
listas = [meses, avg_mensual_precip]
# Para cada item en la lista, print su valor
for dlist in listas:
print("El valor de la variable dlist es: ", dlist)El valor de la variable dlist es: ['Ene', 'Feb', 'Mar', 'Abr', 'Jun', 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dec']
El valor de la variable dlist es: [17.78, 19.05, 46.99, 74.42, 77.47, 51.31, 49.02, 41.15, 46.74, 33.27, 35.31, 21.34]
Cuando se trabaja con estructuras de datos como listas, arrays de numpy, o dataframes de pandas, el código que es ejecutado en el loop queda sujeto al tipo de objeto que es proporcionado. Por ejemplo, debido a que los items en listas son listas, se puede ejecutar cualquier código que pueda correr sobre un objeto tipo lista, tales como las consultas de la longitud de la lista, o por el valor de un índice en específico.
# Para cada lista en las listas, print la longitud
for dlist in listas:
print("La longitud de la variable dlist es: ", len(dlist))La longitud de la variable dlist es: 11
La longitud de la variable dlist es: 12
# Para cada lista en las listas, print el valor del último índice
for dlist in listas:
print(f"El valor del último elemento de Listas es: {dlist[-1]}")El valor del último elemento de Listas es: Dec
El valor del último elemento de Listas es: 21.34
Sin embargo, es probable que a veces no se pueda llamar a un método o atributo que no existe para tal estructura de datos. Por ejemplo, mientras que .shape es un atributo de los arrays pertenecientes al paquete numpy que proporciona el número de elementos, o filas y columnas, .shape no es un atributo de las listas. Un intento por llamar a .shape sobre una lista resultará en un error y de esta forma, un fallo en el loop que impide la ejecución del código.
AttributeError: 'list' object has no attribute 'shape'
while LoopsUn while loop es usado para ejecutar código iterativamente bajo una condición predefinida. El loop se ejecutará hasta que la condición ya no se cumpla (como por ejemplo, resultado True o False de un valor). Esa condición podría ser un límite de cuantas veces se desea ejecutar el código o que el resultado del código alcanzara cierto valor (ejemplo, el código se ejecutará iterativamente hasta que el valor actual del resultado sea menor que 10). Después que la condición predefinida ya no se cumpla (ya no es True), el loop no ejecutará otra iteración.
La sintaxis para el while loop se construye con:
La función while, que da inicio al loop.
La condición a evaluar en las iteraciones (en el ejemplo anterior, x es menor a 10)
Finalización con los dos puntos (:)
Bloque de código indentado. Esta indentación es importante, pues le indica que el código será ejecutado como parte del loop donde está contenido, y no se ejecutará después que el loop se haya completado.
Revisemos los ejemplos que se muestran mas abajo para ver en acción el while loop. El primer ejemplo usa un while para que, iterativamente agregue un valor de 1 a la variable x, siempre que el valor actual de x no exceda un valor especificado. En este ejemplo, el operador de comparación (<) es usado para comparar el valor de x (el cual comienza con el valor de 0) con el valor de 10, que es el valor de término designado. Dentro del loop, un operador de asignación (+=) es usado para sumar 1 y asignar el resultado al objeto x. Por último, se imprime x en pantalla. Este proceso se repite hasta que el valor actual de x ya no sea menor a 10.
# Asignar el valor de 0 a x
x = 0
# Mientras que x sea menor a 10...
while x < 10:
# Sumale 1, asignalo a x y ...
x += 1
# Imprime el resultado
print(x)
# El codigo itera hasta que la condición no sea cierta (hasta que x ya no sea menor a 10)1
2
3
4
5
6
7
8
9
10
Una vez que x alcanza 10, la condición ya no es True (puesto que x ya no es menor que 10), por lo que, el loop finaliza y no ejecuta otra iteración del código. Note que al usar el valor de la variable x como condición para el loop, se debe usar el nombre correcto de la variable dentro de este (ejemplo, x), de manera que la condición pueda revisar el estado de x a medida que el loop itera.
Note también que el código dentro del loop es ejecutado en orden, significando que la función print() se ejecuta después que el valor de 1 es agregado a x. Se puede cambiar el orden si se desea ver el valor de x, antes que el valor de 1 sea agregado.
# Asignar el valor de 0 a x
x = 0
# Sumar 1 a x hasta que x ya no sea inferior a 10
while x < 10:
print(f"El valor de 'x' antes de sumarle 1 es: {x}")
x += 1
# Este print se encuentra fuera del while loop
print("El valor final de x: ", x)El valor de 'x' antes de sumarle 1 es: 0
El valor de 'x' antes de sumarle 1 es: 1
El valor de 'x' antes de sumarle 1 es: 2
El valor de 'x' antes de sumarle 1 es: 3
El valor de 'x' antes de sumarle 1 es: 4
El valor de 'x' antes de sumarle 1 es: 5
El valor de 'x' antes de sumarle 1 es: 6
El valor de 'x' antes de sumarle 1 es: 7
El valor de 'x' antes de sumarle 1 es: 8
El valor de 'x' antes de sumarle 1 es: 9
El valor final de x: 10
En esta versión del loop, el valor de x es impreso primero y luego ocurre el operador de la asignación donde se agrega el valor 1. Es importante destacar que el código que se encuentra fuera del loop no está con la identación (en otras palabras, se encuentra al mismo nivel del loop), ejecutandose solo por una única vez.
Compare el primer while con el código mostrado abajo, el cual cumple con la misma tarea sin usar ningún loop. El while no solo reemplaza muchas líneas de código, evitando asi la repetición, sino que también, hace más fácil el leer y escribir, logrando que el flujo sea más entendible para cualquiera de los involucrados.
# Asigna 0 a x
x = 0
# Agrega 1 a x
x += 1
print(x)
# Agrega 1 a x
x += 1
print(x)
# Agrega 1 a x
x += 1
print(x)
# Agrega 1 a x
x += 1
print(x)
# Agrega 1 a x
x += 1
print(x)
# Agrega 1 a x
x += 1
print(x)
# Agrega 1 a x
x += 1
print(x)
# Agrega 1 a x
x += 1
print(x)
# Agrega 1 a x
x += 1
print(x)
# Agrega 1 a x
x += 1
print(x)1
2
3
4
5
6
7
8
9
10
Además de usar los operadores de comparación para comparar valores, se puede también especificar un rango de valores para limitar la duración del while loop. El rango es inclusivo del valor inicial, pero no del valor final.
# Asigna 1 a x
x = 1
# Agrega 1 a x, mientras x esté entre 1 y 5
while x in range(1, 5):
x += 1
print(x)2
3
4
5
Note que la estructura del while permanece igual, a pesar del uso de una condición, dos puntos y de las indentaciones del código que será iterado. En este ejemplo, mas que usar un operador de comparación explícita, se establece que el código de abajo puede continuar ejecutándose mientras que el valor de x permanezca dentro de cierto rango.
Específicamente, el código se ejecutará siempre que el valor de x se encuentre dentro de un rango numérico que comienza en 1 y termina con 5, pero no es inclusivo del 5. De esta forma el loop finaliza cuando x alcanza 5 y no se ejecuta otra iteración del código.
Una función en Python es un conjunto de líneas de código diseñadas para realizar una tarea específica. A diferencia del código ordinario, las funciones agrupan instrucciones concretas en un objeto (de la clase function), lo que permite que sean reutilizables. Esto evita la repetición de código, facilita la creación de soluciones modulares y permite abstraer la información contenida en la función.
La sintaxis de las funciones dentro de Python es la siguiente:
La palabra def, la cual comienza la definición de la función.
El nombre de la función (arbitrario).
Un paréntesis (), especificando los parámetros de entrada dentro de este.
Los dos puntos (:) para inciar con la escritura del código.
EL bloque de código a ejecutar (el cual debe estar identado).
Un return que indica lo que la función tiene que mostrar (opcional).
Aquí va un ejemplo de una función sencilla que permite imprimir la palabra "¡Hola!":
Note que esta función no posee parámetros dentro de los paréntesis (()), por lo que, unicamente se ejecutará el código dentro de esta. Además, di_hola() tampoco tiene un retorno definido (con return), sino unicamente el string ¡Hola! en el output, por lo que no se obtiene ningún valor (o None). Esto se puede revisar a tráves de un print()
En este otro caso, vamos a crear una función que te salude personalmente. Para realizar esto, se añadirá el parámetro tu_nombre a la función:
Aquí, el parámetro tu_nombre se ocupa como string para realizar un saludo. Note que para que para ejecutar la función, saludo() no tiene que estar identado.
Ahora, se creará una función que multiplique dos números que nosotros proporcionemos:
Note que aquí se declara textualmente el valor que la función multiplicar debe retornar (que es la multiplicación de ambos números). En este caso, al haber dos parámetros, Python reconoce que numero_1 es 3 y numero_2 es 10. Sin embargo, se puede específicar que los valores que le queremos dar a los parámetros, escribiendolos textualmente. Para esto, vamos a hacer una función que multiplique dos números, te salude y diga la temperatura:
Si quisieramos multiplicar los número 8 y 9, registrar la temperatura 15 y el nombre Usuario2, tenemos que seguir el orden que tienen los parámetros en la función o sino, explicitar literalmente los valores que queremos que tengan los parámetros.
Aquí, no se sigue un orden específico, resultando en un resultado no deseado:
¡Hola 15! La temperatura (que tu registraste) es de 9 °C.
Además, la multiplicación entre 8 y Usuario2 es Usuario2Usuario2Usuario2Usuario2Usuario2Usuario2Usuario2Usuario2
En este caso, al haber dos parámetros, Python reconoce que numero_1 es 3 y numero_2 es 10. Además, se puede especificar que valores (argumentos) le queremos dar a cada parámetro en particular, escribiéndolos textualmente. Para esto, vamos a hacer una función que multiplique dos números, te salude y diga la temperatura:
¡Hola Usuario2! La temperatura (que tu registraste) es de 15 °C.
Además, la multiplicación entre 8 y 9 es 72
Ahora, a pesar de que seguimos el mismo orden que el ejemplo anterior, los argumentos se pasan explícitamente por el nombre del parámetro, logrando que la función resulte como esperábamos.
Dentro de las funciones, se pueden crear objetos para que la función pueda funcionar. Sin embargo, las variables definidas dentro de una solo existirán dentro del ámbito de esa función y no se podrán llamar posteriormente:
NameError: name 'a' is not defined
Al asignar una función a un objeto, se obtendrá el valor que retorna la función (con return). Si la función no retorna nada, se obtendrá un obejeto None y un tipo NoneType. Para este ejemplo, se ocuparán las funciones saludo y multiplicar.
texto = saludo(tu_nombre = "Usuario3")
print(f"El objeto texto tiene {texto} y es de tipo {type(texto)}.")¡Hola Usuario3!
El objeto texto tiene None y es de tipo <class 'NoneType'>.
numeros = multiplicar(numero_1 = 10,
numero_2 = 9)
print(f"El objeto texto tiene {numeros} y es de tipo {type(numeros)}.")El objeto texto tiene 90 y es de tipo <class 'int'>.
En el último caso, el objeto numeros es de tipo int ya que la función multiplicar() retorna la multiplicación entre 10 y 9 (es decir 90). Por otro lado, el objeto texto no tiene nada, ya que la función saludo() solo imprime el texto que se codificó.
Las funciones se pueden complementar con algunos comandos incorporados dentro de Python y/o de otros paquetes (como os, numpy, etc) para ejecutar instrucciones más especializadas o complejas que puedan ahorrar trabajo. Vamos a repasar algunos comandos de Python:
min() y max()Los comandos min() y max() sirven para obtener el valor mínimo y máximo de una secuencia respectivamente. Dicha secuencia puede ser una tupla (la cual se escribe con ()) o una lista (que se define con []):
El valor mas pequeño de la lista [4, 20, 37, 90, 29, 40, 8, 6] es 4, mientras que el mayor es 90.
El valor que se retornará es la división del número máximo con el mínimo, es decir: 22.5.
22.5
input()La función input() permite al usuario ingresar datos directamente con el teclado. Para esto, Python detiene del programa y espera que se escriba algo y se presione Enter para continuar. El texto ingresado se almacena como una cadena de texto (string). Para esto, input() sigue la sintaxis:
input: Inicio el comando seguido de un ().
Texto (con ""): Usualmente se utiliza para explicar qué dato se quiere ingresar.
Tipear manualmente el texto.
Un ejemplo básico que incorpora este comando se muestra a continuación:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer lobortis.
Implementado en una función que haga un saludo con tu nombre, se vería así:
¡Hola, Usario3!
Ten en cuenta que la entrada de texto mediante input() tiene formato string. Por lo tanto, si deseas introducir números y que sean reconocidos como tales (es decir, como tipo int o float), es necesario usar los comandos int() o float(), colocando el input() dentro de estos. Por ejemplo:
def promedio_dos_numeros():
numero1 = int(input("Ingresa el primer numero: "))
numero2 = int(input("Ingresa el segundo numero: "))
# Ingresando los numeros como 7 y 10
print(f"El promedio entre {numero1} y {numero2} es {(numero1 + numero2) / 2}")
return (numero1 + numero2) / 2
promedio_dos_numeros()El promedio entre 10 y 6 es 8.0
8.0
Si introduces texto en lugar de números, se generará el siguiente error. Asumiento de que en numero1 escribí texto:
ValueError: invalid literal for int() with base 10: 'texto'
Este error ocurre porque int() espera valores numéricos, y el string texto no puede ser interpretado como dígitos.
divmod()Esta función toma dos números como argumentos y devuelve una tupla con el cociente y el residuo de la división. Lo interesante de esta función es que entrega dos elementos a través de una tupla, lo que permite crear dos objetos a partir de este comando.
Si deseas almacenar la tupla en un solo objeto:
Sin embargo, si prefieres crear dos objetos, uno con el cociente y otro con el residuo, puedes hacerlo separando los objetos a crear con una coma en la asignación (=). Ten en cuenta el orden de los objetos, ya que la función divmod() siempre devolverá primero el cociente y luego el residuo.
cociente, residuo = divmod(10, 3)
print(f"El cociente es {cociente}.")
print(f"El residuo es {residuo}.")El cociente es 3.
El residuo es 1.
Si deseas incluir esta lógica en una función propia, el código quedaría de la siguiente manera:
# Funcion que analiza si el número es par o no. De ser par se multiplica por 10, y si es impar, se multiplica por 100
def par_o_impar(numero):
cociente, residuo = divmod(numero, 2)
if residuo == 0:
print(f"El número es par, por lo que quedaría como {numero * 10}. Además, su cociente fue de {cociente}")
else:
print(f"El número es impar, por lo que quedaría como {numero * 100}. Además, su cociente fue de {cociente}")El número es impar, por lo que quedaría como 900. Además, su cociente fue de 4
Disponible la ayudantía que contiene los ejercicios visto en clase. Además, para los que no estén inscritos en el ramo oficialmente y quieran un desafío, se deja disponible el trabajo práctico N°1: