Come è stato già detto da altri, range
non è un generatore, ma tipo di sequenza (come lista) che lo rende un iterable
che è NON è uguale a iterator
.
Le differenze tra iterable
, iterator
e generator
sono sottili (almeno per chi è nuovo in Python).
- Un
iterator
fornisce un metodo __next__
e può essere esaurito, aumentando così StopIteration
.
- Un
iterable
è un oggetto che fornisce uno iterator
sul suo contenuto. Ogni volta che viene chiamato il suo metodo __iter__
, restituisce un nuovo oggetto iteratore, quindi è possibile (indirettamente) scorrere su di esso più volte.
A generator
è una funzione che restituisce un valore iterator
, che può essere esaurito.
Inoltre, è interessante sapere che il ciclo for
interroga automaticamente lo iterator
di qualsiasi iterable
. Ecco perché è possibile scrivere for x in iterable: pass
anziché for x in iterable.__iter__(): pass
o for x in iter(iterable): pass
.
Tutto ciò è nella documentazione, ma IMHO è piuttosto difficile da trovare. Il miglior punto di partenza è probabilmente lo Glossary.
Hai letto [la documentazione] (https://docs.python.org/3/library/functions.html#func-range)? – jonrsharpe
In breve: il costrutto 'for i in a' sta generando un iterabile separato ogni volta ... –
Cosa ti ha fatto pensare' range() 'è un iteratore? (I generatori sono una forma specializzata di iteratori, sono gli iteratori che generano 'StopIteration'). –