iteradores generadoras generador funciones español codigo python python-3.x generator

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 y step (desde Python 3.3), métodos de count e index y admiten operaciones in , 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