generadoras - Si range() es un generador en Python 3.3, ¿por qué no puedo llamar a next() en un rango?
python funciones generadoras (1)
Quizás he sido víctima de la información errónea en la web, pero creo que es más probable que haya entendido mal algo. Basado en lo que he aprendido hasta ahora, range () es un generador y los generadores se pueden usar como iteradores. Sin embargo, este código:
myrange = range(10)
print(next(myrange))
me da este error:
TypeError: ''range'' object is not an iterator
¿Que me estoy perdiendo aqui? Esperaba que esto imprimiera 0, y avanzar al próximo valor en myrange
. Soy nuevo en Python, así que acepte mis disculpas por la pregunta bastante básica, pero no pude encontrar una buena explicación en ningún otro lado.
range
es una clase de objetos iterables inmutables. Su comportamiento de iteración se puede comparar con list
s: no puede llamar a next
directamente sobre ellos; tienes que obtener un iterador usando iter
.
Entonces, no, el range
no es un generador.
Usted puede estar pensando, "¿por qué no lo hicieron directamente iterable"? Bueno, range
s tiene algunas propiedades útiles que no serían posibles de esa manera:
- Son inmutables, por lo que se pueden usar como claves de diccionario.
- Tienen los atributos
start
,stop
ystep
(desde Python 3.3), métodos decount
eindex
y admiten operacionesin
,len
y__getitem__
. - Puede iterar sobre el mismo
range
varias veces.
>>> myrange = range(1, 21, 2)
>>> myrange.start
1
>>> myrange.step
2
>>> myrange.index(17)
8
>>> myrange.index(18)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: 18 is not in range
>>> it = iter(myrange)
>>> it
<range_iterator object at 0x7f504a9be960>
>>> next(it)
1
>>> next(it)
3
>>> next(it)
5