Módulo 1 · Lección 17 de 59
El bucle for
Recorrer una secuencia elemento a elemento, la idea de para cada, y en qué se diferencia de un while.
Para recorrer un texto carácter a carácter con un while hacen falta cuatro cosas: una variable de posición, una condición con len(), un acceso por índice y un incremento. Cuatro cosas que puedes equivocar de cuatro maneras distintas, y todas para expresar una idea muy simple: "haz esto con cada letra".
palabra = "Python"
posicion = 0
while posicion < len(palabra):
print(palabra[posicion])
posicion += 1El segundo bucle de Python dice eso mismo en dos líneas.
La forma básica#
for letra in "Python":
print(letra)P
y
t
h
o
nSin contador, sin len(), sin corchetes y sin posibilidad de pasarte del final. La sintaxis es:
- La palabra
for. - Un nombre de variable que tú eliges.
- La palabra
in. - La secuencia que quieres recorrer.
- Dos puntos y el bloque sangrado, como siempre.
Y se lee literalmente como una frase en inglés que no hace falta traducir: for letra in "Python", para cada letra en "Python".
Cómo funciona por dentro#
En cada vuelta, Python coge el siguiente elemento de la secuencia y lo guarda en la variable del bucle. Después ejecuta el bloque. Cuando no quedan elementos, el bucle termina.
Eso significa que la variable del bucle cambia sola: no la inicializas tú ni la incrementas tú. En la primera vuelta letra vale "P", en la segunda "y", y así hasta la última. Esa es la mitad de las líneas que desaparecen respecto al while.
frase = "programar en Python es divertido"
vocales = 0
for caracter in frase:
if caracter in "aeiouáéíóú":
vocales += 1
print(f"La frase tiene {vocales} vocales")La frase tiene 10 vocalesFíjate en que los patrones de la lección del while siguen funcionando igual. Ahí dentro hay un acumulador, vocales, inicializado antes del bucle. Lo único que cambia es quién controla las vueltas.
Y el acumulador de texto también:
palabra = "murcielago"
invertida = ""
for letra in palabra:
invertida = letra + invertida
print(invertida)ogaleicrumCada letra se pone delante de lo que ya había, así que el texto sale al revés. Nada de esto sería más fácil con un while.
El nombre de la variable#
Lo eliges tú, y como cualquier nombre, debe decir qué contiene. Si recorres un texto, letra o caracter; si recorres precios, precio; si recorres ciudades, ciudad. En singular, porque en cada vuelta hay uno solo.
for ciudad in ["Madrid", "Sevilla", "Bilbao"]:
print(f"{ciudad:<10}{len(ciudad)} letras")Madrid 6 letras
Sevilla 7 letras
Bilbao 6 letrasVerás mucho código con i, x o c. Es una costumbre heredada de otros lenguajes y solo se justifica cuando la variable es de verdad un número sin significado. for precio in precios: se entiende sin pensar; for x in p: no.
for y while: cuál usar#
Los dos repiten, pero responden a preguntas distintas:
| Aspecto | for | while |
|---|---|---|
| Se usa cuando | Sabes sobre qué iteras | Dependes de una condición |
| Número de vueltas | Determinado por la secuencia | Desconocido de antemano |
| Quién avanza | Python, solo | Tú, con un contador |
| Riesgo de bucle infinito | Ninguno | Alto |
| Ejemplo típico | Recorrer un texto o una lista | Un menú, validar una entrada |
La regla para decidir es corta: si puedes usar for, usa for. Es más corto, se entiende mejor y no puede quedarse colgado, porque la secuencia que recorre es finita y se acaba sola.
El while se queda para lo que no tiene una secuencia detrás: repetir hasta que el usuario escriba algo válido, mantener un menú abierto, o seguir calculando hasta alcanzar una precisión. En todos esos casos no hay nada que recorrer, solo una condición que vigilar.
Iterar sobre varios valores sueltos#
Además de cadenas, un for puede recorrer una lista de valores escritos entre corchetes:
for precio in [3, 7, 11]:
print(f"Precio: {precio} €")Precio: 3 €
Precio: 7 €
Precio: 11 €Esos corchetes con valores separados por comas son una lista, y es cómodo usarlas así para probar un bucle con tres o cuatro datos concretos.
También puedes recorrer el resultado de split(), que ya conoces y que produce precisamente una lista:
frase = "uno dos tres cuatro"
for palabra in frase.split():
print(f"{palabra:<8}{len(palabra)}")uno 3
dos 3
tres 4
cuatro 6Eso resuelve del todo el ejemplo de "varios datos en una línea" que dejamos a medias en la lección de input(), donde había que escribir partes[0], partes[1] y partes[2] a mano.
Ejemplo completo#
VOCALES = "aeiouáéíóúü"
CONSONANTES = "bcdfghjklmnñpqrstvwxyz"
frase = input("Escribe una frase: ")
vocales = 0
consonantes = 0
espacios = 0
otros = 0
for caracter in frase.lower():
if caracter in VOCALES:
vocales += 1
elif caracter in CONSONANTES:
consonantes += 1
elif caracter == " ":
espacios += 1
else:
otros += 1
print()
print(f"{'Caracteres:':<14}{len(frase):>4}")
print(f"{'Vocales:':<14}{vocales:>4}")
print(f"{'Consonantes:':<14}{consonantes:>4}")
print(f"{'Espacios:':<14}{espacios:>4}")
print(f"{'Otros:':<14}{otros:>4}")Escribe una frase: El año 2024 fue raro.
Caracteres: 21
Vocales: 7
Consonantes: 5
Espacios: 4
Otros: 5El lower() va en la línea del for, no dentro del bucle: se aplica una sola vez a la frase completa y así las constantes solo necesitan las minúsculas. Los dígitos y el punto caen en otros, que es el else que recoge todo lo que no ha encajado antes.