
In Python, puoi generare una serie di numeri con la funzione interna range().
In questo articolo vengono descritti i seguenti contenuti.
- range() e il tipo di intervallo
- range(stop): 0 <= x < stop
- range(start, stop): start <= x < stop
- range(start, stop, step): start <= x < stop (crescente per passo)
- Intervallo invertito()
- range() con float
- range() e xrange() in Python2
Vedere il seguente articolo per i dettagli del ciclo for in Python.
range() e il tipo di intervallo
In Python 3, range() crea un oggetto di tipo range.
Un oggetto di tipo intervallo non memorizza valori, ma crea quando necessario, quindi i suoi valori non vengono visualizzati con print(). Poiché è un oggetto iterabile, il valore può essere stampato nel ciclo for.
print(range(3))
# range(0, 3)
print(type(range(3)))
# <class 'range'>
for i in range(3):
print(i)
# 0
# 1
# 2
Se vuoi generare una lista, usa list().
print(list(range(3)))
# [0, 1, 2]
Nel codice di esempio seguente, il risultato di range() viene convertito in un elenco con list(). Questo è solo per la spiegazione, quindi list() non è necessario con il ciclo for.
Nota che Python2 ha range() e xrange() e il comportamento di range() è diverso tra Python2 e Python3. Questo sarà spiegato alla fine di questo articolo.
range(stop): 0 <= x < stop
Se specifichi un intero come range(stop), una serie di numeri 0 <= i
print(list(range(3)))
# [0, 1, 2]
print(list(range(10)))
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Specificare un valore negativo lo rende vuoto.
print(list(range(-3)))
# []
range(start, stop): start <= x < stop
Se specifichi due numeri interi come range(start, stop), una serie di numeri inizia <= i
Il risultato sarà vuoto quando stop <= start.
print(list(range(3, 10)))
# [3, 4, 5, 6, 7, 8, 9]
print(list(range(10, 3)))
# []
print(list(range(-3, 3)))
# [-3, -2, -1, 0, 1, 2]
print(list(range(3, -3)))
# []
range(0, stop) è equivalente a range(stop).
print(range(0, 3) == range(3))
# True
range(start, stop, step): start <= x < stop (crescente per passo)
Se specifichi tre numeri interi come range(start, stop, step), viene generata una serie di numeri start <= i < stop crescente per passo.
Se specifichi un valore negativo per il passaggio del terzo argomento, questo diminuirà. In questo caso, sarà vuoto a meno che start <= stop.
print(list(range(3, 10, 2)))
# [3, 5, 7, 9]
print(list(range(10, 3, 2)))
# []
print(list(range(10, 3, -2)))
# [10, 8, 6, 4]
print(list(range(3, 10, -2)))
# []
range(start, stop, 1) è equivalente a range(start, stop).
print(range(3, 10, 1) == range(3, 10))
# True
range(0, stop, 1) equivale a range(0, stop) e range(stop).
print(range(0, 10, 1) == range(0, 10) == range(10))
# True
Intervallo invertito()
Specificare un valore negativo per il passaggio del terzo argomento può generare numeri decrescenti.
print(list(range(3, 10, 2)))
# [3, 5, 7, 9]
print(list(range(9, 2, -2)))
# [9, 7, 5, 3]
È anche possibile utilizzare la funzione incorporata reversed() per invertire il risultato di range().
print(list(reversed(range(3, 10, 2))))
# [9, 7, 5, 3]
Inoltre, in questo caso, non hai bisogno di list() se lo usi nell’istruzione for.
for i in reversed(range(3, 10, 2)):
print(i)
# 9
# 7
# 5
# 3
range() con float
Come negli esempi precedenti, puoi solo specificare l’intero int come argomento per range().
Si verifica un errore quando viene specificato il numero a virgola mobile float.
# print(list(range(0.3, 1.0, 0.2)))
# TypeError: 'float' object cannot be interpreted as an integer
Se vuoi generare una serie di float, usa list comprehensions.
print([i / 10 for i in range(3, 10, 2)])
# [0.3, 0.5, 0.7, 0.9]
Potrebbe verificarsi un errore leggero durante la moltiplicazione di numeri in virgola mobile. Può essere arrotondato usando round().
print([i * 0.1 for i in range(3, 10, 2)])
# [0.30000000000000004, 0.5, 0.7000000000000001, 0.9]
print([round(i * 0.1, 1) for i in range(3, 10, 2)])
# [0.3, 0.5, 0.7, 0.9]
Se puoi usare NumPy, è più facile usare np.arange(). La specifica dell’argomento di np.arange() è la stessa di quella usare di range() e si può float.
import numpy as np
print(np.arange(3))
# [0 1 2]
print(np.arange(3, 10))
# [3 4 5 6 7 8 9]
print(np.arange(3, 10, 2))
# [3 5 7 9]
print(np.arange(0.3, 1.0, 0.2))
# [0.3 0.5 0.7 0.9]
Vedere i seguenti articoli per np.arange() e la conversione tra numpy.ndarray e list.
range() e xrange() in Python2
Python2 ha due funzioni, range() e xrange(). Python3 non ha xrange() ma solo range().
C’è una differenza tra range() in Python2 e Python3. Nota che si verificherà un errore se il vecchio codice per Python2 viene eseguito come in Python3.
range() fornisce list e xrange() arriva un oggetto di tipo xrange.
print(range(3))
# [0, 1, 2]
print(type(range(3)))
# <type 'list'>
print(xrange(3))
# xrange(3)
print(type(xrange(3)))
# <type 'xrange'>
I tipi xrange() e xrange in Python2 sono equivalenti ai tipi range() e range in Python3.
Se vuoi eseguire il vecchio codice Python2 in Python3, devi cambiare xrange() in range().
In Python2, range() restituisce una lista, che è equivalente a list(range()) in Python3. Se viene utilizzato nell’istruzione per, non è necessario list(), ma se viene utilizzato come elenco, è necessario aggiungere list().