Ciclos
Un ciclo es una forma de evitar repetir código muchas veces
1
razas = ["bulldog", "chihuahua", "beagle", "golden", "labrador", "pug"]
Copied!
1
>>> print(razas[0])
2
bulldog
3
>>> print(razas[1])
4
chihuahua
5
>>> print(razas[2])
6
beagle
7
>>> print(razas[3])
8
golden
9
>>> print(razas[4])
10
labrador
11
>>> print(razas[5])
12
pug
Copied!
Como ves en el ejemplo anterior, para poder imprimir cada elemento de la lista, tuvimos que hacer un print por cada uno de ellos. Esto no es eficiente, ¿que tal si tenemos una lista de 1.000 o 10.000 elementos y debemos imprimirlos todos? Sería un problema.

Ciclo for

Un ciclo for nos permite correr una acción en cada uno de los ítems de la lista. Usar cada uno de los elementos de la lista se llama iterar. La sintaxis en Python de un ciclo for es la siguiente:
1
for <variable temporal> in <lista>:
2
<acción>
Copied!
Nota cuando usamos código explicativo del tipo <variable temporal> nos estamos refiriendo a "pseudo-código".
Revisemos cada uno de estos bloques constructores del ciclo for:
    : puede ser llamada como quiera y no tiene que estar definida con anticipación.
    : es la lista sobre la cual queremos iterar
    : es la acción que queremos ejecutar sobre cada elemento de la lista, según nuestro anterior ejemplo, sería un pint(). Esa es la acción
Volvamos a realizar el mismo ejercicio, pero usando el ciclo for
1
for i in razas:
2
print(i)
Copied!
resultado
1
bulldog
2
chihuahua
3
beagle
4
golden
5
labrador
6
pug
Copied!
Con solo dos líneas de código imprimos todos los ítems de una lista, sin importar su tamaño. Ahora, ¿qué pasa si cambiamos el nombre de la variable temporal i por raza?
1
for raza in razas:
2
print(raza)
Copied!
Sigue funcionando sin problemas, y dando el mismo resultado. Una buena práctica aquí es llamar las listas en plural y la variable temporal en singular. Sin embargo encontrás multiples ejemplos donde la variable temporal es llamada i o j, pero recuerda que esto no influye en el resultado final.
Todo lo que esté al mismo nivel de indentación después de la declaración del ciclo for estará incluido dentro del ciclo y corre en cada iteración. Si olvidamos indentar, obtendremos un IndentationError

Usando Range con Ciclos

Anteriormente iteramos sobre una lista existente, pero algunas veces no queremos iterar sobre una lista específica, solo queremos ejecutar una acción cierta cantidad de veces, para ello podemos iterar sobre un tipo de dato range, que ya vimos anteriormente. La sintaxis es la siguiente:
1
for i in <una lista de largo 3>:
2
print("Warning")
Copied!
Veamos un ejemplo real:
1
for i in range(3):
2
print("Warning")
Copied!
Resultado
1
Warning
2
Warning
3
Warning
Copied!

Ciclos infinitos

Hemos iterado sobre listas que tienen un inicio y un final, pero ¿qué pasaría con este código?
1
mis_numeros_favoritos = [4, 8, 15, 16, 42]
2
3
for numero in mis_numeros_favoritos:
4
mis_numeros_favoritos.append(1)
Copied!
¡Pruébalo en tu máquina a ver que sucede!
Respuesta: el computador se queda atorado, ya que ha entrado en un ciclo infinito, pero ¿por qué? Si revisas el código en detalle, te darás cuenta que dentro del ciclo for estamos añadiendo el valor 1 a la lista de forma infinita, por tanto el ciclo nunca termina. Debes oprimir las teclas CTRL + C para poder parar la ejecución, y así seguir adelante.

break

En algún momento vamos a querer buscar un item dentro de una lista
1
razas = ["bulldog", "chihuahua", "beagle", "golden", "labrador", "pug"]
2
3
for raza in razas:
4
if raza == "beagle":
5
print("Hemos encontrado un beagle")
6
print(raza)
Copied!
Resultado
1
bulldog
2
chihuahua
3
Hemos encontrado un beagle
4
beagle
5
golden
6
labrador
7
pug
Copied!
¿Qué ves de raro en este código? En el código anterior, el programa va por cada ítem dentro de la lista razas y busca usando una sentencia if a beagle. Una vez lo encuentra no hay necesidad de seguir recorriendo la lista. En este caso son 6 razas (o items), pero si necesitamos ir sobre 1 millón de items tendremos un problema de rendimiento. Se puede salir del código una vez encuentra el ítem con la sentencia break
1
razas = ["bulldog", "chihuahua", "beagle", "golden", "labrador", "pug"]
2
3
for raza in razas:
4
if raza == "beagle":
5
print("Hemos encontrado un beagle")
6
break
7
print(raza)
Copied!
Resultado
1
bulldog
2
chihuahua
3
Hemos encontrado un beagle
Copied!

continue

Otro caso de uso similar se da cuando estamos iterando sobre una lista, pero podríamos querer saltarnos algunos valores o ítems. Podemos usar continue para movernos al siguiente i de la lista
1
lista_de_numeros = [1, 2, -1, 4, -5, 5, 2, -9]
2
3
for i in lista_de_numeros:
4
if i < 0:
5
continue
6
print(i)
Copied!
Resultado
1
1
2
2
3
4
4
5
5
2
Copied!
Como puedes ver, cuando la sentencia if encuentra un valor menor a 0 se lo "salta" con un continue y sigue recorriendo la lista.

Ciclos for "encadenados"

¿Qué pasa si tenemos una lista que contiene múltiples listas, como hacemos para iterar sobre ella? Para esto usamos un for "encadenado" de la siguiente manera
1
equipos_proyecto = [["juan", "pedro", "ana"], ["daniel", "juliana"], ["diana", "diego"]]
2
3
for equipo in equipos_proyecto:
4
print(equipo)
5
for estudiante in equipo:
6
print(estudiante)
Copied!
Resultado
1
['juan', 'pedro', 'ana']
2
juan
3
pedro
4
ana
5
['daniel', 'jualiana']
6
daniel
7
jualiana
8
['diana', 'diego']
9
diana
10
diego
Copied!
Como vemos, tenemos dos ciclos for "encadenados", uno dentro del otro, ya que la lista tiene más dimensiones. Algo importante para resaltar en el ciclo for interno, es que iteramos sobre equipo, ya que son las listas internas.

Ciclo while

El ciclo while es otro tipo de ciclo diferente al ciclo for. Este ciclo recorre un set de código hasta que deja de cumplirse una condición. Puede usarse también para iterar sobre una lista. Cada vez que una condición se cumple el código dentro del ciclo corre. Es una excelente opción para cuando no sabemos cuántas iteraciones tomará para cumplir con la condición.
Para ver las diferencia con respecto al ciclo for tratemos de imprimir los ítems de la lista de razas usando el ciclo while
1
razas = ["bulldog", "chihuahua", "beagle", "golden", "labrador", "pug"]
2
3
indice = 0
4
while indice < len(razas):
5
print(razas[indice])
6
indice += 1
Copied!
Resultado
1
bulldog
2
chihuahua
3
beagle
4
golden
5
labrador
6
pug
Copied!
¿Qué diferencias logras descifrar en comparación con el ciclo for? Empecemos:
    Estamos iniciando una variable en 0, la variable indice. Esto es necesario para poder tener un valor de comparación inicial.
    Usamos la palabra reservada while seguido de un condicional que puede evaluar a True o False.
    El condicional compara el valor de indice con respecto al largo de la lista razas. En la primera iteración indice == 0 y el len(razas) == 6. Debido a que el resultado del condicional es True en la primera iteración, el código entra a ejecutar el print(razas[indice])
    El print(razas[indice]) esta accediendo a la lista razas y llamando el item por la posición que tiene la variable indice, que en la primera iteración será 0, o sea que llamamos al primer item: print(razas[0])
    La operación indice += 1 es muy importante para este caso de uso, ya que si no lo hacemos quedaremos en un ciclo "infinito".
    El indice += 1 toma el valor actual de indice y de forma recursiva += suma el valor de 1. Quiere decir que una vez la primera iteración finaliza, la variable indice deja de valer 0 y pasa a valer 1, y vuelve a recorrer todo el ciclo while
    El ciclo while deja de ejecutarse cuando la condición while indice < len(razas) es False. La pregunta es, ¿cuando es False? Es False cuando la variable indice sea igual o mayor a len(razas), o sea igual o mayor a 6
Hagamos un segundo ejemplo:
1
n = 10
2
3
# inicializamos sum y el contador i
4
sum = 0
5
i = 1
6
7
while i <= n:
8
sum = sum + i
9
print("contador: ", i)
10
print("sumatoria: ", sum)
11
i += 1 # actualizamos el contador
Copied!
Resultado
1
contador: 1
2
sumatoria: 1
3
contador: 2
4
sumatoria: 3
5
contador: 3
6
sumatoria: 6
7
contador: 4
8
sumatoria: 10
9
contador: 5
10
sumatoria: 15
11
contador: 6
12
sumatoria: 21
13
contador: 7
14
sumatoria: 28
15
contador: 8
16
sumatoria: 36
17
contador: 9
18
sumatoria: 45
19
contador: 10
20
sumatoria: 55
Copied!
Analiza el resultado en detalle, y trata de hacer otros ejemplos adicionales por tu cuenta.

Comprensión de listas o "List Comprehensions"

Las comprensiones de listas es una forma recursiva de iterar sobre las listas y retornar una lista como resultado.
Para entenderlo fácilmente, hagamos el siguiente ciclo for pero en vez de hacer un print(), añadamos los valores que cumplen con una condición a una lista así:
1
razas = ["bulldog", "chihuahua", "beagle", "golden", "beagle", "labrador", "pug", "beagle"]
2
beagles = []
3
4
for raza in razas:
5
if raza == "beagle":
6
beagles.append(raza)
7
8
print(beagles)
Copied!
Resultado
1
['beagle', 'beagle', 'beagle']
Copied!
Pensemos en ello un poco:
    Este ciclo for itera sobre una lista de razas, y retorna la lista beagles con los valores encontrados durante el ciclo for y que cumplieron la condición de if raza == "beagle":
    Estamos haciendo este proceso en 6 líneas de código, aquí es donde las comprensiones de listas entran en ayuda.
Hagamos ahora un list comprehension para obtener el mismo resultado:
1
razas = ["bulldog", "chihuahua", "beagle", "golden", "beagle", "labrador", "pug", "beagle"]
2
3
beagles = [ raza for raza in razas if raza == "beagle"]
4
5
print(beagles)
Copied!
Analiza en detalle la línea beagles = [ raza for raza in razas if raza == "beagle"] ya que aquí es donde ocurre la magia. En una sola línea de código hicimos el ciclo for y la sentencia if y retornamos una lista con los valores que cumplen la condición.
Veamos otro ejemplo y desglosamos aún más la comprensión de listas. Supongamos que tenemos la siguiente lista:
1
palabras = ["@diana123", "#sinfiltro", "@juan586", "reply", "timestamp", "@anamyal5263", "#tbt"]
Copied!
Queremos una nueva lista llamada usernames que tiene todos los strings de la lista que tienen un @ como palabra inicial. Podemos hacer un ciclo for
1
usernames = []
2
3
for palabra in palabras:
4
if palabra[0] == '@':
5
usernames.append(palabra)
6
7
print(usernames)
Copied!
Resultado
1
['@diana123', '@juan586', '@anamyal5263']
Copied!
Hagamos el cambio a un list comprenhension
1
palabras = ["@diana123", "#sinfiltro", "@juan586", "reply", "timestamp", "@anamyal5263", "#tbt"]
2
usernames = [ palabra for palabra in palabras if palabra[0] == '@']
3
print(usernames)
Copied!
Resultado
1
['@diana123', '@juan586', '@anamyal5263']
Copied!
Como vemos es el mismo resultado del ciclo for.
Este list comprehension 1. Toma un elemento en palabras 2. Asigna ese elemento a la variable llamada palabra 3. Verifica si palabra[0] == @ es igual a True, y si sí, añade palabra a la nueva lista usernames. Si no, no pasa nada. 4. Repite los pasos del 1-3 para todos los strings en palabras.
Ahora queremos crear una nueva lista con el string " por favor sigueme!" añadido al final de cada username. La nueva lista la llamaremos mensajes
1
mensajes = [ usuario + " por favor sigueme!" for usuario in usernames ]
2
print(mensajes)
Copied!
Resultado
1
['@diana123 por favor sigueme!', '@juan586 por favor sigueme!', '@anamyal5263 por favor sigueme!']
Copied!
Este list comprehension: 1. Toma un string en usernames 2. Asigna ese username a una variable llamada usuario 3. Añade " porfavor sigueme!" a usuario 4. Añade esa concatenación a la nueva lista llamada mensajes 5. Repite el paso 1-4 para todos los strings en usernames
Poder crear listas con valores modificados es especialmente útil cuando trabajamos con números. Supongamos que tenemos la siguiente lista
1
mis_votos = [192, 15, 22, 55, 69, 152, 13]
Copied!
Si queremos añadir o sumar 100 a cada valor. ¿Cómo lo haríamos?
1
mis_votos = [192, 15, 22, 55, 69, 152, 13]
2
votos_actualizados = [ voto + 100 for voto in mis_votos ]
3
print(votos_actualizados)
Copied!
Este list comprehension: 1. Toma un número en mis_votos 2. Asigna ese número a una variable llamada voto 3. Suma 100 a voto 4. Añade esa suma a la nueva lista llamada votos_actualizados 5. Repite el paso 1-4 para todos los valores en mis_votos
Last modified 8mo ago