El ciclo for en Java, Go y Python

Los tres lenguajes tienen for, pero cada uno lo entiende a su manera. Java tiene dos formas, Go usa una sola palabra para todos los bucles, y en Python el for siempre recorre algo. Los comparamos con ejemplos ejecutados en los tres.

Java: el for clásico y el de recorrido

public class CicloFor {
    public static void main(String[] args) {
        for (int i = 0; i < 3; i++) {
            System.out.println("valor de i: " + i);
        }

        String[] lenguajes = {"Java", "Go", "Python"};
        for (String l : lenguajes) {
            System.out.println(l);
        }

        for (int i = 0, j = 10; i < j; i += 3, j -= 3) {
            System.out.println(i + " " + j);
        }
    }
}
java CicloFor.javavalor de i: 0
valor de i: 1
valor de i: 2
Java
Go
Python
0 10
3 7

El primero es el for heredado de C: una inicialización, una condición que se comprueba antes de cada vuelta y un incremento que se ejecuta al final de cada una. El segundo, el «for mejorado», recorre un arreglo o cualquier colección sin índice. El tercero recuerda que cada una de las tres partes puede tener varias expresiones separadas por comas.

Go: una sola palabra para todos los bucles

package main

import "fmt"

func main() {
	for i := 0; i < 3; i++ {
		fmt.Println("valor de i: ", i)
	}

	for i := range 3 {
		fmt.Println("range:", i)
	}

	lenguajes := []string{"Java", "Go", "Python"}
	for i, l := range lenguajes {
		fmt.Println(i, l)
	}

	n := 1
	for n < 100 {
		n *= 3
	}
	fmt.Println("primera potencia de 3 mayor que 100:", n)

	for {
		fmt.Println("una vez y fuera")
		break
	}
}
go run .valor de i:  0
valor de i:  1
valor de i:  2
range: 0
range: 1
range: 2
0 Java
1 Go
2 Python
primera potencia de 3 mayor que 100: 243
una vez y fuera

Go no tiene while ni do: todo se escribe con for. Con tres partes es el clásico, sin paréntesis. Con solo la condición, hace de while. Sin nada es un bucle infinito, del que se sale con break. Y con range recorre colecciones devolviendo el índice y el valor. Desde Go 1.22, range también acepta un número: for i := range 3 da 0, 1 y 2.

Fíjate en los dos espacios de valor de i: 0. fmt.Println pone un espacio entre cada argumento, y el texto ya terminaba en espacio. En Go se escribe fmt.Println("valor de i:", i), sin el espacio final.

Python: siempre recorre algo

for i in range(3):
    print("valor de i: ", i)

for i in range(3):
    print("valor de i:", i)

lenguajes = ["Java", "Go", "Python"]
for i, l in enumerate(lenguajes):
    print(i, l)

for i in range(10, 0, -3):
    print(i, end=" ")
print()

for l in lenguajes:
    if l == "Rust":
        break
else:
    print("no había Rust")
python ciclo.pyvalor de i:  0
valor de i:  1
valor de i:  2
valor de i: 0
valor de i: 1
valor de i: 2
0 Java
1 Go
2 Python
10 7 4 1
no había Rust

En Python no hay for con contador: se recorre una secuencia, y range genera los números. range(10, 0, -3) cuenta hacia atrás de tres en tres, y enumerate da el índice junto a cada elemento. El primer print tiene el mismo doble espacio que Go, por el mismo motivo: print separa sus argumentos con un espacio.

Lo exclusivo de Python es el else del for: se ejecuta solo si el bucle terminó sin break. Sirve para búsquedas como esta, donde llegar al final significa que no se encontró nada.

Lado a lado

JavaGoPython
Contar de 0 a 9for (int i = 0; i < 10; i++)for i := 0; i < 10; i++ o for i := range 10for i in range(10):
Recorrer una colecciónfor (String l : lista)for _, l := range listafor l in lista:
Con índiceel for clásicofor i, l := range listafor i, l in enumerate(lista):
Mientras se cumpla algowhile (cond)for condwhile cond:
Infinitowhile (true)forwhile True:
Bloquellavesllaves, obligatoriassangría

Lo que cambia por debajo

La versión anterior de esta entrada decía que Java es un lenguaje interpretado, como Python. No es exacto, y la diferencia explica buena parte de la diferencia de velocidad. Java se compila a bytecode, y la máquina virtual compila a código máquina, mientras el programa se ejecuta, las partes que más se usan. Go se compila directamente a un ejecutable nativo. Python, en su implementación habitual, también compila a bytecode, pero lo interpreta instrucción a instrucción, y por eso un bucle con mucho cálculo suele ir bastante más despacio. Para medirlo bien, mira medir el rendimiento en Java.

Entrada publicada en 2020 y revisada en octubre de 2026. Cada ejemplo se ejecutó en un contenedor limpio con Java 25 LTS, Go 1.25 y Python 3.14; las salidas están copiadas de esa ejecución.