Considerar:
>>> lst = iter([1,2,3])
>>> next(lst)
1
>>> next(lst)
2
Entonces, avanzar el iterador es, como se esperaba, manejado mutando ese mismo objeto.
Siendo este el caso, esperaría:
a = iter(list(range(10)))
for i in a:
print(i)
next(a)
para omitir cada segundo elemento: la llamada a next
debe avanzar el iterador una vez, luego la llamada implícita realizada por el bucle debe avanzar por segunda vez, y se le asignará el resultado de esta segunda llamada i
.
No lo hace. El bucle imprime todos los elementos de la lista, sin omitir ninguno.
Mi primer pensamiento fue que esto podría suceder porque el bucle invoca iter
lo que se pasa, y esto podría dar un iterador independiente; este no es el caso, como lo hemos hecho iter(a) is a
.
Entonces, ¿por qué next
no parece avanzar el iterador en este caso?
i
ya fue asignado.next(a)
significa que2
se asigna la siguiente iteracióni
, luego se mueve dea
nuevo, imprimei
, etc.StopIteration
genera un excedente cuandonext(a)
se llama después de que se agote la lista.Lo que sucede es que
next(a)
devuelve el siguiente valor de a, que se imprime en la consola porque no se ve afectado.Lo que puede hacer es afectar una variable con este valor:
fuente
Las respuestas existentes me parecen un poco confusas, ya que solo indican indirectamente lo esencial desconcertante en el ejemplo del código: tanto * la "impresión i" como la "siguiente (a)" están causando que se impriman sus resultados.
Como están imprimiendo elementos alternos de la secuencia original, y es inesperado que se imprima la declaración "next (a)", parece que la declaración "print i" está imprimiendo todos los valores.
A la luz de esto, se hace más claro que asignar el resultado de "siguiente (a)" a una variable inhibe la impresión de su resultado, de modo que solo se imprimen los valores alternativos de la variable de bucle "i". Del mismo modo, hacer que la declaración "print" emita algo más distintivo también lo desambigua.
(Una de las respuestas existentes refuta las otras porque esa respuesta es tener el código de ejemplo evaluado como un bloque, por lo que el intérprete no informa los valores intermedios para "next (a)".)
Lo atractivo en responder preguntas, en general, es ser explícito sobre lo que es obvio una vez que se sabe la respuesta. Puede ser esquivo. Del mismo modo, criticar las respuestas una vez que las comprenda. Es interesante...
fuente
Algo está mal con su Python / Computadora.
Funciona como se esperaba.
Probado en Python 2.7 y en Python 3+. Funciona correctamente en ambos
fuente
Para aquellos que aún no entienden.
Como ya han dicho otros,
next
aumenta el iterador en 1 como se esperaba. Asignar su valor devuelto a una variable no cambia mágicamente su comportamiento.fuente
Se comporta de la manera deseada si se llama como una función:
fuente