Ostatnio omawialiśmy bardzo istotną konstrukcję w Pythonie, ale i ogólnie w programowaniu, jaką jest pętla. Jest, a raczej są, bo jest ich kilka, konstrukcja, dzięki której, unikamy powtarzania. W programowaniu jest to dość istotna zasada, by właśnie unikać powtarzania. Pętle to jeden z podstawowych sposobów na spełnienie tzw. zasady DRY - Don't repeat yourself. Teraz funkcja range!
Dziś natomiast trochę uzupełnimy naszą wiedzę o instrukcję range, zwłaszcza w kontekście pętli. Funkcja ta będzie nam niesamowicie pomocna, zwłaszcza w pętli for.
Generowanie wartości w pętli z pomocą range
Poprzednio omówiliśmy pętlę for w kontekście tego, że iteruje (przechodzi) ona po wartościach jakiejś kolekcji, jakiegoś zbioru wartości. Co natomiast gdy nie mamy takiego zbioru, a chcielibyśmy by np. pętla for wykonała się 5 razy? No nie ma rady, trzeba by było utworzyć taki zbiór i po nim iterować. No tak, to prawda, choć jednak istnieje też inny sposób.
I tutaj na scenę wchodzi, cała na biało (albo może żółto) funkcja range. Jest to wbudowana funkcja, która pozwoli nam zdefiniować jakiś zakres wartości w dynamiczny sposób i wygenerować go bezpośrednio w pętli (taki generator, ale o tym kiedy indziej).
Poniżej pokazaliśmy sobie, jak funkcja range, umieszczona w pętli, może zwracać podany zakres i tak pozwalać pętli powtarzać się konkretną ilość razy.

Na powyższej grafice widzimy kod, który uruchamia pętlę for. W tej pętli mamy zmienną v, która reprezentuje pojedynczą wartość i pętla powtarza się "in" funkcji range, gdzie pierwsza liczba to początek zakresu, a druga to jego koniec. Innymi słowy, pętla powtarza się w zakresie od 1 do 10, co umożliwia funkcja range. W samej pętli, pojedyncza wartość wyświetla się w każdej iteracji. Zatem funkcja range, tworzy nam dynamicznie, w pętli, zakres wartości po którym pętla może iterować.
Musimy jednak pamiętać tutaj, że wyświetlone przy uruchomieniu tego kodu liczby będą trochę inne od spodziewanych. Nie uzyskamy wartości wyświetlonych od 1 do 10, a od 1 do 9. Dzieje się tak, bo końcowa wartość przedziału to n-1, czyli zawsze o jeden mniejsza od podanej wartości. Dlatego jeśli chcę uzyskać wartości od 1 do 10 to muszę użyć range(1,11). Innymi słowy, indeksowanie jest zawsze rozpoczynane od zera.
Inne warianty funkcji range
Nie musimy podawać też wszystkich parametrów funkcji range, możemy podać przykładowo tylko jeden, który będzie wtedy określał tylko koniec zakresu i funkcja sobie poradzi. Natomiast musimy wtedy pamiętać, że początkiem zakresu będzie cyfra zero. Inaczej mówiąc, otrzymamy wartości od 0 do 9, przy podaniu tylko końca zakresu.

W funkcji range możemy także podać trzy wartości. Wtedy określimy też krok, czyli co którą wartość zobaczymy na ekranie, lub inaczej mówiąc co która wartość zostanie użyta.

Powyżej widzimy funkcję range w pełnej okazałości, używającą pełnię swojej mocy w tym kontekście. Mamy bowiem omawianą funkcję z trzema argumentami. Pierwsza z wartości to początek zakresu, jak poprzednio. Druga wartość także pozostaje bez zmian - definiuje koniec zakresu. Trzeci argument natomiast, to właśnie wspomniany krok - definiuje co która wartość się wlicza w zakres. Poniżej mamy wynik takiego kodu.

Jak możemy wywnioskować z powyższej grafiki, mamy tutaj użyte wartości od jeden poczynając, i idąc w górę co dwa, czyli tak w sumie nieparzyste. Oczywiście wartości jakie są używane, mieszczą się w zdefiniowanym zakresie. Jeśli zmienilibyśmy ostatni parametr funkcji na 3 lub 4 to analogicznie dostaniemy co 3 lub 4 wartość. Jak możemy zobaczyć funkcja range jest dość elastyczna i możemy ją dowolnie dostosować używając w pętli 😉

[…] w dowolnym miejscu kodu w dowolny sposób. Jest to kolejne „ucieleśnienie” zasady DRY. Blok takiego kodu może zawierać oczywiście dowolne instrukcje, czy deklaracje, które często […]
[…] udekorowanie naszego kodu 🙂 Tworząc sobie radośnie funkcje, i przestrzegając przy tym zasady DIY można natrafić na problem, gdy przykładowo mamy funkcję x. Chcemy jednak mieć jeszcze jedną […]