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.
Spis treści
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:
- Implementuje metodę
__iter__() - Zwraca iterator
- Iterator implementuje metodę
__next__() __next__()zwraca kolejne elementy aż do zgłoszenia wyjątkuStopIteration
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
- 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) - Niezrozumienie zakresu w range
range(5)nie zawiera liczby 5. - Mylenie iteracji po indeksach z iteracją po wartościach W Pythonie rzadko potrzeba indeksów. Bezpośrednia iteracja jest bezpieczniejsza.
- 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.