Quizás haya sido víctima de información errónea en la web, pero creo que es más probable que haya entendido mal 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.
for
bucle.iter
se pueden usar para obtener un iterador. Los iteradores son objetos que se pueden iterar mediante el uso denext
. Generadores es una categoría de iteradores (funciones generadoras y expresiones generadoras). Al menos eso es lo que creo ...Respuestas:
range
es una clase de objetos iterables inmutables. Su comportamiento de iteración se puede comparar conlist
s: no se puede llamarnext
directamente a ellos; tienes que obtener un iterador usandoiter
.Entonces no,
range
no es un generador.Puede estar pensando, "¿por qué no lo hicieron directamente iterable"? Bueno, los
range
s tienen algunas propiedades útiles que no serían posibles de esa manera:start
,stop
y losstep
atributos (desde Python 3.3),count
yindex
los métodos y apoyanin
,len
y__getitem__
las operaciones.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
fuente
range
__contains__
5 in range(10) => True
range
es vago (en comparación con Python 2, donde es solo una función que devuelve una lista).range(0,10,3)[3]
y9 in range(0,10,3)
. El rango es una lista bastante perezosa.