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.

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 = 0
  • stop = 5
  • krok = 1

czyli otrzymamy liczby: 0, 1, 2, 3, 4.

Przykład podstawowy

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

Wykonanie:

  1. i = 0
  2. i = 1
  3. i = 2
  4. i = 3
  5. 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:

  1. Inicjalizacja licznika.
  2. Sprawdzenie warunku kontynuacji.
  3. 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:

  1. Zakres jest domknięty z obu stron (1 do 10 oznacza również 10).
  2. Krok zawsze wynosi 1 lub -1.
  3. Nie można dowolnie zmieniać kroku jak w range.

Porównanie:

CechaPythonC/C++Delphi
Wartość końcowawyłączona (stop)zależna od warunkuwłączona
Dowolny kroktaktaknie (tylko ±1)
Możliwość modyfikacji licznikateoretycznie tak, ale niewskazanetakniewskazane

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 range nie 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.