Iterando ando: for
En Python algunos objetos se pueden iterar. Esto es: recorrer su elementos de uno a la vez. Muchos objetos tiene definida una forma de iterarse, por ejemplo las listas.
Veamos un ejemplo:
mi_lista = ["Juan", "Pedro", "María"]
for persona in mi_lista:
saludo = f'Hola {persona}!'
print(saludo)
print('Iteración terminada')
""" Imprime
Hola Juan
Hola Pedro
Hola María
Iteración terminada
"""
Como podemos imaginar, la línea print(saludo)
se ejecuta tres veces.
Estos es, una por cada uno de los elementos de mi_lista
.
La sentencia for
inicia un loop que va a terminar cuando se quede
sin elementos que recorrer.
Anatomía de un for
La línea for persona in mi_lista:
podría traducirse como:
por cada persona en mi_lista hacer lo siguiente:
Analicémosla:
La sentencia
for
indica que vamos a iniciar una iteración.A continuación se requiere un nombre de variable (en nuestro ejemplo
persona
) para contener cada uno de los elementos de la iteración dentro de la porción de código que se va a ejecutar en cada vuelta del bucle.Luego sigue la palabra
in
para que esta linea sea fácil de leer y como indicador de que vamos a continuar con algún objeto iterable.Finalmente se coloca el objeto sobre el que deseamos iterar.
Como todas las líneas que preceden a un bloque de código termina con
:
.Todo el código que necesitamos que se ejecute para cada uno de los elementos debe estar tabulado. La forma de saber donde termina esta porción de codigo es que se termina la tabulación.
Nota: la variable
persona
solo está definida dentro del bloque del código delfor
. Fuera de el no está definida y dará un error si se intenta usar.
¿Se puede anidar iteraciones? Si, claro. Veamos un ejemplo:
lista_con_listas = [ [1, 12], [20, 22], [5, 8] ]
for lista in lista_con_listas:
for numero in lista:
print(numero)
# imprimirá:
1
12
20
22
5
8
continue
y break
en ciclos for
Dentro de una iteración, existen formas de salir de
ella (break
) y de saltearse un elemento (continue
).
Veamos un ejemplo:
# for / continue / break
paises = ["Argentina", "Brasil", "Chile", "Uruguay", "Venezuela", "Colombia", "Japón"]
print('Paises')
for pais in paises:
if pais == "Chile":
continue
print(f" - {pais}")
if pais == "Venezuela":
break
print('FIN')
""" imprime
Paises
- Argentina
- Brasil
- Uruguay
- Venezuela
FIN
"""
Algunos elementos no pueden iterarse, por ejemplo los int
.
El error 'XXX' object is not iterable
es la forma de informar esto.
a = 90
for x in a:
print(x)
""" devolverá el error.
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable
"""
if
+ in
Tambien podemos combinar if
con in
para saber si un objeto
esta contenido en una lista.
lista = [1, 2, 3]
if 4 in lista:
print("4 está en la lista")
else:
print("4 no está en la lista")
# imprime
# 4 no está en la lista
Iterando strings
Como ya vimos antes, los strings tambien pueden usarse como listas y por lo tanto se puede iterar.
nombre = "Victor"
for letra in nombre:
print(letra)
""" imprimirá
V
i
c
t
o
r
"""
Agregado: range
Python tiene una funcion (técnicamente no es una función pero
por ahora podemos pensarla como tal) includa (built-in) que
permite iterar sobre una serie de números. Se llama range
y podemos ver su funcionamiento con algunos ejemplos.
Cuando llamamos a range
con un solo un parámetro (siempre numeros)
este devuelve un objeto que se puede iterar. Incluye los números
desde cero hasta el valor pasado como parámetro menos uno
(comportamiento similar a los indices de las listas).
for n in range(3):
print(n)
# imprimira (en lineas diferentes): 0 1 2
Cuando llamamos a range
con dos parámetros (siempre numeros)
este devuelve un objeto que se puede iterar. Incluye los números
desde el primer parámetro hasta el valor pasado como segundo
parámetro menos uno.
for n in range(2, 8):
print(n)
# imprimira (en lineas diferentes): 2 3 4 5 6 7
Cuando llamamos a range
con tres parámetros (siempre numeros)
este devuelve un objeto que se puede iterar. Incluye los números
desde el primer parámetro hasta el valor pasado como segundo
parámetro menos uno. El último parámetro indica el tamaño del
salto entre un elemento y otro (por ejemplo 2 hará que el
resultado vaya de dos en dos).
for n in range(3, 10, 2):
print(n)
# imprimira (en lineas diferentes): 3 5 7 9
Tambien es posible convertir el resultado de range
a una lista
(que ya conocemos).
pares = range(0, 100, 2)
lista_pares = list(pares)
print(lista_pares)
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32,
34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64,
66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98]
Iterar mientras que algo suceda: while
En algunas ocasiones necesitamos iterar hasta que algo cambie. Por ejemplo, hasta que el usuario ingrese un número válido.
Para estos casos existe la sentencia while
.
numero_final = 0
# No salimos hasta que el numero sea válido
while numero_final == 0:
numero = input("Ingrese un número entre 1 y 10: ")
if not numero.isdigit():
print("No ingresaste un número válido")
continue
if int(numero) < 1 or int(numero) > 10:
print("El número debe estar entre 1 y 10")
continue
numero_final = int(numero)
print(f"Ingresaste el número {numero_final}")
""" TEST
Ingrese un número entre 1 y 10: a
No ingresaste un número válido
Ingrese un número entre 1 y 10: 11
El número debe estar entre 1 y 10
Ingrese un número entre 1 y 10: 0
El número debe estar entre 1 y 10
Ingrese un número entre 1 y 10: 3
Ingresaste el número 3
"""
Tareas
Escribir un programa que:
Incluya al inicio una funcion llamada
es_par
y que devuelva verdadero o falso según correspondaLe solicite al usuario que ingrese una lista de números separados por coma.
Transformarme este texto ingresado a lista con
split(',')
Iterere todos ellos e imprima solo aquellos que son pares.
Escribir un programa que itere todos los múltiplos de 3 desde el cero al 500000 e imprima solo aquellos que además son divisibles (el resto de la division es cero) por 13.
Escribir un programa que responda estas preguntas:
¿Cuantos números multiplos de siete menores a 10.000 terminan en 999?
¿Cuales son?