Si range () es un generador en Python 3.3, ¿por qué no puedo llamar a next () en un rango?

Quizás he sido víctima de la desinformación en la web, pero creo que es más probable que haya malentendido algo. Según 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 avanzara al siguiente 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 lugar.

Related of "Si range () es un generador en Python 3.3, ¿por qué no puedo llamar a next () en un rango?"

range es una clase de objetos iterables inmutables. Su comportamiento de iteración puede compararse con la list s: no puede llamar a next directamente sobre ellos; tienes que obtener un iterador mediante el uso de iter

Así que no, el range no es un generador.

Usted puede estar pensando, “¿por qué no lo hicieron directamente iterable”? Bueno, el range s tiene algunas propiedades útiles que no serían posibles de esa manera:

  • Son inmutables, por lo que pueden utilizarse como claves de diccionario.
  • Tienen los atributos de start , stop y step (desde Python 3.3), métodos de count e index y son compatibles in operaciones, len y __getitem__ .
  • Puedes iterar en 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 "", line 1, in  ValueError: 18 is not in range >>> it = iter(myrange) >>> it  >>> next(it) 1 >>> next(it) 3 >>> next(it) 5