https://docs.python.org/3/library/stdtypes.html#ranges
W zastosowaniach często potrzebne są ciągi liczb całkowitych (rosnące lub malejące), w których różnica między sąsiednimi elementami jest stała. W Pythonie mamy dedykowane narzędzia do obsługi takich ciągów.
+--------------------------+-----------------------------+ | Operacja | Znaczenie | +--------------------------+-----------------------------+ | range(start, stop, step) | budowanie listy (Py2) | | range(start, stop) | step=1 | | range(stop) | start=0, step=1 | | xrange(i, j, k) | generator (Py2) | +--------------------------+-----------------------------+ | R = range(i, j, k) | generator (Py3) | | len(R) | długość zakresu | | L = list(R) | budowa listy | | list(range(0)) | pusta lista | | R.start | początek zakresu (Py3.3+) | | R.stop | koniec zakresu (Py3.3+) | | R.step | krok w zakresie (Py3.3+) | | for item in R: pass | iteracja | | item in R | zawieranie w zakresie | | item not in R | zawieranie w zakresie | | R.index(item) | szukanie pozycji elementu | | R[i] | użycie indeksu | | R[i:j] | wycinek (nowy 'range') | | R[i:j:k] | wycinek (nowy 'range') | | R1 == R2, R1 != R2 | porównywanie jako sekwencje | +--------------------------+-----------------------------+
W Pythonie 2 funkcja wbudowana 'range()' zwraca listę liczb.
Klasa 'xrange' zwraca obiekt, który generuje liczby na żądanie.
range(i, j) zwraca [i, i+1, i+2, ..., j-1] dla i < j. range(i, j, -1) zwraca [i, i-1, i-2, ..., j+1] dla i > j. Końcowy punkt jest pomijany. range(i, j, k) zwraca [i, i+k, i+2*k, ..., last], gdzie zwykle i < last < j dla k > 0, i > last > j dla k < 0.
Obiekt 'range' reprezentuje niezmienną sekwencję liczb i zwykle jest używany w pętli 'for' do wykonania ustalonej liczby przebiegów pętli.
Zaletą 'range' w porównaniu z listami i krotkami jest stała i nieduża ilość pamięci, niezależnie od wielkości zakresu.
list(range(1, 6)) # [1, 2, 3, 4, 5] list(range(4)) # [0, 1, 2, 3], domyślny start to 0 list(range(1, 9, 2)) # [1, 3, 5, 7], krok co 2 list(range(5, 2, -1)) # [5, 4, 3] range(0, 3, 2) == range(0, 4, 2) # True, choć 'stop' się różnią
import sys r1 = range(1, 10, 2) list(r1) # [1, 3, 5, 7, 9] r2 = r1[0:10:2] # range(1, 11, 4) list(r2) # [1, 5, 9] r3 = range(pow(10, 10)) # range(0, 10000000000) sys.getsizeof(r1) # 48 sys.getsizeof(r2) # 48 sys.getsizeof(r3) # 48
# Ciekawostka. sys.getsizeof((0, 1)) # 64 sys.getsizeof(range(2)) # 48 sys.getsizeof((0, 1, 2)) # 72 sys.getsizeof(range(3)) # 48