Todo el debate trata sobre python 3.1.2; ver Python docs para la fuente de mi pregunta.entendiendo la función zip
Sé lo que zip
hace; Simplemente no entiendo por qué se puede implementar como esto:
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)
la convierte en un iterador que devolvería iter (c1), iter (c2), iter (c3) si se repite.
Dentro del bucle, map(next, iterables)
es un iterador que devolvería next(iter(c1))
, next(iter(c2))
y next(iter(c3))
si itera a través. La llamada tuple
la convierte a (next(iter(c1)), next(iter(c2)), next(iter(c3))
, agotando su argumento (iterables
) en la primera llamada que yo sepa. No entiendo cómo el circuito while
logra continuar dado que comprueba iterables
; y si continúa, por qué la llamada tuple
no devuelve una tupla vacía (el iterador está agotado).
Estoy seguro de que me falta algo muy simple ..
Extraño, no deja de dar vueltas para mí aunque se vea perfectamente bien ... y mi propio intento tampoco funciona O.O estoy sorprendido. – delnan
Creo que esto es solo pseudocódigo y no debe tomarse literalmente. –
@Radomir Dopieralski Es código Python, no seudocódigo, copiado directamente de la documentación. Sería bastante triste si no pudiera confiar en ello, y en su lugar tuve que hacer mi mejor conjetura acerca de lo que realmente hace la función. Me refiero al código de esta manera cuando no estoy 100% seguro de la semántica de la función. – max