¿Por qué Python for loop no funciona como C for loop?

DO:

# include  main() { int i; for (i=0; i5) { i=i-1; printf("%d",i); } } } 

Pitón:

 for i in range(10): if i>5: i=i-1 print(i) 

Cuando comstackmos el código C, entra en un bucle infinito imprimiendo 5 para siempre, mientras que en Python no, ¿por qué no?

La salida de Python es:

0 1 2 3 4 5 5 6 7 8

En Python, el bucle no incrementa i , en su lugar, le asigna valores del objeto iterable (en este caso, lista). Por lo tanto, cambiar i dentro del bucle for no “confunde” el bucle, ya que en la siguiente iteración simplemente se asignará el siguiente valor.

En el código que proporcionó, cuando i es 6, se reduce en el bucle para que se cambie a 5 y luego se imprima. En la siguiente iteración, Python simplemente lo establece en el siguiente valor en la lista [0,1,2,3,4,5,6,7,8,9] , que es 7, y así sucesivamente. El bucle termina cuando no hay más valores para tomar.

Por supuesto, el efecto que obtienes en el bucle C que proporcionaste aún podría lograrse en Python. Dado que cada bucle for es un bucle while glorificado, en el sentido de que podría convertirse así:

 for (init; condition; term) ... 

Es equivalente a:

 init while(condition) { ... term } 

Entonces tu for infinite loop podría escribirse en Python como:

 i = 0 while i < 10: if i > 5: i -= 1 print i i += 1 

Las dos construcciones se llaman para bucles, pero en realidad no son lo mismo.

La versión de Python es realmente un bucle foreach. Se ejecuta una vez para cada elemento de una colección. range(10) produce una lista como [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] Por lo tanto, el bucle for se ejecuta una vez para cada miembro de la colección. No utiliza el valor de i para decidir cuál es el siguiente elemento, siempre toma el siguiente elemento de la lista.

El bucle c para se traduce en el equivalente de

 int i = 0 while i < 10: ... i++; 

Es por eso que puedes manipular el i .

Porque tus dos ejemplos son cosas completamente diferentes.

range(10) en python produce una lista de valores 0 – 9, luego for i in devuelve cada valor como i . Esto generalmente se conoce como un bucle “para cada uno”. Usted está operando en un valor, no en el iterador, cuando dice i=i-1 en su ejemplo de python.

http://docs.python.org/tutorial/controlflow.html

La instrucción for en Python difiere un poco de lo que puedes usar en C o Pascal. En lugar de iterar siempre sobre una progresión aritmética de números (como en Pascal), o dar al usuario la capacidad de definir tanto el paso de iteración como la condición de detención (como C), la instrucción for de Python itera sobre los elementos de cualquier secuencia (una lista o una cadena), en el orden en que aparecen en la secuencia. Por ejemplo (sin juego de palabras):

 a = ['cat', 'window', 'defenestrate'] for x in a: print x, len(x) 

No es seguro modificar la secuencia que se está iterando en el bucle (esto solo puede suceder con los tipos de secuencia mutables, como las listas). Si necesita modificar la lista sobre la que está iterando (por ejemplo, para duplicar elementos seleccionados), debe iterar sobre una copia.

Por supuesto, la secuencia generada por el rango no es mutable.