urls index funcion python iterator zip python-3.x

index - funcion zip python



entender la funciĆ³n zip (2)

Parece que es un error en la documentación. El código ''equivalente'' funciona en python2 pero no en python3, donde entra en un bucle infinito.

Y la última versión de la documentación tiene el mismo problema: http://docs.python.org/release/3.1.2/library/functions.html

Parece que el problema fue el cambio 61361 , ya que fusionó los cambios de Python 2.6 sin verificar que eran correctos para python3.

Parece que el problema no existe en el conjunto de documentación de troncales, pero probablemente deba informar un error al respecto en http://bugs.python.org/ .

Toda la discusión es sobre python 3.1.2; ver los documentos de Python para el origen de mi pregunta.

Sé lo que hace zip ; Simplemente no entiendo por qué se puede implementar así:

def zip(*iterables): # zip(''ABCD'', ''xy'') --> Ax By iterables = map(iter, iterables) while iterables: yield tuple(map(next, iterables))

Digamos que llamo zip(c1, c2, c3) . Si entiendo correctamente, los iterables son inicialmente la tupla (c1, c2, c3).

La línea iterables = map(iter, iterables) convierte en un iterador que devolvería iter (c1), iter (c2), iter (c3) si se iterara.

Dentro del ciclo, el map(next, iterables) es un iterador que volvería a next(iter(c1)) , next(iter(c2)) y next(iter(c3)) si se itera. La llamada de tuple convierte en (next(iter(c1)), next(iter(c2)), next(iter(c3)) , agotando su argumento ( iterables ) en la primera llamada hasta donde yo sé. no entiendo cómo el ciclo while logra continuar dado que verifica los iterables , y si continúa, por qué la tuple no devuelve una tupla vacía (el iterador está agotado).

Estoy seguro de que me estoy perdiendo algo muy simple ...


Parece que se supone que este código debe leerse como código python-2.x. Ni siquiera se ejecuta correctamente en py3k.

Lo que sucede en python-2.x es que el map devuelve una lista de iteradores, cuando se llama al next devuelve un elemento de iterador, esos elementos combinados en tupla. Entonces, dado

>>> zip(''ABCD'', ''xy'')

iterables es una lista de 2 iteradores, en cada iteración dentro del ciclo while, el elemento siguiente (primer restante) del iterador se consume ('' ''A'' y ''x'' , etc.), y se produce como un elemento de una tupla, luego después se StopIteration los últimos elementos, (en la 3 ª iteración) elevada StopIteration detiene el generador. while iterables siempre permanecen True .