2014-12-16 14 views
5

Se faccio la seguente:Perché la portata non si esaurisce in Python-3?

a = range(9) 

for i in a: 
    print(i) 

# Must be exhausted by now 
for i in a: 
    print(i) 

# It starts over! 

generatori di Python, dopo aver raccolto StopIteration, normalmente smette di loop. In che modo la gamma produce questo modello - si riavvia dopo ogni iterazione.

+1

Hai letto [la documentazione] (https://docs.python.org/3/library/functions.html#func-range)? – jonrsharpe

+1

In breve: il costrutto 'for i in a' sta generando un iterabile separato ogni volta ... –

+0

Cosa ti ha fatto pensare' range() 'è un iteratore? (I generatori sono una forma specializzata di iteratori, sono gli iteratori che generano 'StopIteration'). –

risposta

6

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.

+0

Upvoting per menzionare esplicitamente la differenza tra iteratore e iterabile. – Floris

3

range è una sorta di tipo di sequenza immutabile. L'iterazione non lo esaurisce.

>>> a = iter(range(9)) # explicitly convert to iterator 
>>> 
>>> for i in a: 
...  print(i) 
... 
0 
1 
2 
3 
4 
5 
6 
7 
8 
>>> for i in a: 
...  print(i) 
... 
>>> 
Problemi correlati