L'oggetto restituito da range()
(o xrange()
in Python2.x) è noto come generator.
Invece di memorizzare l'intera gamma, [0,1,2,..,9]
, nella memoria, il generatore memorizza una definizione di (i=0; i<10; i+=1)
e calcola il valore successivo solo quando necessario (AKA minimale di valutazione).
In sostanza, un generatore consente di tornare una lista come la struttura, ma qui ci sono alcune differenze:
- Un elenco memorizza tutti gli elementi al momento della creazione. Un generatore genera l'elemento successivo quando è necessario.
- Un elenco può essere ripetuto per quanto è necessario, un generatore può essere iterato solo su esattamente una volta.
- Un elenco può ottenere elementi per indice, un generatore non può - genera solo valori una volta, dall'inizio alla fine.
Un generatore può essere creata in due modi:
(1) Molto simile alla lista di comprensione:
# this is a list, create all 5000000 x/2 values immediately, uses []
lis = [x/2 for x in range(5000000)]
# this is a generator, creates each x/2 value only when it is needed, uses()
gen = (x/2 for x in range(5000000))
(2) Come funzione, utilizzando yield
per restituire il valore successivo:
# this is also a generator, it will run until a yield occurs, and return that result.
# on the next call it picks up where it left off and continues until a yield occurs...
def divby2(n):
num = 0
while num < n:
yield num/2
num += 1
# same as (x/2 for x in range(5000000))
print divby2(5000000)
Nota: Anche se range(5000000)
è un generatore in Python3.x, [x/2 for x in range(5000000)]
è ancora un elenco. range(...)
fa il suo lavoro e genera x
uno alla volta, ma l'intero elenco dei valori x/2
verrà calcolato quando questo elenco viene creato.
Creare un generatore (es. 'def' che contiene' yield') che causa un effetto collaterale come 'print' prima che produca un valore. Quindi avvolgere il generatore con un ritardo di un secondo ogni iterazione. Quando si verificano le stampe? Il 'range' di Python 3 (molto simile a' xrange' in Python 2) funziona in questo modo: i calcoli non vengono eseguiti fino a quando non vengono richiesti. Questo è ciò che significa "valutazione pigra". – user2864740