Pętla for
Pętla jest podstawowym mechanizmem sterowania przepływem programu. Umożliwia wielokrotne wykonanie tego samego fragmentu kodu bez konieczności jego ręcznego powielania. W praktyce oznacza to oszczędność miejsca, większą czytelność oraz możliwość pracy na danych o zmiennej długości.
Istnieje kilka rodzajów pętli. Jedne wykonują się dopóki spełniony jest warunek logiczny, inne zaś bazują na liczniku i znanej z góry liczbie powtórzeń. Właśnie do tej drugiej grupy należy pętla for. Jej charakterystyczną cechą jest to, że przed rozpoczęciem wykonania programu jesteśmy w stanie określić, ile razy dany blok instrukcji zostanie wykonany.
Spis treści
W języku Python konstrukcja ta ma postać:
for zmienna in range(start, stop, krok):
Można zauważyć, że składa się z kilku elementów: słowa kluczowego for, zmiennej sterującej, słowa in, funkcji range oraz trzech parametrów określających zakres iteracji. Mechanizm ten opiera się na generowaniu kolejnych wartości z określonego zakresu liczbowego i przypisywaniu ich do zmiennej sterującej w każdej iteracji. To właśnie stanowi podstawę działania konstrukcji określanej jako Pętla for.
Pętla for – składnia, elementy konstrukcji oraz python: przedział liczbowy generowany przez funkcję range
Rozłóżmy składnię na części:
for i in range(start, stop, krok):
1. Słowo kluczowe for
Jest to instrukcja sterująca rozpoczynająca konstrukcję pętli. Informuje interpreter, że nastąpi iteracyjne wykonanie bloku kodu.
2. Zmienna sterująca
Przykładowo i. W każdej iteracji przyjmuje kolejną wartość z zakresu generowanego przez range. Jej wartość nadpisywana jest przy każdym obrocie pętli.
3. Słowo in
Oznacza, że zmienna będzie przyjmować kolejne wartości z pewnej sekwencji (obiektu iterowalnego).
4. Funkcja range
Funkcja range(start, stop, krok) generuje ciąg liczb całkowitych. Jest to python: przedział liczbowy, który:
- zaczyna się od wartości
start, - kończy się przed wartością
stop(wartość stop nie jest włączona), - zwiększa się o
krok.
Jeżeli podamy tylko jeden argument:
range(5)
to:
start = 0stop = 5krok = 1
czyli otrzymamy liczby: 0, 1, 2, 3, 4.
Przykład podstawowy
for i in range(0, 5, 1):
print(i)
Wykonanie:
- i = 0
- i = 1
- i = 2
- i = 3
- i = 4
Dla i = 5 pętla już się nie wykona, ponieważ stop nie jest włączony do zakresu.
Krok różny od 1
for i in range(0, 10, 2):
print(i)
Wynik:
0, 2, 4, 6, 8
Krok ujemny
for i in range(10, 0, -2):
print(i)
Wynik:
10, 8, 6, 4, 2
Warto zwrócić uwagę, że jeśli kierunek kroku jest sprzeczny z relacją start–stop, pętla nie wykona się ani razu.
Pętla for w ujęciu algorytmicznym – licznik, warunek stopu i zmiana stanu iteracji
W sensie teoretycznym pętla for jest specjalnym przypadkiem pętli zliczającej (counting loop). Można ją sprowadzić do trzech operacji:
- Inicjalizacja licznika.
- Sprawdzenie warunku kontynuacji.
- Zmiana licznika.
W Pythonie:
for i in range(1, 6):
print(i)
Algorytmicznie odpowiada to zapisowi:
i = 1
while i < 6:
print(i)
i = i + 1
Różnica polega na tym, że w konstrukcji for:
- inicjalizacja,
- warunek,
- inkrementacja
są zapisane w sposób zwarty i trudniej popełnić błąd logiczny.
Zastosowanie w obliczeniach numerycznych
Przykład: obliczanie sumy pierwszych n liczb naturalnych.
Python:
n = 10
suma = 0for i in range(1, n + 1):
suma = suma + iprint(suma)
C (proceduralnie):
#include <stdio.h>int main() {
int n = 10;
int suma = 0; for(int i = 1; i <= n; i++) {
suma = suma + i;
} printf("%d\n", suma);
return 0;
}C++:
#include <iostream>
using namespace std;int main() {
int n = 10;
int suma = 0; for(int i = 1; i <= n; i++) {
suma += i;
} cout << suma << endl;
return 0;
}
Struktura logiczna w każdym języku jest identyczna:
- licznik
i - warunek zakończenia
- inkrementacja
Pętla for delphi oraz różnice między implementacją w Pythonie, C i Delphi
W języku Delphi składnia wygląda inaczej:
for i := 1 to 10 do
begin
writeln(i);
end;
lub w dół:
for i := 10 downto 1 do
begin
writeln(i);
end;
Charakterystyczne cechy pętli for delphi:
- Zakres jest domknięty z obu stron (1 do 10 oznacza również 10).
- Krok zawsze wynosi 1 lub -1.
- Nie można dowolnie zmieniać kroku jak w
range.
Porównanie:
| Cecha | Python | C/C++ | Delphi |
|---|---|---|---|
| Wartość końcowa | wyłączona (stop) | zależna od warunku | włączona |
| Dowolny krok | tak | tak | nie (tylko ±1) |
| Możliwość modyfikacji licznika | teoretycznie tak, ale niewskazane | tak | niewskazane |
W Pythonie pętla for nie jest klasyczną pętlą licznikową, lecz pętlą iterującą po obiekcie. range dostarcza tylko jeden z możliwych obiektów iterowalnych.
Pętla for w kontekście iteracji po strukturach danych oraz zależność między iteracją a indeksem
W Pythonie:
lista = [10, 20, 30]for element in lista:
print(element)
Tutaj nie operujemy bezpośrednio na indeksie. Zmienna element przyjmuje kolejno wartości 10, 20, 30.
Jeżeli potrzebny jest indeks:
for i in range(len(lista)):
print(i, lista[i])
To już klasyczne podejście licznikowe.
W C:
int tab[3] = {10, 20, 30};for(int i = 0; i < 3; i++) {
printf("%d\n", tab[i]);
}Tutaj pętla for jest naturalnym mechanizmem przeglądania tablic.
Typowe błędy, pułapki i nieoczywiste zachowania konstrukcji pętla for
1. Błąd zakresu (off-by-one)
Najczęstszy błąd:
for i in range(1, 10):
Wielu początkujących zakłada, że wykona się 10 iteracji, a faktycznie wykona się 9.
2. Niezgodny znak kroku
for i in range(0, 10, -1):
print(i)
Nie wykona się ani razu, ponieważ warunek logiczny nie zostanie spełniony.
3. Modyfikacja zmiennej sterującej wewnątrz pętli
W Pythonie:
for i in range(5):
i = 100
Zmiana i nie wpływa na kolejne wartości generowane przez range. W C taka modyfikacja może wpłynąć na działanie pętli i spowodować trudne do wykrycia błędy.
4. Zagnieżdżone pętle
for i in range(3):
for j in range(2):
print(i, j)
Złożoność czasowa rośnie multiplikatywnie. Dla dwóch zakresów długości n mamy złożoność O(n²).
Zastosowania praktyczne i zależność od złożoności obliczeniowej
Pętla for jest podstawowym narzędziem w:
- przetwarzaniu tablic,
- obliczeniach numerycznych,
- implementacji algorytmów sortowania,
- generowaniu macierzy,
- przeszukiwaniu struktur danych.
Przykład: mnożenie macierzy (schemat uproszczony w Pythonie):
for i in range(n):
for j in range(m):
for k in range(p):
C[i][j] = C[i][j] + A[i][k] * B[k][j]
Złożoność: O(n · m · p). W przypadku macierzy kwadratowej O(n³).
Każda dodatkowa zagnieżdżona pętla to wzrost rzędu złożoności.
Pętla for jako fundament implementacji wielu klasycznych algorytmów numerycznych i dyskretnych
Bez tej konstrukcji trudno wyobrazić sobie implementację:
- sortowania przez wstawianie,
- algorytmu Euklidesa (w wersji iteracyjnej),
- przeszukiwania liniowego,
- generowania ciągów liczbowych,
- obliczania silni.
Przykład silni w Pythonie:
n = 5
wynik = 1for i in range(1, n + 1):
wynik = wynik * iprint(wynik)
Każda iteracja aktualizuje stan programu w sposób deterministyczny.
Krótkie uwagi praktyczne
- Zawsze analizować czy zakres jest domknięty czy otwarty.
- Sprawdzać znak kroku.
- Unikać modyfikacji kolekcji, po której aktualnie iterujemy.
- Dla dużych danych rozważyć wpływ złożoności czasowej.
- W Pythonie pamiętać, że
rangenie tworzy listy, lecz obiekt iterowalny.
Pętla for jest jedną z najbardziej podstawowych, a jednocześnie najczęściej używanych konstrukcji sterujących w programowaniu proceduralnym i skryptowym. Jej poprawne zrozumienie ma bezpośredni wpływ na jakość implementowanych algorytmów i poprawność logiki programu.