2013-08-12 25 views
5

Ogni volta che provo ad assegnare un intervallo a una variabile in questo modo:assegnare un intervallo ad una variabile (Python)

Var1 = range(10, 50) 

quindi provare a stampare la variabile:

Var1 = range(10, 50) 
print(Var1) 

It semplicemente stampe ' range (10, 50) 'invece di tutti i numeri nell'elenco. Perchè è questo?

+0

È questo Python 3? –

+0

@David Z Sì. È. – Justin

risposta

11

Thats perché range restituisce un oggetto Range in Python 3. Mettere in list per fargli fare ciò che si vuole:

>>> Var1 = range(10, 50) 
>>> print(list(Var1)) 
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 
32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49] 
>>> 
+0

Ok. Grazie. Questo funziona. Quindi immagino che devi rappresentare la gamma di numeri come una lista per poter stampare correttamente. – Justin

+0

Sì. In Python 2.x, 'range' ha restituito una lista come desiderato. In 3.x, hanno fatto restituire un oggetto range. – iCodez

-1

Questo è qualcosa che è stato cambiato in Python 3.0. Si potrebbe ricreare una funzione simile in Python 2.7 in questo modo,

def range(low, high=None): 
    if high == None: 
    low, high = 0, low 
    i = low 
    while i < high: 
    yield i 
    i += 1 

Il vantaggio di questo, è che l'elenco non deve essere creato prima della sua utilizzato.

for i in range(1,999999): 
    text = raw_input("{}: ".format(i)) 
    print "You said {}".format(text) 

che funziona come questo:

1: something 
You said something 
2: something else 
You said something else 
3: another thing 
You said another thing 

In Python 3.X, se non abbiamo mai arrivare alla fine del nostro ciclo (999997 iterazioni), non potrà mai calcolare tutti gli elementi. In Python 2.7 deve inizialmente costruire l'intera gamma. In alcune vecchie implementazioni Python, questo era molto lento.

7

Probabilmente dovresti capire un po 'di quello che sta succedendo sotto il cofano.

In python 3, range restituisce un oggetto range, non un elenco come potrebbe essersi aspettato. (N.B. Python 3 di range è python 2 di xrange)

#python 2 
>>> type(range(5)) 
<type 'list'> 

#python 3 
>>> type(range(5)) 
<class 'range'> 

Cosa vuol dire? Bene, l'oggetto range è semplicemente un iteratore: è necessario forzarlo per iterare per ottenere il suo contenuto. Potrebbe sembrare fastidioso per il neonato, ma si rivela piuttosto utile.

>>> import sys 
>>> sys.getsizeof(range(5)) 
24 
>>> sys.getsizeof(range(1000000)) 
24 

Il più grande vantaggio di fare le cose in questo modo: costante (minuscolo) occupazione di memoria. Per questo motivo, molte cose nella libreria standard restituiscono semplicemente gli iteratori. Il compromesso è che se si desidera semplicemente vedere l'intervallo iterato, è necessario forzarlo per iterare. L'idioma più comune per farlo è list(range(n)). Ci sono anche le interpretazioni, i cicli for e altri metodi esoterici. Gli iteratori sono una parte enorme dell'apprendimento di Python, quindi abituati a loro!

Problemi correlati