Python 3 – Ciclo for

El for de Python no cuenta: recorre. Le das algo con elementos —una lista, una cadena, un diccionario— y te los va dando uno por uno. Contar números es solo un caso particular.

range

print(list(range(5, 10)))
print(list(range(10))[-1])
print(list(range(0, 10, 2)))
print(list(range(0, -10, -2)))
salida[5, 6, 7, 8, 9]
9
[0, 2, 4, 6, 8]
[0, -2, -4, -6, -8]

range(inicio, fin, paso). El final nunca se incluye: range(5, 10) llega hasta el 9 y range(10) va del 0 al 9, diez números. El paso puede ser negativo para contar hacia atrás. Lo de list(...) es solo para verlo impreso: range no genera los números de golpe, los va dando según se piden, y por eso range(1_000_000_000) no gasta memoria.

Recorrer cualquier cosa

for fruta in ["manzana", "pera", "uva"]:
    print(fruta, end=" ")
salidamanzana pera uva

Así se recorre en Python. Si vienes de otro lenguaje, la tentación es escribir for i in range(len(lista)): y luego lista[i]; funciona, pero no hace falta.

Cuando sí necesitas el número: enumerate

for i, fruta in enumerate(["manzana", "pera", "uva"], start=1):
    print(f"{i}. {fruta}")
salida1. manzana
2. pera
3. uva

Dos listas a la vez: zip

for nombre, nota in zip(["ana", "luis"], [9, 6]):
    print(nombre, nota)
salidaana 9
luis 6

Un diccionario

for clave, valor in {"a": 1, "b": 2}.items():
    print(clave, "=", valor)
salidaa = 1
b = 2

El else del for

for n in [3, 7, 11]:
    if n % 2 == 0:
        print("hay un par:", n)
        break
else:
    print("no había ningún par")
salidano había ningún par

Es lo más raro del for de Python y es útil: el else se ejecuta solo si el bucle terminó sin break. Sirve justo para buscar: si lo encuentras, sales con break; si llegas al final, el else te avisa de que no estaba. En la versión anterior de esta página había un else que no explicaba esto, y sin la explicación parece que se ejecuta siempre.

No borres mientras recorres

numeros = [1, 2, 3, 4]
for n in numeros:
    if n % 2 == 0:
        numeros.remove(n)
print(numeros)

numeros = [2, 4, 6, 8]
for n in numeros:
    if n % 2 == 0:
        numeros.remove(n)
print(numeros)
salida[1, 3]
[4, 8]
El primer resultado es correcto por casualidad; el segundo no. Al quitar un elemento, los siguientes se desplazan un puesto y el bucle se salta el que viene detrás. Con [2, 4, 6, 8] se salta el 4 y el 8 y no da ningún error: simplemente deja datos que no debía. Si necesitas quitar elementos, construye una lista nueva.

Listas por comprensión

print([n for n in [2, 4, 6, 8] if n % 2 != 0])
print([x * x for x in range(1, 6)])
salida[]
[1, 4, 9, 16, 25]

Cuando el bucle solo sirve para construir una lista, esta forma lo dice en una línea: «la lista de x por x para cada x de este rango». Es también la forma correcta de filtrar del apartado anterior. Si la línea se alarga y cuesta leerla, vuelve al for normal.

Más información en inglés: For loop and range in Python.

Todo el código se ejecutó con Python 3.14 en un contenedor limpio antes de publicar esta página; las salidas están copiadas de esa ejecución.