Techniczne

Pętla for: jak działa i jak jej używać na przykładach

Pętla for powtarza instrukcje dla każdego elementu sekwencji lub zakresu. Składnia w Pythonie, range, zagnieżdżanie, break, continue, else i błędy o jeden.

Ilustracja: taśma z kolejnymi ponumerowanymi polami, po której przesuwa się znacznik od pierwszego do ostatniego pola
Obraz wygenerowany przez AI

Składnia pętli for w Pythonie

Według dokumentacji instrukcja for służy do iteracji po elementach sekwencji (na przykład napisu, krotki lub listy) albo innego obiektu iterowalnego. Zmienna pętli dostaje po kolei każdy element, a ciało pętli wykonuje się raz dla każdego z nich.

for litera in "abc":
    print(litera, end=",")
  # a,b,c,

Ten sam zapis działa dla listy, krotki czy słownika. Do przejścia po elementach z numerami służy enumerate:

for numer, litera in enumerate(["a", "b"]):
    print(numer, litera)
  # 0 a
  # 1 b

Funkcja range: zakres i krok

Jeśli pętla ma wykonać się określoną liczbę razy lub przejść po liczbach, użyj range. Dokumentacja opisuje range jako niemutowalną sekwencję liczb, używaną zwykle do powtarzania pętli określoną liczbę razy. Jeśli pominiesz argument step (krok), domyślnie wynosi 1, a pominięty start to 0. Koniec zakresu (stop) nie wchodzi do wyniku.

Przesuń tabelę, aby zobaczyć wszystkie kolumny →

ZapisWygenerowane liczby
range(5)0, 1, 2, 3, 4
range(2, 7)2, 3, 4, 5, 6
range(0, 10, 3)0, 3, 6, 9
range(5, 0, -1)5, 4, 3, 2, 1
range(3, 3)brak liczb (pusty zakres)

Przy ujemnym kroku zakres maleje i kończy się przed wartością stop. Krok równy zero powoduje błąd ValueError.

Przykład 1: suma liczb od 1 do 100

suma = 0
for i in range(1, 101):
    suma += i
print(suma)   # 5050

range(1, 101) daje liczby od 1 do 100, bo 101 już nie wchodzi do zakresu. Wynik 5050 zgadza się z sum(range(1, 101)).

Przykład 2: tabliczka mnożenia

for k in range(1, 4):
    print(k, "x 7 =", k * 7)
  # 1 x 7 = 7
  # 2 x 7 = 14
  # 3 x 7 = 21

Pętle zagnieżdżone

Pętla może zawierać inną pętlę. Pętla wewnętrzna wykonuje się w całości przy każdym obiegu zewnętrznej.

for n in range(1, 4):
    for m in range(1, 4):
        print(n * m, end=" ")
    print()
  # 1 2 3
  # 2 4 6
  # 3 6 9

Liczba obiegów ciała wewnętrznej pętli to iloczyn: tu 3 · 3 = 9. Przy zagnieżdżeniu dużych zakresów czas rośnie szybko, więc zakresów nie dobieraj na zapas.

break, continue i else

Dokumentacja Pythona opisuje trzy narzędzia sterowania pętlą:

Przesuń tabelę, aby zobaczyć wszystkie kolumny →

InstrukcjaDziałanie
breakprzerywa najbliższą otaczającą pętlę for lub while
continueprzechodzi do następnego obiegu pętli
else przy pętliwykonuje się po wyczerpaniu sekwencji, ale nie po break
for i in range(10):
    if i % 2 == 0:
        continue      # pomiń liczby parzyste
    if i > 7:
        break         # zakończ pętlę
    print(i, end=" ")
  # 1 3 5 7

Klauzula else przydaje się przy wyszukiwaniu. Poniższy kod szuka dzielników i uznaje liczbę za pierwszą, gdy pętla skończyła się bez break:

for n in range(2, 10):
    for x in range(2, n):
        if n % x == 0:
            print(n, "dzielnik", x)
            break
    else:
        print(n, "pierwsza")
  # 2 pierwsza, 3 pierwsza, 4 dzielnik 2, 5 pierwsza,
  # 6 dzielnik 2, 7 pierwsza, 8 dzielnik 2, 9 dzielnik 3

Uwaga: else należy tu do pętli for, a nie do if; break w pętli wewnętrznej przerywa tylko ją, nie zewnętrzną.

Pętla for w C++ i w Pythonie: różnica

W Pythonie for przechodzi po elementach sekwencji. W C++ pętla for ma trzy części w nawiasie, rozdzielone średnikami: instrukcję początkową (zwykle deklarację licznika), warunek i wyrażenie (zwykle zwiększające licznik). Dokumentacja cppreference opisuje ją jako instrukcję wykonującą powtarzalnie podaną instrukcję, której ciało nie musi samo zarządzać warunkiem pętli. Opisuje też równoważność z pętlą while: instrukcja początkowa wykonuje się raz, potem w każdym obiegu sprawdzany jest warunek, wykonywane jest ciało i na końcu wyrażenie. Pusty warunek jest równoważny prawdzie, a continue w ciele pętli wykonuje to końcowe wyrażenie, więc licznik nadal rośnie.

Poniższy program w C++ liczy sumę liczb od 1 do 100, tak jak przykład 1 w Pythonie. Kod nie był kompilowany ani uruchomiony; wynik 5050 pochodzi z obliczenia w Pythonie.

#include <iostream>

int main() {
    int suma = 0;
    for (int i = 1; i <= 100; i++) {
        suma += i;
    }
    std::cout << suma << '\n';
}

Przesuń tabelę, aby zobaczyć wszystkie kolumny →

CzęśćC++ (for (int i = 1; i <= 100; i++))Python (for i in range(1, 101):)
Start licznikaint i = 1początek zakresu: 1
Warunek trwaniai <= 100 (sam piszesz warunek)koniec zakresu 101 jest wyłączony
Kroki++ (zwiększenie o 1)domyślny krok 1, inny podajesz w range

Zwróć uwagę na różnicę, która prowadzi do błędów o jeden: w C++ warunek i <= 100 obejmuje końcową wartość, a w Pythonie koniec zakresu jest wyłączony.

Odpowiednik w Scratchu

Pętli ze stałą liczbą powtórzeń odpowiada w Scratchu blok „powtórz 10 razy” z kategorii Kontrola: wykonuje zawarte w nim polecenia 10 razy, jak for i in range(10): w Pythonie. Blok nie udostępnia licznika, więc jeśli potrzebujesz numeru obiegu, tworzysz własną zmienną i zwiększasz ją w pętli. Szczegóły budowy skryptu opisuje osobny tekst o Scratchu 3.

Typowe błędy

Przesuń tabelę, aby zobaczyć wszystkie kolumny →

BłądPrzykładPoprawka
Błąd o jeden (zakres)range(1, 10) zamiast do 10 włącznierange(1, 11): koniec jest wyłączony
Liczenie od 0range(n) zaczyna od 0range(1, n + 1), jeśli potrzebujesz 1..n
Zmiana zmiennej pętlii = 5 w ciele pętliZostanie nadpisana w następnym obiegu
Zmiana listy w trakcie pętliusuwanie elementów z iterowanej listyIteruj po kopii: for x in lista[:]
Brak wcięciainstrukcja poza pętląWcięcie wyznacza ciało pętli

Dokumentacja podaje, że przypisanie do zmiennej pętli nie wpływa na pętlę, bo przy następnym obiegu zmienna zostanie nadpisana kolejnym elementem. Ostrzega też, że kod modyfikujący kolekcję podczas iterowania po niej bywa trudny do poprawnego napisania; zwykle prościej iterować po kopii lub utworzyć nową kolekcję.

Zmienna pętli zostaje po jej zakończeniu. Po for q in range(3): pass wartość q to 2. Gdy zakres jest pusty, zmienna nie zostaje przypisana wcale.

Zobacz też: Pierwszy program w C++, Kompilacja programów w C i C++, Sortowanie bąbelkowe.

Najczęstsze pytania (FAQ)

Jak napisać pętlę for, która wykona się 10 razy?

W Pythonie użyj for i in range(10):. Zmienna i przyjmie wartości od 0 do 9.

Czy range(1, 10) zawiera liczbę 10?

Nie. Koniec zakresu nie wchodzi do wyniku, więc dostaniesz liczby od 1 do 9. Dla 1..10 napisz range(1, 11).

Jak wygląda pętla for w C++?

Ma trzy części w nawiasie: instrukcję początkową, warunek i wyrażenie wykonywane po każdym obiegu, np. for (int i = 1; i <= 3; i++). W przeciwieństwie do range w Pythonie warunek i <= 3 obejmuje wartość końcową.

Jak przejść pętlą od końca?

Użyj ujemnego kroku: range(5, 0, -1) daje 5, 4, 3, 2, 1.

Czym różni się break od continue?

break kończy pętlę całkowicie, a continue pomija resztę bieżącego obiegu i przechodzi do następnego.

Kiedy wykonuje się else przy pętli for?

Po normalnym zakończeniu pętli, czyli gdy sekwencja się wyczerpała i nie było break.

← Więcej: Techniczne