Pętla for

Pętle są jednym z podstawowych mechanizmów sterowania przepływem programu. Umożliwiają wielokrotne wykonywanie fragmentu kodu w sposób kontrolowany. W języku Python konstrukcja for opiera się na iteracji po obiektach iterowalnych i różni się koncepcyjnie od klasycznej pętli znanej z języków takich jak C. Zrozumienie jej działania wymaga poznania iteratorów, protokołu iteracyjnego oraz funkcji range, dlatego poniższe notatki systematyzują zagadnienie.

Pętla for Python jako mechanizm iteracji po obiektach iterowalnych i jej miejsce wśród konstrukcji sterujących

W wielu językach (np. C, C++) pętla for ma postać trójczłonową:

for (inicjalizacja; warunek; modyfikacja) {
instrukcje;
}

W Pythonie składnia jest inna:

for element in obiekt_iterowalny:
instrukcje

Nie ma tu jawnego warunku zakończenia ani licznika sterującego w samej konstrukcji. Pętla działa tak długo, jak długo dostarcza kolejne elementy obiekt po prawej stronie słowa kluczowego in.

Ogólna składnia:

for zmienna in iterowalny:
blok_kodu

Blok kodu jest wykonywany dla każdego elementu uzyskanego z obiektu iterowalnego. Gdy elementy się skończą, pętla kończy działanie.

Czym jest obiekt iterowalny

Obiekt iterowalny to taki, który można przejść element po elemencie. W Pythonie należą do nich:

  • listy
  • krotki
  • napisy
  • zbiory
  • słowniki
  • obiekty zwracane przez range
  • generatory

Przykład iteracji po liście:

liczby = [10, 20, 30]for x in liczby:
print(x)

Wynik:

10
20
30

Zmiennej x przypisywana jest kolejno każda wartość z listy.

Iteracja po napisie

Napis jest sekwencją znaków:

tekst = "ABC"for znak in tekst:
print(znak)

Każdy znak jest osobnym elementem iteracji.

Pętla for Python a funkcja range i iteracja indeksowa podobna do klasycznych języków C/C++

Choć Python preferuje bezpośrednią iterację po elementach, często potrzebny jest licznik. Do tego służy funkcja range.

range(start, stop, step)

range generuje ciąg liczb całkowitych:

  • range(stop)
  • range(start, stop)
  • range(start, stop, step)

Przykład:

for i in range(5):
print(i)

Wynik:

0
1
2
3
4

Górna granica jest wyłączona.

Odpowiednik klasycznej pętli z C

C:

for (int i = 0; i < 5; i++) {
printf("%d\n", i);
}

Python:

for i in range(0, 5, 1):
print(i)

W C++ analogicznie:

#include <iostream>int main() {
for (int i = 0; i < 5; i++) {
std::cout << i << std::endl;
}
return 0;
}

Iteracja w dół

for i in range(5, 0, -1):
print(i)

Wynik:

5
4
3
2
1

Jeśli step jest ujemny, start musi być większy od stop, inaczej pętla się nie wykona.

Pętla for Python oraz mechanizm iteratorów i protokół iteracyjny w tle działania konstrukcji

Za konstrukcją for stoi tzw. protokół iteracyjny.

Obiekt iterowalny:

  1. Implementuje metodę __iter__()
  2. Zwraca iterator
  3. Iterator implementuje metodę __next__()
  4. __next__() zwraca kolejne elementy aż do zgłoszenia wyjątku StopIteration

Schematycznie pętla:

iterator = iter(obiekt)
while True:
try:
element = next(iterator)
# blok kodu
except StopIteration:
break

To wyjaśnia, dlaczego for działa dla tak wielu struktur danych.

Przykład ręcznej obsługi iteratora

lista = [1, 2, 3]
it = iter(lista)print(next(it))
print(next(it))
print(next(it))

Czwarte wywołanie next(it) spowoduje wyjątek StopIteration.

Pętle w Pythonie – instrukcje sterujące break, continue oraz konstrukcja else w pętli for

break

Natychmiast przerywa pętlę.

for i in range(10):
if i == 5:
break
print(i)

Zostaną wypisane liczby 0–4.

continue

Pomija bieżącą iterację.

for i in range(5):
if i == 2:
continue
print(i)

Nie zostanie wypisana liczba 2.

else w pętli for

W Pythonie pętla for może mieć blok else, który wykona się tylko wtedy, gdy pętla zakończy się naturalnie (bez break).

for i in range(5):
print(i)
else:
print("Koniec bez przerwania")

Jeśli wstawimy break, blok else nie zostanie wykonany.

To bywa używane przy wyszukiwaniu elementu:

szukana = 7
lista = [1, 3, 5]for x in lista:
if x == szukana:
print("Znaleziono")
break
else:
print("Nie znaleziono")

Pętle w Pythonie – zagnieżdżanie, iteracja po słownikach i rozpakowywanie krotek

Pętle zagnieżdżone

for i in range(3):
for j in range(2):
print(i, j)

Liczba iteracji to iloczyn zakresów.

Iteracja po słowniku

Domyślnie iterujemy po kluczach:

slownik = {"a": 1, "b": 2}for klucz in slownik:
print(klucz)

Iteracja po parach klucz–wartość:

for k, v in slownik.items():
print(k, v)

Tu następuje rozpakowanie krotki (klucz, wartość).

enumerate

Jeśli potrzebny jest indeks i wartość:

lista = ["a", "b", "c"]for indeks, wartosc in enumerate(lista):
print(indeks, wartosc)

enumerate zwraca pary (indeks, element).

Pętle w Pythonie – list comprehensions jako skrócona forma pętli for i ich związek z klasyczną konstrukcją

List comprehension to skrócona forma tworzenia listy:

wynik = [x * 2 for x in range(5)]

Odpowiednik klasyczny:

wynik = []
for x in range(5):
wynik.append(x * 2)

Możliwe jest dodanie warunku:

wynik = [x for x in range(10) if x % 2 == 0]

Należy uważać na czytelność. Zagnieżdżone comprehensions szybko stają się trudne do analizy.

Uwagi praktyczne – najczęstsze błędy i nieporozumienia

  1. Modyfikowanie listy w trakcie iteracji lista = [1, 2, 3]
    for x in lista:
    lista.remove(x) To prowadzi do pomijania elementów. Bezpieczniej iterować po kopii: for x in lista[:]:
    lista.remove(x)
  2. Niezrozumienie zakresu w range range(5) nie zawiera liczby 5.
  3. Mylenie iteracji po indeksach z iteracją po wartościach W Pythonie rzadko potrzeba indeksów. Bezpośrednia iteracja jest bezpieczniejsza.
  4. Zbyt głębokie zagnieżdżenie Wielopoziomowe pętle często wskazują na problem algorytmiczny (złożoność O(n²), O(n³)).

Krótkie zakończenie

Pętla for w Pythonie jest konstrukcją opartą na iteracji, a nie na warunku logicznym jak w C. Jej zrozumienie wymaga pojęcia iteratora i protokołu iteracyjnego. W praktyce pozwala pisać kod zwięzły i czytelny, pod warunkiem że używa się jej zgodnie z modelem języka, a nie przez przenoszenie bezpośrednio wzorców z innych języków.