Lekcja 5. Pętla for w Pythonie — range() i iteracja po sekwencjach
latwyPo co się tego uczymy?
Gdy WIESZ z góry, ile razy coś ma się powtórzyć (albo chcesz przejść po WSZYSTKICH elementach czegoś), pętla for jest naturalniejszym i bezpieczniejszym wyborem niż while — nie da się przez pomyłkę napisać nieskończonej pętli for z range(). To druga z dwóch podstawowych pętli Pythona, równie ważna na maturze co while.
Teoria
Pętla for w Pythonie działa INACZEJ niż w C#/Javie — nie ma tu klasycznego zapisu for (int i=0; i<n; i++). Python for zawsze PRZECHODZI PO ELEMENTACH jakiejś sekwencji (listy, tekstu, zakresu liczb). Składnia: for zmienna in sekwencja:.
Funkcja range() — generator liczb do iterowania:
range(5)→ liczby0, 1, 2, 3, 4(start od 0, KOŃCOWA wartość NIE jest wliczana, więcrange(5)to 5 liczb: 0-4).range(2, 8)→2, 3, 4, 5, 6, 7(własny start, koniec PRZED podaną wartością).range(0, 10, 2)→0, 2, 4, 6, 8(trzeci argument to KROK).range(10, 0, -1)→10, 9, 8, ..., 1(krok UJEMNY pozwala liczyć wstecz).
Iteracja po innych sekwencjach — for równie dobrze przechodzi po tekście (for litera in "Python": — każda litera osobno) i po listach (poznasz dokładniej w ostatniej lekcji tego działu: for element in [1, 2, 3]:).
Funkcja enumerate() — gdy w pętli potrzebujesz JEDNOCZEŚNIE indeksu (numeru pozycji) i wartości, enumerate() daje obie naraz: for indeks, wartosc in enumerate(lista): — dużo czytelniejsze niż ręczne liczenie indeksu osobną zmienną.
Pętle zagnieżdżone — pętla for może zawierać KOLEJNĄ pętlę for w środku — klasyczne zastosowanie to tabliczka mnożenia (zewnętrzna pętla po wierszach, wewnętrzna po kolumnach) albo przetwarzanie danych dwuwymiarowych (siatka, plansza).
Wzorzec sumowania/zliczania — bardzo częsty schemat: zmienna wynikowa (np. suma = 0) zaczyna od wartości "neutralnej", a w KAŻDEJ iteracji pętli aktualizujemy ją (suma += x). Ten sam wzorzec działa dla sumy, iloczynu (start od 1, *=), zliczania (licznik += 1) i wielu innych agregacji.
break i continue w for — działają identycznie jak w pętli while: break natychmiast kończy CAŁĄ pętlę, continue pomija resztę BIEŻĄCEJ iteracji i przechodzi do następnej.
Schemat
range(5) → 0, 1, 2, 3, 4 (5 liczb, licząc od zera)
range(2, 8) → 2, 3, 4, 5, 6, 7 (start, koniec-PRZED)
range(0, 10, 2) → 0, 2, 4, 6, 8 (start, koniec-przed, KROK)
range(10, 0, -1) → 10,9,8,...,1 (KROK ujemny = liczenie wstecz)
PĘTLE ZAGNIEŻDŻONE - tabliczka mnożenia 3x3:
for i in range(1, 4): # wiersze: 1, 2, 3
for j in range(1, 4): # kolumny: 1, 2, 3 (dla KAŻDEGO i)
print(i * j, end=" ")
print() # nowa linia po każdym wierszu
Wynik:
1 2 3
2 4 6
3 6 9
Przykład z życia
Aplikacja licząca sumę wydatków z paragonu przechodzi PĘTLĄ for po liście wszystkich pozycji zakupów i dodaje ich ceny do sumy — dokładnie ten sam wzorzec sumowania, którego nauczysz się w tej lekcji, tylko na prawdziwych danych zamiast przykładowych liczb.
petla_for.py
# Podstawowa pętla for z range()
for i in range(1, 6):
print(f"Numer uczestnika: {i}")
# Iteracja po tekście
for litera in "PYTHON":
print(litera, end=" ") # P Y T H O N
print()
# Sumowanie w pętli - klasyczny wzorzec
suma = 0
for liczba in range(1, 11):
suma += liczba
print(f"Suma liczb od 1 do 10: {suma}") # 55
# enumerate() - indeks i wartość jednocześnie
uczniowie = ["Ala", "Bartek", "Celina"]
for indeks, imie in enumerate(uczniowie):
print(f"{indeks + 1}. {imie}")
# Pętle zagnieżdżone - tabliczka mnożenia
for i in range(1, 4):
for j in range(1, 4):
print(i * j, end="t")
print() # nowa linia po każdym wierszu zewnętrznej pętli
Komentarz i wyjaśnienie kodu
range(1, 6) daje liczby 1-5, NIE 1-6 — górna granica NIGDY nie jest wliczana. To najczęstsza pułapka "o jeden" (ang. off-by-one) w pętlach for.
enumerate(uczniowie) zwraca PARY (indeks, wartość) dla każdego elementu — indeks + 1 w przykładzie zamienia numerację od zera (jak w Pythonie) na numerację od jedynki (bardziej naturalną dla człowieka, "1. Ala" zamiast "0. Ala").
W pętlach zagnieżdżonych print() BEZ argumentów (na końcu zewnętrznej pętli, ale POZA wewnętrzną) wypisuje pusty znak nowej linii — to sprawia, że kolejny wiersz tabliczki mnożenia zaczyna się od nowej linijki, a nie ciągnie się w jednym ciągu.
Ćwiczenie samodzielne
Uruchom kod i zmień zakres tabliczki mnożenia z 3x3 na 5x5. Następnie zmodyfikuj przykład z enumerate() tak, żeby wypisywał uczniów w kolejności OD OSTATNIEGO do pierwszego (wskazówka: range() z ujemnym krokiem albo funkcja reversed()).
Plac zabaw — wypróbuj online
Poniższy kod wykonuje się od razu w Twojej przeglądarce — nic nie trzeba instalować. Zmień kod i kliknij „Uruchom”.
Zadania do pracy własnej
Wypisz pętlą
forwszystkie liczby parzyste od 2 do 20 (wykorzystaj trzeci argumentrange()— krok).Napisz program obliczający silnię podanej przez użytkownika liczby (np.
5! = 5*4*3*2*1 = 120) używając pętlifori wzorca "mnożenia w pętli" (analogicznego do sumowania z przykładu, ale z*=zamiast+=, zaczynając odwynik = 1).Napisz program wypisujący tzw. "trójkąt Pascala" o zadanej liczbie wierszy — w każdym wierszu N wypisz N gwiazdek (np. dla 5 wierszy: 1 gwiazdka, potem 2, potem 3, 4, 5) używając pętli zagnieżdżonych. Dla chętnych: wyśrodkuj trójkąt spacjami, żeby przypominał prawdziwy trójkąt (wskazówka: metoda tekstowa
.rjust()albo ręczne dodawanie spacji).
Typowe błędy
Zapominanie, że górna granica range() NIE jest wliczana — range(1, 10) daje liczby 1-9, nie 1-10; żeby uzyskać liczby WŁĄCZNIE do 10, trzeba napisać range(1, 11).
Ręczne liczenie indeksu zamiast użycia enumerate() — kod z osobną zmienną i = 0 zwiększaną ręcznie wewnątrz pętli for element in lista: działa, ale jest mniej czytelny i bardziej podatny na błędy niż wbudowany enumerate().
Umieszczenie print() (nowa linia) w NIEWŁAŚCIWYM miejscu w pętlach zagnieżdżonych — jeśli trafi do wnętrza pętli wewnętrznej zamiast na jej końcu (na poziomie pętli zewnętrznej), każda liczba w tabliczce mnożenia wyląduje w osobnej linii zamiast w jednym wierszu.
Nawiązanie do egzaminu zawodowego
Pętla for (szczególnie z range()) to najczęściej używana pętla w zadaniach maturalnych, gdzie liczba powtórzeń jest znana albo wynika z długości danych. W dziale "Algorytmy i złożoność" pętle zagnieżdżone for pojawiają się m.in. w sortowaniu bąbelkowym i przez wstawianie — a złożoność O(n²) tych algorytmów wynika WŁAŚNIE z DWÓCH zagnieżdżonych pętli for.