recorrer - metodos de listas en python
Comportamiento del iterador de la lista Python y siguiente(iterador) (5)
Algo está mal con su Python / computadora.
a = iter(list(range(10)))
for i in a:
print(i)
next(a)
>>>
0
2
4
6
8
Funciona como se esperaba
Probado en Python 2.7 y en Python 3+. Funciona correctamente en ambos
Considerar:
>>> lst = iter([1,2,3])
>>> next(lst)
1
>>> next(lst)
2
Por lo tanto, avanzar el iterador es, como se esperaba, manejado al mutar ese mismo objeto.
Siendo este el caso, yo esperaría:
a = iter(list(range(10)))
for i in a:
print(i)
next(a)
omitir cada segundo elemento: la llamada a la next
debe avanzar el iterador una vez, luego la llamada implícita hecha por el ciclo debe avanzar por segunda vez, y el resultado de esta segunda llamada se asignará a i
.
No es así El ciclo imprime todos los elementos en la lista, sin saltarse ninguno.
Lo primero que pensé fue que esto podría suceder porque el ciclo lo llama a lo que se pasa, y esto podría dar un iterador independiente; este no es el caso, ya que iter(a) is a
.
Entonces, ¿por qué el next
no parece avanzar el iterador en este caso?
Considero que las respuestas existentes son un poco confusas, ya que solo indican indirectamente lo esencial desconcertante en el ejemplo del código: tanto * "print i" como "next (a)" están causando que se impriman sus resultados.
Como están imprimiendo elementos alternos de la secuencia original, y es inesperado que la instrucción "next (a)" esté imprimiendo, parece como si la instrucción "print i" imprimiera todos los valores.
En esa luz, se vuelve 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 que la variable de bucle "i'' ''. Del mismo modo, hacer que la instrucción "imprimir" emita algo más distintivo también lo desambigua.
(Una de las respuestas existentes refuta a las demás porque esa respuesta tiene el código de ejemplo evaluado como un bloque, de modo que el intérprete no informa los valores intermedios para "siguiente (a)").
Lo más fascinante al responder preguntas, en general, es ser explícito sobre lo que es obvio una vez que sepas la respuesta. Puede ser difícil de alcanzar. Del mismo modo, criticar las respuestas una vez que las entiendas. Es interesante...
Lo que está sucediendo es que el next(a)
devuelve el siguiente valor de a, que se imprime en la consola porque no se ve afectado.
Lo que puedes hacer es afectar una variable con este valor:
>>> a = iter(list(range(10)))
>>> for i in a:
... print(i)
... b=next(a)
...
0
2
4
6
8
Lo que se ve es que el intérprete repite el valor de retorno de next()
además de que se imprime cada iteración:
>>> a = iter(list(range(10)))
>>> for i in a:
... print(i)
... next(a)
...
0
1
2
3
4
5
6
7
8
9
Entonces 0
es el resultado de print(i)
, 1
el valor de retorno de next()
, repetido por el intérprete interactivo, etc. Hay solo 5 iteraciones, cada iteración resulta en 2 líneas escritas en el terminal.
Si asigna el resultado de next()
cosas funcionan como se espera:
>>> a = iter(list(range(10)))
>>> for i in a:
... print(i)
... _ = next(a)
...
0
2
4
6
8
o imprima información adicional para diferenciar la salida de print()
del eco del intérprete interactivo:
>>> a = iter(list(range(10)))
>>> for i in a:
... print(''Printing: {}''.format(i))
... next(a)
...
Printing: 0
1
Printing: 2
3
Printing: 4
5
Printing: 6
7
Printing: 8
9
En otras palabras, next()
está funcionando como se esperaba, pero dado que devuelve el siguiente valor del iterador, repetido por el intérprete interactivo, se le hace creer que el bucle tiene su propia copia de iterador de alguna manera.
Se comporta de la manera que desee si se llama como una función:
>>> def test():
... a = iter(list(range(10)))
... for i in a:
... print(i)
... next(a)
...
>>> test()
0
2
4
6
8