Funkcja range() w Pythonie to jedno z najważniejszych narzędzi do generowania sekwencji liczb całkowitych, wykorzystywane przede wszystkim w pętlach i operacjach na liczbach. Jej elastyczność, wydajność i prostota czynią ją fundamentem pracy każdego programisty Pythona.
Czym jest range()?
range() to wbudowany typ i funkcja Pythona, która tworzy sekwencję liczb w zadanym zakresie, zgodnie z regułami matematyki dyskretnej (ciąg arytmetyczny):
- Przyjmuje do trzech argumentów –
- stop (wymagany);
- start (opcjonalny);
- step (opcjonalny).
Tworzony zakres nie zawiera liczby końcowej (stop); domyślną wartością start jest 0, a step wynosi 1.
Składnia i warianty użycia
range(stop)
range(start, stop)
range(start, stop, step)
Przykłady –
range(5)generuje:[0, 1, 2, 3, 4];range(2, 7)generuje:[2, 3, 4, 5, 6];range(0, 11, 2)generuje:[0, 2, 4, 6, 8, 10].
Aby uzyskać faktyczną listę liczb, konwertuj obiekt range na listę:
list(range(1, 5)) # Wynik: [1, 2, 3, 4]
Warto pamiętać, że range() nie generuje bezpośrednio listy – zwraca „leniwy” obiekt typu range, który zużywa minimalną ilość pamięci i generuje liczby „w locie” przy iteracji.
Użycie w pętlach
Range najczęściej wykorzystuje się do sterowania liczebnością i zakresem iteracji w pętlach for:
for i in range(5):
print(i)
# Wynik: 0 1 2 3 4
Możliwość ustawienia początku, końca i kroku pozwala np. na iterowanie po co drugiej wartości lub odliczanie w dół:
# Odliczanie malejące
for i in range(10, 0, -2):
print(i)
# 10 8 6 4 2
Dzięki temu można łatwo generować zarówno rosnące, jak i malejące sekwencje.
Właściwości typu range
- range() w Pythonie 3 to oddzielny typ danych (nie lista!);
- może być używany do wielomilionowych sekwencji bez zużywania dużej ilości pamięci (jest to tzw. lazy evaluation – liczby są generowane dopiero podczas użycia);
- obsługuje szybkie sprawdzenie zawierania:
if 10000 in range(0, 1000000): ...; - możesz sprawdzić typ, np. przez
type(range(10))(wynik:<class 'range'>).
Zakres i krok – niuanse działania
- start – liczba początkowa, domyślnie 0;
- stop – nie jest uwzględniana w sekwencji (sekwencja kończy się na stop – 1);
- step – domyślnie 1. Krok może być także ujemny, co umożliwia generowanie sekwencji malejących.
Przykład pustej sekwencji:
list(range(5, 2))
# Wynik: []
Aby uzyskać sekwencję malejącą, krok musi być ujemny:
list(range(10, 2, -2))
# Wynik: [10, 8, 6, 4]
Typowe zastosowania – praktyczne przykłady
- Iteracja po indeksach list:
colors = ['red', 'green', 'blue']
for i in range(len(colors)):
print(i, colors[i])
- Tworzenie list (w połączeniu z list comprehensions):
kwadraty = [i*i for i in range(10)]
- Generowanie specyficznych sekwencji:
liczby_parzyste = list(range(0, 21, 2))
Różnice między Python 2 a Python 3
W Pythonie 2 istniała również funkcja xrange(), która zwracała obiekt leniwy (tak jak range() w Pythonie 3). W Pythonie 3 range() zawsze jest obiektem leniwym; klasyczna funkcja range() z Pythona 2 generowała całą listę. Obecnie zawsze korzystaj z range() tak jak opisano powyżej.
Najczęstsze pułapki
- Ostatnia liczba w range nie jest uwzględniana:
range(0, 5)daje 0–4, nie 0–5; - przy kroku ujemnym start musi być większy od stop (np.
range(10, 0, -1)); - obiekt range nie obsługuje wszystkich operacji typowych dla list (np. nie można go zmieniać).
Podsumowanie praktyczne
range() to uniwersalne, ultraszybkie i wydajne narzędzie do pracy z sekwencjami liczbowymi, niezastąpione w pętlach, generowaniu indeksów i operacjach arytmetycznych na zbiorach liczb w Pythonie. Zapewnia ogromną elastyczność, a dzięki implementacji „leniwej” pozwala na obsługę bardzo dużych zakresów liczb, nie obciążając pamięci operacyjnej programu.
Dobrą praktyką jest konwertowanie obiektu range na listę tylko wtedy, gdy rzeczywiście potrzebujesz wszystkich wartości naraz (np. do wyświetlenia lub dalszego przetwarzania poza pętlą).
Dla początkujących i średniozaawansowanych programistów zrozumienie range() otwiera drzwi do pełnej kontroli nad iteracjami i przetwarzaniem danych liczbowych w Pythonie.