Considerar:

>>> lst = iter([1,2,3])
>>> next(lst)
1
>>> next(lst)
2

Así, avanza el iterador es, como se esperaba, manejado por la mutación de ese mismo objeto.

Siendo este el caso, yo esperaría:

a = iter(list(range(10)))
for i in a:
   print(i)
   next(a)

saltar cada segundo elemento: la llamada a next debe avanzar en la iterador de una vez, entonces el implícito de la llamada hecha por el bucle debe avanzar en un segundo tiempo – y el resultado de esta segunda convocatoria podría ser asignado a i.

No. El bucle imprime todos de los elementos de la lista, sin saltarse ninguna.

Mi primer pensamiento fue que esto puede suceder porque el bucle de llamadas iter en lo que se pasa, y esto puede dar independiente iterador – este no es el caso, como hemos iter(a) is a.

Así, ¿por qué next no parecen avanzar en el iterador en este caso?

InformationsquelleAutor lvc | 2013-05-29

6 Comentarios

  1. 185

    Lo que se ve es el intérprete de repetir el valor de retorno de next() además i que se imprime en 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

    Así 0 es la salida de print(i), 1 el valor de retorno de next(), anunciada por el intérprete interactivo, etc. Hay sólo 5 iteraciones, en cada iteración que resulta en 2 líneas que se escriben en el terminal.

    Si se asigna la salida de next() las cosas funcionan como se esperaba:

    >>> a = iter(list(range(10)))
    >>> for i in a:
    ...    print(i)
    ...    _ = next(a)
    ... 
    0
    2
    4
    6
    8

    o imprimir extra información para diferenciar el print() salida desde el intérprete interactivo de eco:

    >>> 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, sino porque devuelve el siguiente valor de la iteración, se hizo eco por el intérprete interactivo, ustedes creen que el bucle tiene su propio iterador copia de alguna manera.

    • Yo no era consciente de este comportamiento de la intérprete. Me alegro de haber descubierto que antes de perder un montón de tiempo pensando en ella mientras que la solución de algún problema real.
    • … *muere*. Lo peor de todo es que yo puedo recordar que mencionar exactamente este intérprete comportamiento a alguien que tal vez hace una semana.
    • interesante. He probado porque yo en un: next(a) ;print i y pensé que iba a saltar a 1 y de impresión 1,3,5,7,9. Pero todavía es 0,2,4,6,8. Por qué?
    • i fue ya asignado. next(a) significa que la siguiente iteración 2 se asigna a i, a continuación, mueva a a lo largo de nuevo, imprimir i, etc.
    • Esto no funciona si n es impar – StopIteration excepetio nis produce cuando next(a) se llama después de que la lista está agotada.
    • Este es un gran medio de explicación.

  2. 12

    Lo que está sucediendo es que next(a) devuelve el siguiente valor de una, que se imprime en la consola, ya que no es afectado.

    Lo que puedes hacer es afectar a una variable con este valor:

    >>> a = iter(list(range(10)))
    >>> for i in a:
    ...    print(i)
    ...    b=next(a)
    ...
    0
    2
    4
    6
    8
  3. 7

    Puedo encontrar las respuestas existentes un poco confuso, ya que sólo indirectamente indicar lo esencial desconcertante cosa en el ejemplo de código: tanto* la «impresión» y el próximo(a)» son la causa de sus resultados para ser impreso.

    Desde el que está imprimiendo la alternancia de elementos de la secuencia original, y es inesperado que el «próximo(a)» declaración de la impresión, aparece como si la «impresión» de la declaración es la impresión de todos los valores.

    En que la 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 sólo los valores alternativos que el «yo» variable de bucle se imprimen. Del mismo modo, haciendo que la «impresión» declaración de emitir algo más distintivo permite desambiguar, así.

    (Una de las respuestas existentes refuta a los demás, porque la respuesta es de tener el código de ejemplo se evalúa como un bloque, por lo que el intérprete no está informando de los valores intermedios para el siguiente(a)».)

    El seductor cosa en responder a las preguntas, en general, es ser explícito acerca de lo que es obvio una vez que sabes la respuesta. Puede ser difícil de alcanzar. Asimismo criticar las respuestas una vez que usted los entienda. Es interesante…

  4. 2

    Algo está mal con su Python/Equipo.

    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

    • Puedo obtener el mismo resultado que @lvc (sólo en RALENTÍ sin embargo, cuando se ejecuta como secuencia de comandos me sale esto))
    • Rose Sólo si se ejecuta como un script.
    • es el comportamiento de poner el código a través del shell interactivo. Si la función devuelve el valor sin ser utilizado, intérprete iba a imprimir a shell como la salida de depuración
  5. 2

    Para aquellos que todavía no entienden.

    >>> a = iter(list(range(10)))
    >>> for i in a:
    ...    print(i)
    ...    next(a)
    ... 
    0 # print(i) printed this
    1 # next(a) printed this
    2 # print(i) printed this
    3 # next(a) printed this
    4 # print(i) printed this
    5 # next(a) printed this
    6 # print(i) printed this
    7 # next(a) printed this
    8 # print(i) printed this
    9 # next(a) printed this

    Como otros ya han dicho, next aumenta el iterador por 1 como se esperaba. La asignación de su valor a una variable no por arte de magia cambia su comportamiento.

  6. 1

    Se comporta de la manera que usted desea 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

Dejar respuesta

Please enter your comment!
Please enter your name here