Skip to content

Come usare range() in Python

Python

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().