Pętle For i While w Python - Matura z Informatyki
Pętle to fundamentalna konstrukcja programistyczna, która pozwala wielokrotnie wykonywać ten sam fragment kodu. W Pythonie mamy dwa główne typy pętli: for (do iteracji po sekwencjach) i while (do powtarzania dopóki warunek jest prawdziwy). Zrozumienie kiedy i jak ich używać to absolutna podstawa programowania.
Dlaczego to ważne? Na maturze z informatyki pętle pojawiają się w niemal każdym zadaniu programistycznym. Musisz umieć przetwarzać dane z plików (pętla po liniach), analizować liczby (pętla po cyfrach), implementować algorytmy (pętle w algorytmach). Bez opanowania pętli nie rozwiążesz nawet najprostszych zadań.
Teoria
Pętla FOR używana jest, gdy znamy liczbę iteracji lub iterujemy po kolekcji (lista, string, plik). Pętla WHILE używana jest, gdy powtarzamy coś dopóki spełniony jest warunek, ale nie znamy z góry ile razy. Ogólna zasada: jeśli możesz użyć FOR - użyj FOR. WHILE zostawiamy na sytuacje, gdzie warunek stopu jest dynamiczny.
Jak to działa?
- Pętla FOR: Python automatycznie pobiera kolejne elementy z sekwencji i przypisuje do zmiennej
- Funkcja range(n) generuje liczby od 0 do n-1
- range(a, b) generuje liczby od a do b-1
- range(a, b, krok) pozwala kontrolować krok iteracji
- Pętla WHILE: sprawdza warunek przed każdą iteracją, jeśli True - wykonuje blok kodu
- Instrukcje break (wyjście z pętli) i continue (pomiń resztę iteracji) działają w obu typach
Złożoność: Złożoność czasowa pętli zależy od liczby iteracji. Pętla wykonująca się n razy ma złożoność O(n). Zagnieżdżone pętle (pętla w pętli) to O(n²), O(n³) itd.
Implementacja
Pętla FOR z range() - podstawy
Python# Wypisz liczby od 0 do 4
for i in range(5):
print(i)
# Wynik: 0, 1, 2, 3, 4
# Wypisz liczby od 10 do 14
for i in range(10, 15):
print(i)
# Wynik: 10, 11, 12, 13, 14
# Wypisz parzyste liczby od 0 do 10
for i in range(0, 11, 2):
print(i)
# Wynik: 0, 2, 4, 6, 8, 10range(n) to najczęściej używana forma pętli FOR. Generuje liczby od 0 do n-1. range(a, b) od a do b-1. range(a, b, krok) pozwala kontrolować 'skok' między liczbami.
Pętla FOR po liście i stringu
Python# Iteracja po liście
liczby = [10, 20, 30, 40]
for liczba in liczby:
print(liczba * 2)
# Wynik: 20, 40, 60, 80
# Iteracja po stringu (ciągu znaków)
slowo = "Python"
for litera in slowo:
print(litera)
# Wynik: P, y, t, h, o, n (każda w osobnej linii)
# Iteracja z indeksem - enumerate()
for indeks, wartosc in enumerate(["a", "b", "c"]):
print(f"{indeks}: {wartosc}")
# Wynik: 0: a, 1: b, 2: cFOR świetnie nadaje się do iteracji po gotowych kolekcjach. Python automatycznie pobiera kolejne elementy. enumerate() przydaje się gdy potrzebujemy zarówno indeksu jak i wartości.
Pętla FOR - wczytywanie pliku
Python# Wczytywanie linii z pliku - BARDZO CZĘSTE NA MATURZE
with open('dane.txt', 'r') as plik:
for linia in plik:
linia = linia.strip() # usuń \n na końcu
print(linia)
# Wczytanie wszystkich liczb z pliku
with open('liczby.txt', 'r') as plik:
for linia in plik:
liczba = int(linia.strip())
# przetwarzaj liczbę...
print(liczba * 2)To najczęstszy wzorzec na maturze! Pętla FOR automatycznie iteruje po liniach pliku. strip() usuwa znaki białe (spacje, \n) z początku i końca.
Pętla WHILE - podstawy
Python# Wypisz liczby od 0 do 4 używając while
i = 0
while i < 5:
print(i)
i += 1 # WAŻNE: zwiększ licznik!
# Wynik: 0, 1, 2, 3, 4
# Sumowanie liczb dopóki suma < 100
suma = 0
liczba = 1
while suma < 100:
suma += liczba
liczba += 1
print(f"Suma: {suma}, Liczb: {liczba}")WHILE powtarza się dopóki warunek jest True. KRYTYCZNE: musisz pamiętać o zmianie zmiennej w warunku (tutaj: i += 1), inaczej pętla będzie nieskończona!
Pętla WHILE - przykład praktyczny
Python# Obliczanie cyfr liczby
liczba = 12345
ile_cyfr = 0
temp = liczba
while temp > 0:
temp = temp // 10 # dzielenie całkowite
ile_cyfr += 1
print(f"Liczba {liczba} ma {ile_cyfr} cyfr")
# Wynik: Liczba 12345 ma 5 cyfr
# Znajdowanie NWD (algorytm Euklidesa)
a, b = 48, 18
while b != 0:
a, b = b, a % b
print(f"NWD = {a}") # Wynik: 6WHILE jest idealny gdy nie wiemy z góry ile iteracji będzie potrzebnych. Tutaj: nie wiemy ile cyfr ma liczba, dopóki jej nie 'obetniemy'.
Break i Continue
Python# BREAK - wyjście z pętli
for i in range(10):
if i == 5:
break # kończy pętlę
print(i)
# Wynik: 0, 1, 2, 3, 4 (zatrzymuje się na 5)
# CONTINUE - pomiń resztę iteracji
for i in range(10):
if i % 2 == 0: # jeśli parzysta
continue # pomiń, przejdź do następnej
print(i)
# Wynik: 1, 3, 5, 7, 9 (tylko nieparzyste)
# Szukanie liczby w pliku
with open('dane.txt') as f:
for linia in f:
liczba = int(linia)
if liczba == 100:
print("Znaleziono!")
breakbreak kończy całą pętlę natychmiast. continue pomija resztę obecnej iteracji i przechodzi do następnej. Oba działają zarówno w FOR jak i WHILE.
Przykładowe Zadania Maturalne
W pliku 'liczby.txt' znajduje się 1000 liczb naturalnych (każda w osobnej linii). Napisz program, który obliczy i wypisze, ile z tych liczb jest parzystych.
Wskazówka: Użyj pętli FOR do iteracji po liniach pliku. W każdej iteracji wczytaj liczbę (pamiętaj o konwersji na 'int' i 'strip()'). Użyj operatora modulo (%) do sprawdzenia parzystości (liczba % 2 == 0).
Pokaż szkic rozwiązania
1. Otwórz plik 'liczby.txt' do odczytu. 2. Zainicjuj zmienną 'licznik_parzystych = 0'. 3. Rozpocznij pętlę FOR 'for linia in plik:'. 4. W pętli: a. Wczytaj liczbę: 'liczba = int(linia.strip())'. b. Sprawdź warunek: 'if liczba % 2 == 0:'. c. Jeśli warunek jest prawdziwy, zwiększ licznik: 'licznik_parzystych += 1'. 5. Po zakończeniu pętli, wypisz 'licznik_parzystych'.
W pliku prostokaty.txt opisano 5000 prostokątów, po jednym w każdym wierszu. Opis każdego prostokąta składa się z dwóch dodatnich liczb całkowitych (wysokość h, szerokość s) oddzielonych spacją. Podaj najmniejsze i największe pole powierzchni dla prostokątów z pliku prostokaty.txt.
Wskazówka: Będziesz potrzebować pętli FOR do wczytania każdej linii z pliku. Zainicjuj zmienne 'min_pole' i 'max_pole' przed pętlą. Dla 'min_pole' użyj bardzo dużej wartości początkowej, a dla 'max_pole' bardzo małej (np. 0). W każdej iteracji oblicz pole = h * s i zaktualizuj min/max.
Pokaż szkic rozwiązania
1. Otwórz plik 'prostokaty.txt'. 2. Zainicjuj 'min_pole = 999999999' (lub pierwsza wartość z pliku). 3. Zainicjuj 'max_pole = 0'. 4. Dla każdej linii w pliku: a. Podziel linię na dwie liczby: 'h, s = map(int, linia.split())'. b. Oblicz 'pole = h * s'. c. Sprawdź: 'if pole < min_pole: min_pole = pole'. d. Sprawdź: 'if pole > max_pole: max_pole = pole'. 5. Po pętli wypisz 'min_pole' i 'max_pole'.
Częste Błędy
❌ Nieskończona pętla WHILE
Najczęstszy błąd: zapomnienie o zmianie zmiennej w warunku. Np. while i < 10: print(i) (brak i += 1) spowoduje nieskończoną pętlę.
Poprawka: ZAWSZE sprawdzaj czy wewnątrz pętli WHILE coś zmienia wartość zmiennej w warunku. Jeśli nie - pętla nigdy się nie skończy.
❌ Błąd off-by-one w range()
range(10) generuje 0-9, a nie 0-10! range(a, b) to ZAWSZE od a do b-1. Częsty błąd: chcę 100 liczb, piszę range(100), ale zaczynam od 0.
Poprawka: Pamiętaj: range(n) to n liczb od 0 do n-1. Jeśli chcesz od 1 do n, użyj range(1, n+1).
❌ Modyfikowanie listy podczas iteracji
Nie możesz dodawać/usuwać elementów z listy podczas iteracji po niej: for x in lista: lista.remove(x) - to spowoduje błędy.
Poprawka: Iteruj po kopii listy: for x in lista[:] albo utwórz nową listę z elementami do zachowania.
❌ Zapomnienie o strip() przy wczytywaniu pliku
Każda linia z pliku ma na końcu \n (znak nowej linii). int('123\n') wywoła błąd! Musisz użyć strip().
Poprawka: ZAWSZE używaj linia.strip() przed konwersją na int/float: liczba = int(linia.strip())
❌ Używanie WHILE zamiast FOR
Wielu uczniów nadużywa WHILE, pisząc np. i=0; while i<10: ... zamiast po prostu for i in range(10).
Poprawka: Jeśli znasz liczbę iteracji lub iterujesz po kolekcji - użyj FOR. Jest prostszy i mniej podatny na błędy.
Kluczowe Wnioski
- FOR używamy gdy znamy liczbę iteracji lub iterujemy po kolekcji (lista, string, plik)
- WHILE używamy gdy powtarzamy dopóki warunek jest spełniony, ale nie znamy z góry ile razy
- range(n) generuje liczby 0, 1, 2, ..., n-1 (n liczb, ale od 0!)
- Przy wczytywaniu pliku: ZAWSZE używaj strip() przed konwersją na int
- W pętli WHILE: pamiętaj o zmianie zmiennej w warunku, inaczej nieskończona pętla
- break kończy pętlę natychmiast, continue pomija resztę iteracji
- Pętla FOR po pliku: for linia in plik: - najczęstszy wzorzec na maturze
Najczęściej Zadawane Pytania
❓ Kiedy używać FOR a kiedy WHILE?
Prosta zasada: jeśli możesz użyć FOR - użyj FOR. FOR jest prostszy i bezpieczniejszy. WHILE zostawiamy na sytuacje gdzie warunek stopu jest dynamiczny, np. 'dopóki liczba > 0', 'dopóki użytkownik nie wpisze quit', 'dopóki b != 0' (algorytm Euklidesa).
❓ Dlaczego range(10) daje 0-9 a nie 1-10?
To konwencja Pythona (i większości języków programowania). range(n) zawsze generuje n liczb zaczynając od 0. Jeśli chcesz od 1 do 10, użyj range(1, 11). Wygląda dziwnie, ale szybko się przyzwyczaisz.
❓ Co to znaczy 'nieskończona pętla' i jak jej uniknąć?
Nieskończona pętla to pętla, która nigdy się nie kończy, bo jej warunek zawsze jest True. Przykład: i=0; while i<10: print(i) - brak i+=1 oznacza, że i zawsze będzie 0, więc warunek zawsze True. Unikaj tego sprawdzając czy wewnątrz WHILE coś zmienia wartość zmiennej w warunku.
❓ Czy mogę użyć break w pętli FOR?
Tak! break działa zarówno w FOR jak i WHILE. Kończy najbliższą pętlę natychmiast. Często używane gdy szukamy czegoś i chcemy przestać jak znajdziemy.
❓ Co się stanie jeśli zapomnę o strip() wczytując plik?
Każda linia ma na końcu \n (znak nowej linii). Bez strip() int('123\n') wywoła błąd ValueError. ZAWSZE używaj linia.strip() przed konwersją na liczbę.
Chcesz opanować wszystkie tematy maturalne?
Dołącz do kursu i zyskaj dostęp do interaktywnych lekcji, edytora kodu i setek zadań.