Cambio de la variable de iteración dentro del bucle en Python

Estoy tratando de hacer algo tan simple como cambiar la variedad en la que estoy iterando sobre (i), pero tengo comportamientos diferentes tanto en Python como en C.

En Python,

for i in range(10): print i, if i == 2: i = 4; 

Obtengo 0 1 2 3 4 5 6 7 8 9 , pero el equivalente en C:

 int i; for (i = 0; i < 10; i++) { printf("%d", i); if (i == 2) i = 4; } 

Obtengo 01256789 (tenga en cuenta que los números 3 y 4 no aparecen, como se esperaba).

¿Que esta pasando aqui?

No estás haciendo lo que crees que eres.
Por ejemplo:

 for i in range(10): 

constantemente configurará i para que sea el siguiente elemento en el rango 0-10 sin importar qué.

Si quieres hacer el equivalente en python harías:

 i = 0 while i < 10: print(i) if i == 2: i = 4 else: # these line are i += 1 # the correct way i += 1 # note that this is wrong if you want 1,2,4,5,6,7,8,9 

Si está intentando convertirlo a C , debe recordar que i++ en el bucle for siempre se agregará a i .

El range() funciones range() crea una lista. Por ejemplo, el range(10) creará la siguiente lista: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] .

Cuando diga for i in range(10) , primero se generará la lista [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] , y luego se asignarán todos los valores de esa lista, en orden.

No importa si cambia el valor de i porque en la siguiente iteración se le asignará el siguiente elemento de la lista.

Por otro lado, es C / C ++, al final de cada iteración el valor de i se incrementa y luego se compara con el valor máximo permitido (en este caso 9) y, si es mayor, el bucle finaliza.

Python te da los elementos en el range(10) , uno tras otro. C incrementa repetidamente una variable.

A ambos no les importa realmente qué más haces con la variable dentro del bucle, pero dado que las dos construcciones de lenguaje hacen cosas ligeramente diferentes, el resultado es diferente en algunos casos.

Cuando llama al range(10) , crea una lista iteratable [0,1,2,3,4,5,6,7,8,9] .

Y el bucle for simplemente recoge un número tras otro de la lista en cada turno, ya sea que haya cambiado o no el valor de i .

Es porque cuando usas la función range () en python. Tu variable i irá por el valor dentro del rango. Por ejemplo,

 >>> range(10) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

Sin embargo, el lenguaje C que ha escrito solo está utilizando la condición normal para cambiar el valor de i. No hay función involucrada.

No puedes hacer esto usando la función de rango. debe hacerlo utilizando el bucle while solo porque para los bucles utiliza la función de rango y la variable de función de rango se incrementará por su método interno, sin importar lo que especifique en el bucle, se incrementará solo por la lista de rango. para i en el rango (10): … imprimir i … si i == 2: … i = 4 … else: … i + = 1 … 0 1 2 3 4 5 6 7 8 9

Un ejemplo interesante es aquí …

para i en rango (10): … imprimir i … i = i + 10 … imprimir i … esto imprimirá … 0 10 1 11 2 12 3 13 4 14 5 15 6 16 7 17 8 18 9 19