2011-01-14 19 views
5

Lo que quiero hacer es imprimir los números enteros del 0 al 5 en el siguiente código pero todo lo que obtengo es una dirección del iterador.Uso de un iterador para imprimir números enteros

def main(): 

    l = [] 
    for i in range(0,5): 
     l.append(i) 

    it = iter(l) 

    for i in range(0,5): 
     print it 
     it.next() 

if __name__ == '__main__': 
    main() 
+0

para que lo sepas, al llamar 'next()' se devuelve el siguiente valor en el iterador. Entonces, el cuerpo del ciclo debería leer 'print it.next()'. –

+0

Forma rápida de generar su iterador: it = iter (rango (5)) – nakedfanatic

Respuesta

9

Para acceder a los valores devueltos por un iterador, se utiliza el método del iterador next() así:

try: 
    while True: 
     val = it.next() 
     print(val) 
except StopIteration: 
    print("Iteration done.") 

siguiente() tiene tanto el propósito de avanzar en el iterador y devolver el siguiente elemento. StopIteration se lanza cuando finaliza la iteración.

Puesto que esto es bastante engorroso, todo esto está envuelto muy bien en el para-sintaxis:

for i in it: 
    print(i) 
print("Iteration done.") 

Más enlaces:

+0

En el primer bloque de código, ¿es posible no incluir la instrucción try? – pandoragami

+0

Sí, pero la excepción se lanzará más arriba. –

+0

parece que en la versión 3 (más o menos) debe cambiar al lado de __next__ – kdubs

3

Cuando tiene un iterador, tiene que iterar sobre él, no sobre un rango.

for i in it: 
    print(i) 
+0

¿Hay alguna forma de desreferenciar un iterador como en C++ usando * it? – pandoragami

+0

No, Python no utiliza punteros en absoluto. ¿Y por qué querrías? La desreferenciación se usa para obtener un valor, y Python ya le entrega ese valor. Trata de no pensar en términos de C++ cuando trabajes con Python. – Hollister

+1

Python 'it.next()' es más o menos equivalente a C++ '* it ++'. No puedes separar las operaciones. –

3

Cuando se utiliza el bucle, en realidad se está llamando el método del objeto iterador __next__ implícita. Entonces, simplemente no usaría algo como rango, sino que simplemente usaría el iterador mismo.

for i in it: 
    print i 

Por lo que vale la pena, xrange en Python 2 y range en Python 3 muestra un iterador, por lo que acaba de escribir su primer lazo con los que su solución deseada,

Cuestiones relacionadas