range

https://docs.python.org/3/library/stdtypes.html#ranges

WPROWADZENIE

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 |
+--------------------------+-----------------------------+

PYTHON 2

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.

PYTHON 3

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