Kursy

Pętla while i for w Pythonie i C++: przykłady i pomiar

Pętla while i for w Pythonie, C++ i JS na przykładach: range, break, else, do-while, pięć typowych błędów, zadania i nasz pomiar czasu.

Pętla while i for jak tor kolejki - zamknięty owalny tor kolejki ogrodowej na żwirze wokół rabaty z kamieniami, czarna lokomotywa z żółtym i białym wagonem jedzie po pętli, przy zwrotnicy odchodzi tor wyprowadzający z pętli
Spis treści
  1. Pętla for czy while: którą wybrać
  2. Pętla for w Pythonie: iteracja po elementach
  3. Pętla while w Pythonie: dopóki warunek jest prawdziwy
  4. Instrukcje break, continue i else w pętli
  5. Pętla do while: w C++ i JavaScripcie jest, w Pythonie nie ma
  6. Pętla for i pętla while w C++
  7. Pętla for i while w JavaScripcie
  8. Czy pętla while jest wolniejsza od for? Nasz pomiar
  9. Pięć typowych błędów w pętlach
  10. Pętla for i while: zadania z rozwiązaniami
  11. FAQ
  12. Podsumowanie

Pętla for powtarza kod dla każdego elementu listy albo zakresu liczb, a pętla while powtarza go tak długo, jak warunek jest prawdziwy. For wybierasz, gdy wiesz, po czym idziesz, a while, gdy nie wiesz, ile razy trzeba będzie powtórzyć. Wybór ma też skutek dla szybkości, ale tylko w niektórych językach. W naszym pomiarze z 2 listopada 2026 roku Python sumował milion liczb pętlą for w 21,5 ms, a pętlą while w 33,0 ms. W JavaScripcie (Node.js) różnicy nie zmierzyliśmy: obie pętle miały medianę 0,42 ms.

Pętla for czy while: którą wybrać

Pętla for służy do przejścia po znanym zbiorze: elementach listy, literach napisu, liczbach z zakresu. Pętla while służy do powtarzania, dopóki coś się nie zmieni: użytkownik nie poda poprawnej odpowiedzi, liczba nie spadnie do zera, plik się nie skończy. Każdą pętlę for da się zapisać jako while, ale przy range sam pilnujesz licznika, a przy innych zbiorach iteratora, więc łatwiej o błąd.

SytuacjaPętlaDlaczego
Wypisz wszystkie elementy listyforliczba powtórzeń wynika z listy
Powtórz coś dokładnie 10 razyfor z range(10)licznik prowadzi sam Python
Czekaj na poprawne hasłowhilenie wiadomo, ile będzie prób
Dziel liczbę przez 10, aż zostanie 0whilekoniec zależy od wartości, nie od licznika
Wykonaj kod co najmniej raz, potem sprawdź warunekdo-while (C++, JS) albo while True z break (Python)warunek jest sprawdzany na końcu

Pętla for w Pythonie: iteracja po elementach

Pętla for w Pythonie bierze kolejne elementy listy, napisu albo zakresu i dla każdego wykonuje wcięty blok kodu. Dokumentacja Pythona podkreśla, że to inne for niż w C: nie liczy się od liczby do liczby, tylko przechodzi po elementach sekwencji w ich kolejności.

owoce = ["jabłko", "gruszka", "śliwka"]
for owoc in owoce:
    print(owoc)

Program wypisze trzy linie: jabłko, gruszka i śliwka. Zmienna owoc w każdym obrocie pętli dostaje następny element, a ty nie musisz pilnować żadnego indeksu.

Funkcja range() i pętla for w Pythonie

Gdy potrzebujesz liczb, a nie elementów listy, używasz range(). Najważniejsza zasada z dokumentacji: końca zakresu nigdy nie ma w wyniku, więc range(5) daje pięć liczb, od 0 do 4.

print(list(range(5)))
print(list(range(2, 10, 3)))
print(list(range(5, 0, -1)))

Wynik to [0, 1, 2, 3, 4], [2, 5, 8] i [5, 4, 3, 2, 1]. Drugi argument to koniec (bez niego), trzeci to krok, także ujemny. Typowe użycie w pętli wygląda tak:

for i in range(1, 6):
    print(i, "do kwadratu to", i * i)

Pętla wypisze kwadraty liczb od 1 do 5, czyli 1, 4, 9, 16 i 25. Liczby 6 tu nie ma, bo range(1, 6) kończy się przed szóstką.

Pętla while w Pythonie: dopóki warunek jest prawdziwy

Pętla while sprawdza warunek przed każdym obrotem i wykonuje blok, dopóki warunek daje True. Jeśli warunek jest fałszywy od początku, blok nie wykona się ani razu. Dobry przykład to sumowanie cyfr liczby, bo nie wiadomo z góry, ile ma cyfr:

liczba = 2026
suma = 0
while liczba > 0:
    suma += liczba % 10
    liczba //= 10
print(suma)

Program wypisze 10, bo 2 + 0 + 2 + 6 = 10. W każdym obrocie % 10 odcina ostatnią cyfrę, a //= 10 usuwa ją z liczby. Gdy liczba spadnie do zera, warunek przestaje być prawdziwy i pętla się kończy. Gdyby zabrakło linijki liczba //= 10, pętla kręciłaby się bez końca.

Instrukcje break, continue i else w pętli

break natychmiast kończy najbliższą pętlę, a continue pomija resztę bieżącego obrotu i przechodzi do następnego. Obie działają w for i w while.

for n in range(1, 11):
    if n % 2 == 0:
        continue
    if n > 7:
        break
    print(n)

Wynik to 1, 3, 5 i 7. Liczby parzyste pomija continue, a na dziewiątce pętlę kończy break.

Python ma też rzadziej znaną klauzulę else przy pętli. Według dokumentacji wykonuje się ona wtedy, gdy pętla skończyła się normalnie, bez break. Najczęściej służy do wyszukiwania:

for n in (7, 9):
    for d in range(2, n):
        if n % d == 0:
            print(n, "dzieli się przez", d)
            break
    else:
        print(n, "jest liczbą pierwszą")

Program wypisze “7 jest liczbą pierwszą” i “9 dzieli się przez 3”. else stoi na tym samym poziomie wcięcia co for, nie co if, i należy do pętli. Więcej o szukaniu liczb pierwszych jest w tekście o sicie Eratostenesa.

Pętla do while: w C++ i JavaScripcie jest, w Pythonie nie ma

Pętla do while najpierw wykonuje blok, a dopiero potem sprawdza warunek, więc jej ciało wykona się co najmniej raz. Tak opisują ją cppreference dla C++ i dokumentacja MDN dla JavaScriptu. W Pythonie takiej pętli nie ma: propozycję jej dodania (PEP 315) odrzucono. Zamiast niej pisze się while True z break na końcu:

proby = ["abc", "tajne", "sezam"]
while True:
    haslo = proby.pop(0)
    print("sprawdzam", haslo)
    if haslo == "sezam":
        break

Program sprawdzi kolejno “abc”, “tajne” i “sezam”, a na trzecim haśle zakończy pętlę. Pierwsza próba odbywa się zawsze, zanim jakikolwiek warunek zostanie sprawdzony. Tak samo zachowuje się do while w JavaScripcie:

let licznik = 10;
do {
  console.log("do...while:", licznik);
  licznik++;
} while (licznik < 3);

Warunek licznik < 3 jest fałszywy od początku, a mimo to program wypisze raz “do…while: 10”. Zwykłe while z tym samym warunkiem nie wypisałoby nic.

Symbole na schemacie są takie same jak w naszym poradniku o schemacie blokowym algorytmu: romb to warunek, prostokąt to instrukcja.

Pętla for i pętla while w C++

W C++ pętla for ma trzy części w nawiasie: start, warunek i krok, oddzielone średnikami. Według cppreference zapis wygląda tak: for (start; warunek; krok) instrukcja. Średnik kończy start i warunek, a każde z trzech pól może zostać puste. Od C++11 jest też pętla zakresowa, która przechodzi po elementach kontenera tak jak for w Pythonie. Kodu C++ z tego tekstu nie uruchamialiśmy, bo na komputerze, na którym robiliśmy pomiary, nie ma kompilatora C++. Składnię sprawdziliśmy w cppreference.

#include <iostream>
#include <vector>

int main() {
    for (int i = 0; i < 5; ++i) {          // pętla for z licznikiem
        std::cout << i << ' ';
    }

    int n = 3;
    while (n > 0) {                        // pętla while
        std::cout << n << ' ';
        --n;
    }

    int x = 10;
    do {                                   // pętla do while
        std::cout << x << ' ';
        ++x;
    } while (x < 3);

    std::vector<int> v = {1, 2, 3};
    for (int e : v) {                      // pętla zakresowa (od C++11)
        std::cout << e << ' ';
    }
    return 0;
}

Najczęstsza pułapka w C++ to średnik postawiony zaraz po nawiasie, np. while (n > 0);. Wtedy ciałem pętli jest pusta instrukcja, a blok w klamrach wykona się najwyżej raz albo program zawiśnie. Pętle w C++ ćwiczysz też na naszych przykładach sortowania bąbelkowego i wieży Hanoi.

Pętla for i while w JavaScripcie

JavaScript ma tę samą trójczłonową pętlę for co C++, do tego while i do while. Ten fragment uruchomiliśmy w Node.js 22.11.0:

for (let i = 0; i < 3; i++) {
  console.log("for:", i);
}
let k = 3;
while (k > 0) {
  console.log("while:", k);
  k--;
}

Wynik to “for: 0”, “for: 1”, “for: 2”, a potem “while: 3”, “while: 2”, “while: 1”. Pętle for...of, for...in i metody tablic opisaliśmy osobno w tekście o pętlach w JavaScripcie.

Czy pętla while jest wolniejsza od for? Nasz pomiar

W Pythonie tak, w naszym pomiarze około półtora raza, a w JavaScripcie różnicy nie było. Zsumowaliśmy milion kolejnych liczb, od 0 do 999 999. Każdy wariant uruchomiliśmy w pięciu seriach, a w tabeli pokazujemy medianę najlepszych przebiegów. Wszystkie testy zrobiliśmy 2 listopada 2026 roku na jednym komputerze stacjonarnym z procesorem Intel Core i7 14. generacji i Windows 11.

WariantPython 3.14.3Node.js 22.11.0
pętla for21,5 ms0,42 ms
pętla while33,0 ms0,42 ms
do while (w Pythonie while True z break)34,1 ms0,42 ms
sum(range(n))6,2 msnie dotyczy

Różnica w Pythonie bierze się stąd, że w pętli while interpreter wykonuje w każdym obrocie więcej instrukcji: porównanie i < n i osobne i += 1. W pętli for licznik prowadzi range. Jeszcze szybsze jest wbudowane sum(range(n)), bo całe dodawanie dzieje się w funkcji napisanej w C. W Node.js nie wykryliśmy różnicy między pętlami przy dokładności 0,01 ms. Node.js kompiluje często wykonywany kod w trakcie działania, ale nasz test nie pozwala stwierdzić, że to właśnie ono wyrównało wyniki. Wyników Pythona i JavaScriptu nie da się porównywać jak rankingu języków. To jeden prosty pomiar na jednym komputerze, a w prawdziwym programie czas zjadają zwykle operacje w środku pętli, nie sama pętla.

Pięć typowych błędów w pętlach

Większość błędów w pętlach to zły warunek końca, zła granica zakresu albo zmiana danych, po których pętla właśnie chodzi. Wszystkie przykłady poniżej uruchomiliśmy w Pythonie 3.14.3.

1. Pętla nieskończona

W pętli while coś w środku musi zmieniać warunek. Jeśli zapomnisz o liczba //= 10 w przykładzie z sumą cyfr albo o i += 1 przy liczniku, pętla nigdy się nie skończy. Program wtedy zawiesza się bez komunikatu o błędzie.

2. Błąd o jeden w range()

range(1, 10) daje liczby od 1 do 9, a nie do 10:

print(list(range(1, 10)))
print(list(range(1, 11)))

Pierwsza linia wypisze [1, 2, 3, 4, 5, 6, 7, 8, 9], druga dopiero kończy się dziesiątką. Jeśli zadanie mówi “od 1 do n włącznie”, piszesz range(1, n + 1).

3. Usuwanie elementów z listy w trakcie pętli

liczby = [2, 4, 5, 6, 8]
for x in liczby:
    if x % 2 == 0:
        liczby.remove(x)
print(liczby)

Zamiast [5] program wypisze [4, 5, 8]. Po usunięciu elementu lista się przesuwa i pętla przeskakuje następny. Dokumentacja Pythona radzi przejść po kopii albo zbudować nową listę, np. liczby = [x for x in liczby if x % 2 != 0], co daje [5].

4. Porównywanie ułamków w warunku while

Dziesięć razy dodane 0,1 nie daje w Pythonie dokładnie 1,0, tylko 0.9999999999999999. Warunek while x != 1.0 nie zatrzyma więc pętli w tym miejscu, a w naszym teście zatrzymał ją dopiero bezpiecznik po 20 krokach. Jeśli liczysz kroki, użyj licznika całkowitego. Jeśli porównujesz wynik obliczeń na ułamkach, użyj math.isclose(). Sama nierówność (x < 1.0) zatrzyma pętlę dopiero po przekroczeniu progu.

5. else przy pętli pomylone z else przy if

Klauzula else w tym samym wcięciu co for wykona się po całej pętli, jeśli nie było break. Ta sama klauzula przesunięta pod if wykona się przy każdym obrocie, w którym warunek jest fałszywy. W przykładzie z liczbami pierwszymi takie przesunięcie wypisałoby jeden komunikat dla każdego sprawdzanego dzielnika, zamiast jednego wyniku na liczbę.

Pętla for i while: zadania z rozwiązaniami

Trzy zadania ćwiczą to, co trzeba umieć na sprawdzianie i w zadaniach egzaminacyjnych. Na egzaminie INF.04 zdający według informatora CKE pisze program w jednym z języków dostępnych na stanowisku: C++, C#, Java albo Python.

Zadanie 1. Policz sumę cyfr liczby 2026 pętlą while. Rozwiązanie jest w sekcji o pętli while wyżej, wynik to 10.

Zadanie 2. Wypisz tabliczkę mnożenia 3 × 3 dwiema zagnieżdżonymi pętlami for.

for i in range(1, 4):
    for j in range(1, 4):
        print(i * j, end=" ")
    print()

Program wypisze trzy wiersze: “1 2 3”, “2 4 6” i “3 6 9”. Wewnętrzna pętla przechodzi całość przy każdym obrocie zewnętrznej.

Zadanie 3. Znajdź najmniejszą potęgę dwójki większą od 1000. Liczby powtórzeń nie znasz z góry, więc to zadanie dla while:

n = 1000
potega = 1
while potega <= n:
    potega *= 2
print(potega)

Wynik to 1024. Pętla podwaja liczbę, dopóki nie przekroczy 1000.

FAQ

Czy pętla while może nie wykonać się ani razu?

Tak. Pętla while sprawdza warunek przed pierwszym obrotem, więc przy fałszywym warunku blok nie wykona się wcale. Co najmniej raz wykonuje się tylko do while w C++ i JavaScripcie albo while True z break w Pythonie.

Ile razy wykona się pętla for i in range(n)?

Dla całkowitego n większego lub równego zero dokładnie n razy, dla i od 0 do n − 1. Dla ujemnego n zakres jest pusty i pętla nie wykona się wcale. Dla range(start, stop) liczba obrotów to stop minus start, jeśli stop jest większy.

Czy każdą pętlę for da się zamienić na while?

Pętlę for z range łatwo zastąpić pętlą while z licznikiem: sam go tworzysz, sprawdzasz w warunku i zwiększasz w środku pętli. Przy pętli po pliku albo innym obiekcie iterowalnym odpowiednik wymaga ręcznej obsługi iteratora. W Pythonie taka zamiana w naszym pomiarze spowolniła sumowanie z 21,5 do 33,0 ms. Pętla for z range jest też odporniejsza na pętlę nieskończoną, bo licznikiem zarządza range.

Podsumowanie

Pętla for przechodzi po elementach albo zakresie i sama pilnuje licznika, więc jest pierwszym wyborem, gdy wiesz, po czym iterujesz. Pętla while pasuje tam, gdzie koniec zależy od wartości, która zmienia się w trakcie: od cyfr liczby, odpowiedzi użytkownika, potęgi dwójki. Do while istnieje w C++ i JavaScripcie, a w Pythonie zastępuje ją while True z break. W naszym pomiarze w Pythonie for był około półtora raza szybszy od while, a sum(range(n)) jeszcze szybszy. W Node.js różnicy między pętlami nie zmierzyliśmy. Najwięcej problemów sprawiają jednak granice range(), warunek końca pętli while i zmiana listy w trakcie przechodzenia po niej. Te trzy rzeczy sprawdź w kodzie jako pierwsze, gdy program zwraca zły wynik albo się zawiesza.

Co dalej

Więcej z działu Programowanie i web