{"id":1009,"date":"2021-06-06T19:07:00","date_gmt":"2021-06-06T17:07:00","guid":{"rendered":"https:\/\/trzykody.pl\/?page_id=1009"},"modified":"2026-02-19T22:19:19","modified_gmt":"2026-02-19T21:19:19","slug":"petla-for","status":"publish","type":"page","link":"https:\/\/trzykody.pl\/index.php\/c\/petle\/petla-for\/","title":{"rendered":"P\u0119tla for"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">P\u0119tla jest podstawowym mechanizmem sterowania przep\u0142ywem programu. Umo\u017cliwia wielokrotne wykonanie tego samego fragmentu kodu bez konieczno\u015bci jego r\u0119cznego powielania. W praktyce oznacza to oszcz\u0119dno\u015b\u0107 miejsca, wi\u0119ksz\u0105 czytelno\u015b\u0107 oraz mo\u017cliwo\u015b\u0107 pracy na danych o zmiennej d\u0142ugo\u015bci.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Istnieje kilka rodzaj\u00f3w p\u0119tli. Jedne wykonuj\u0105 si\u0119 dop\u00f3ki spe\u0142niony jest warunek logiczny, inne za\u015b bazuj\u0105 na liczniku i znanej z g\u00f3ry liczbie powt\u00f3rze\u0144. W\u0142a\u015bnie do tej drugiej grupy nale\u017cy p\u0119tla for. Jej charakterystyczn\u0105 cech\u0105 jest to, \u017ce przed rozpocz\u0119ciem wykonania programu jeste\u015bmy w stanie okre\u015bli\u0107, ile razy dany blok instrukcji zostanie wykonany.<\/p>\n\n\n\n<div class=\"wp-block-rank-math-toc-block\" id=\"rank-math-toc\"><h2>Spis tre\u015bci<\/h2><nav><ol><li class=\"\"><a href=\"#petla-for-skladnia-elementy-konstrukcji-oraz-python-przedzial-liczbowy-generowany-przez-funkcje-range\">P\u0119tla for \u2013 sk\u0142adnia, elementy konstrukcji oraz python: przedzia\u0142 liczbowy generowany przez funkcj\u0119 range<\/a><ol><li class=\"\"><a href=\"#1-slowo-kluczowe-for\">1. S\u0142owo kluczowe for<\/a><\/li><li class=\"\"><a href=\"#2-zmienna-sterujaca\">2. Zmienna steruj\u0105ca<\/a><\/li><li class=\"\"><a href=\"#3-slowo-in\">3. S\u0142owo in<\/a><\/li><li class=\"\"><a href=\"#4-funkcja-range\">4. Funkcja range<\/a><\/li><li class=\"\"><a href=\"#przyklad-podstawowy\">Przyk\u0142ad podstawowy<\/a><\/li><li class=\"\"><a href=\"#krok-rozny-od-1\">Krok r\u00f3\u017cny od 1<\/a><\/li><li class=\"\"><a href=\"#krok-ujemny\">Krok ujemny<\/a><\/li><\/ol><\/li><li class=\"\"><a href=\"#petla-for-w-ujeciu-algorytmicznym-licznik-warunek-stopu-i-zmiana-stanu-iteracji\">P\u0119tla for w uj\u0119ciu algorytmicznym \u2013 licznik, warunek stopu i zmiana stanu iteracji<\/a><ol><li class=\"\"><a href=\"#zastosowanie-w-obliczeniach-numerycznych\">Zastosowanie w obliczeniach numerycznych<\/a><\/li><\/ol><\/li><li class=\"\"><a href=\"#petla-for-delphi-oraz-roznice-miedzy-implementacja-w-pythonie-c-i-delphi\">P\u0119tla for delphi oraz r\u00f3\u017cnice mi\u0119dzy implementacj\u0105 w Pythonie, C i Delphi<\/a><\/li><li class=\"\"><a href=\"#petla-for-w-kontekscie-iteracji-po-strukturach-danych-oraz-zaleznosc-miedzy-iteracja-a-indeksem\">P\u0119tla for w kontek\u015bcie iteracji po strukturach danych oraz zale\u017cno\u015b\u0107 mi\u0119dzy iteracj\u0105 a indeksem<\/a><\/li><li class=\"\"><a href=\"#typowe-bledy-pulapki-i-nieoczywiste-zachowania-konstrukcji-petla-for\">Typowe b\u0142\u0119dy, pu\u0142apki i nieoczywiste zachowania konstrukcji p\u0119tla for<\/a><ol><li class=\"\"><a href=\"#1-blad-zakresu-off-by-one\">1. B\u0142\u0105d zakresu (off-by-one)<\/a><\/li><li class=\"\"><a href=\"#2-niezgodny-znak-kroku\">2. Niezgodny znak kroku<\/a><\/li><li class=\"\"><a href=\"#3-modyfikacja-zmiennej-sterujacej-wewnatrz-petli\">3. Modyfikacja zmiennej steruj\u0105cej wewn\u0105trz p\u0119tli<\/a><\/li><li class=\"\"><a href=\"#4-zagniezdzone-petle\">4. Zagnie\u017cd\u017cone p\u0119tle<\/a><\/li><\/ol><\/li><li class=\"\"><a href=\"#zastosowania-praktyczne-i-zaleznosc-od-zlozonosci-obliczeniowej\">Zastosowania praktyczne i zale\u017cno\u015b\u0107 od z\u0142o\u017cono\u015bci obliczeniowej<\/a><\/li><li class=\"\"><a href=\"#petla-for-jako-fundament-implementacji-wielu-klasycznych-algorytmow-numerycznych-i-dyskretnych\">P\u0119tla for jako fundament implementacji wielu klasycznych algorytm\u00f3w numerycznych i dyskretnych<\/a><\/li><li class=\"\"><a href=\"#krotkie-uwagi-praktyczne\">Kr\u00f3tkie uwagi praktyczne<\/a><\/li><\/ol><\/nav><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">W j\u0119zyku Python konstrukcja ta ma posta\u0107:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">for zmienna in range(start, stop, krok):<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Mo\u017cna zauwa\u017cy\u0107, \u017ce sk\u0142ada si\u0119 z kilku element\u00f3w: s\u0142owa kluczowego <code>for<\/code>, zmiennej steruj\u0105cej, s\u0142owa <code>in<\/code>, funkcji <code>range<\/code> oraz trzech parametr\u00f3w okre\u015blaj\u0105cych zakres iteracji. Mechanizm ten opiera si\u0119 na generowaniu kolejnych warto\u015bci z okre\u015blonego zakresu liczbowego i przypisywaniu ich do zmiennej steruj\u0105cej w ka\u017cdej iteracji. To w\u0142a\u015bnie stanowi podstaw\u0119 dzia\u0142ania konstrukcji okre\u015blanej jako P\u0119tla for.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"petla-for-skladnia-elementy-konstrukcji-oraz-python-przedzial-liczbowy-generowany-przez-funkcje-range\">P\u0119tla for \u2013 sk\u0142adnia, elementy konstrukcji oraz python: przedzia\u0142 liczbowy generowany przez funkcj\u0119 range<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Roz\u0142\u00f3\u017cmy sk\u0142adni\u0119 na cz\u0119\u015bci:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">for i in range(start, stop, krok):<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"1-slowo-kluczowe-for\">1. S\u0142owo kluczowe <code>for<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Jest to instrukcja steruj\u0105ca rozpoczynaj\u0105ca konstrukcj\u0119 p\u0119tli. Informuje interpreter, \u017ce nast\u0105pi iteracyjne wykonanie bloku kodu.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"2-zmienna-sterujaca\">2. Zmienna steruj\u0105ca<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142adowo <code>i<\/code>. W ka\u017cdej iteracji przyjmuje kolejn\u0105 warto\u015b\u0107 z zakresu generowanego przez <code>range<\/code>. Jej warto\u015b\u0107 nadpisywana jest przy ka\u017cdym obrocie p\u0119tli.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"3-slowo-in\">3. S\u0142owo <code>in<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Oznacza, \u017ce zmienna b\u0119dzie przyjmowa\u0107 kolejne warto\u015bci z pewnej sekwencji (obiektu iterowalnego).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"4-funkcja-range\">4. Funkcja <code>range<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Funkcja <code>range(start, stop, krok)<\/code> generuje ci\u0105g liczb ca\u0142kowitych. Jest to python: przedzia\u0142 liczbowy, kt\u00f3ry:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>zaczyna si\u0119 od warto\u015bci <code>start<\/code>,<\/li>\n\n\n\n<li>ko\u0144czy si\u0119 przed warto\u015bci\u0105 <code>stop<\/code> (warto\u015b\u0107 stop nie jest w\u0142\u0105czona),<\/li>\n\n\n\n<li>zwi\u0119ksza si\u0119 o <code>krok<\/code>.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Je\u017celi podamy tylko jeden argument:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">range(5)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>start = 0<\/code><\/li>\n\n\n\n<li><code>stop = 5<\/code><\/li>\n\n\n\n<li><code>krok = 1<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">czyli otrzymamy liczby: 0, 1, 2, 3, 4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"przyklad-podstawowy\">Przyk\u0142ad podstawowy<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">for i in range(0, 5, 1):<br>    print(i)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Wykonanie:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>i = 0<\/li>\n\n\n\n<li>i = 1<\/li>\n\n\n\n<li>i = 2<\/li>\n\n\n\n<li>i = 3<\/li>\n\n\n\n<li>i = 4<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Dla i = 5 p\u0119tla ju\u017c si\u0119 nie wykona, poniewa\u017c <code>stop<\/code> nie jest w\u0142\u0105czony do zakresu.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"krok-rozny-od-1\">Krok r\u00f3\u017cny od 1<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">for i in range(0, 10, 2):<br>    print(i)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Wynik:<br>0, 2, 4, 6, 8<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"krok-ujemny\">Krok ujemny<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">for i in range(10, 0, -2):<br>    print(i)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Wynik:<br>10, 8, 6, 4, 2<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Warto zwr\u00f3ci\u0107 uwag\u0119, \u017ce je\u015bli kierunek kroku jest sprzeczny z relacj\u0105 start\u2013stop, p\u0119tla nie wykona si\u0119 ani razu.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"petla-for-w-ujeciu-algorytmicznym-licznik-warunek-stopu-i-zmiana-stanu-iteracji\">P\u0119tla for w uj\u0119ciu algorytmicznym \u2013 licznik, warunek stopu i zmiana stanu iteracji<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">W sensie teoretycznym p\u0119tla for jest specjalnym przypadkiem p\u0119tli zliczaj\u0105cej (counting loop). Mo\u017cna j\u0105 sprowadzi\u0107 do trzech operacji:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Inicjalizacja licznika.<\/li>\n\n\n\n<li>Sprawdzenie warunku kontynuacji.<\/li>\n\n\n\n<li>Zmiana licznika.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">W Pythonie:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">for i in range(1, 6):<br>    print(i)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Algorytmicznie odpowiada to zapisowi:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">i = 1<br>while i &lt; 6:<br>    print(i)<br>    i = i + 1<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">R\u00f3\u017cnica polega na tym, \u017ce w konstrukcji <code>for<\/code>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>inicjalizacja,<\/li>\n\n\n\n<li>warunek,<\/li>\n\n\n\n<li>inkrementacja<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">s\u0105 zapisane w spos\u00f3b zwarty i trudniej pope\u0142ni\u0107 b\u0142\u0105d logiczny.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"zastosowanie-w-obliczeniach-numerycznych\">Zastosowanie w obliczeniach numerycznych<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ad: obliczanie sumy pierwszych n liczb naturalnych.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Python:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">n = 10<br>suma = 0for i in range(1, n + 1):<br>    suma = suma + iprint(suma)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">C (proceduralnie):<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">#include &lt;stdio.h&gt;int main() {<br>    int n = 10;<br>    int suma = 0;    for(int i = 1; i &lt;= n; i++) {<br>        suma = suma + i;<br>    }    printf(\"%d\\n\", suma);<br>    return 0;<br>}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">C++:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">#include &lt;iostream&gt;<br>using namespace std;int main() {<br>    int n = 10;<br>    int suma = 0;    for(int i = 1; i &lt;= n; i++) {<br>        suma += i;<br>    }    cout &lt;&lt; suma &lt;&lt; endl;<br>    return 0;<br>}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Struktura logiczna w ka\u017cdym j\u0119zyku jest identyczna:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>licznik <code>i<\/code><\/li>\n\n\n\n<li>warunek zako\u0144czenia<\/li>\n\n\n\n<li>inkrementacja<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"petla-for-delphi-oraz-roznice-miedzy-implementacja-w-pythonie-c-i-delphi\">P\u0119tla for delphi oraz r\u00f3\u017cnice mi\u0119dzy implementacj\u0105 w Pythonie, C i Delphi<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">W j\u0119zyku Delphi sk\u0142adnia wygl\u0105da inaczej:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">for i := 1 to 10 do<br>begin<br>  writeln(i);<br>end;<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">lub w d\u00f3\u0142:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">for i := 10 downto 1 do<br>begin<br>  writeln(i);<br>end;<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Charakterystyczne cechy p\u0119tli for delphi:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Zakres jest domkni\u0119ty z obu stron (1 do 10 oznacza r\u00f3wnie\u017c 10).<\/li>\n\n\n\n<li>Krok zawsze wynosi 1 lub -1.<\/li>\n\n\n\n<li>Nie mo\u017cna dowolnie zmienia\u0107 kroku jak w <code>range<\/code>.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Por\u00f3wnanie:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Cecha<\/th><th>Python<\/th><th>C\/C++<\/th><th>Delphi<\/th><\/tr><\/thead><tbody><tr><td>Warto\u015b\u0107 ko\u0144cowa<\/td><td>wy\u0142\u0105czona (<code>stop<\/code>)<\/td><td>zale\u017cna od warunku<\/td><td>w\u0142\u0105czona<\/td><\/tr><tr><td>Dowolny krok<\/td><td>tak<\/td><td>tak<\/td><td>nie (tylko \u00b11)<\/td><\/tr><tr><td>Mo\u017cliwo\u015b\u0107 modyfikacji licznika<\/td><td>teoretycznie tak, ale niewskazane<\/td><td>tak<\/td><td>niewskazane<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">W Pythonie p\u0119tla for nie jest klasyczn\u0105 p\u0119tl\u0105 licznikow\u0105, lecz p\u0119tl\u0105 iteruj\u0105c\u0105 po obiekcie. <code>range<\/code> dostarcza tylko jeden z mo\u017cliwych obiekt\u00f3w iterowalnych.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"petla-for-w-kontekscie-iteracji-po-strukturach-danych-oraz-zaleznosc-miedzy-iteracja-a-indeksem\">P\u0119tla for w kontek\u015bcie iteracji po strukturach danych oraz zale\u017cno\u015b\u0107 mi\u0119dzy iteracj\u0105 a indeksem<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">W Pythonie:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">lista = [10, 20, 30]for element in lista:<br>    print(element)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Tutaj nie operujemy bezpo\u015brednio na indeksie. Zmienna <code>element<\/code> przyjmuje kolejno warto\u015bci 10, 20, 30.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Je\u017celi potrzebny jest indeks:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">for i in range(len(lista)):<br>    print(i, lista[i])<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">To ju\u017c klasyczne podej\u015bcie licznikowe.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">W C:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">int tab[3] = {10, 20, 30};for(int i = 0; i &lt; 3; i++) {<br>    printf(\"%d\\n\", tab[i]);<br>}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Tutaj p\u0119tla for jest naturalnym mechanizmem przegl\u0105dania tablic.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"typowe-bledy-pulapki-i-nieoczywiste-zachowania-konstrukcji-petla-for\">Typowe b\u0142\u0119dy, pu\u0142apki i nieoczywiste zachowania konstrukcji p\u0119tla for<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"1-blad-zakresu-off-by-one\">1. B\u0142\u0105d zakresu (off-by-one)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Najcz\u0119stszy b\u0142\u0105d:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">for i in range(1, 10):<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Wielu pocz\u0105tkuj\u0105cych zak\u0142ada, \u017ce wykona si\u0119 10 iteracji, a faktycznie wykona si\u0119 9.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"2-niezgodny-znak-kroku\">2. Niezgodny znak kroku<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">for i in range(0, 10, -1):<br>    print(i)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Nie wykona si\u0119 ani razu, poniewa\u017c warunek logiczny nie zostanie spe\u0142niony.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"3-modyfikacja-zmiennej-sterujacej-wewnatrz-petli\">3. Modyfikacja zmiennej steruj\u0105cej wewn\u0105trz p\u0119tli<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">W Pythonie:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">for i in range(5):<br>    i = 100<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Zmiana <code>i<\/code> nie wp\u0142ywa na kolejne warto\u015bci generowane przez <code>range<\/code>. W C taka modyfikacja mo\u017ce wp\u0142yn\u0105\u0107 na dzia\u0142anie p\u0119tli i spowodowa\u0107 trudne do wykrycia b\u0142\u0119dy.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"4-zagniezdzone-petle\">4. Zagnie\u017cd\u017cone p\u0119tle<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">for i in range(3):<br>    for j in range(2):<br>        print(i, j)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Z\u0142o\u017cono\u015b\u0107 czasowa ro\u015bnie multiplikatywnie. Dla dw\u00f3ch zakres\u00f3w d\u0142ugo\u015bci n mamy z\u0142o\u017cono\u015b\u0107 O(n\u00b2).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"zastosowania-praktyczne-i-zaleznosc-od-zlozonosci-obliczeniowej\">Zastosowania praktyczne i zale\u017cno\u015b\u0107 od z\u0142o\u017cono\u015bci obliczeniowej<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">P\u0119tla for jest podstawowym narz\u0119dziem w:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>przetwarzaniu tablic,<\/li>\n\n\n\n<li>obliczeniach numerycznych,<\/li>\n\n\n\n<li>implementacji algorytm\u00f3w sortowania,<\/li>\n\n\n\n<li>generowaniu macierzy,<\/li>\n\n\n\n<li>przeszukiwaniu struktur danych.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ad: mno\u017cenie macierzy (schemat uproszczony w Pythonie):<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">for i in range(n):<br>    for j in range(m):<br>        for k in range(p):<br>            C[i][j] = C[i][j] + A[i][k] * B[k][j]<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Z\u0142o\u017cono\u015b\u0107: O(n \u00b7 m \u00b7 p). W przypadku macierzy kwadratowej O(n\u00b3).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ka\u017cda dodatkowa zagnie\u017cd\u017cona p\u0119tla to wzrost rz\u0119du z\u0142o\u017cono\u015bci.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"petla-for-jako-fundament-implementacji-wielu-klasycznych-algorytmow-numerycznych-i-dyskretnych\">P\u0119tla for jako fundament implementacji wielu klasycznych algorytm\u00f3w numerycznych i dyskretnych<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Bez tej konstrukcji trudno wyobrazi\u0107 sobie implementacj\u0119:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>sortowania przez wstawianie,<\/li>\n\n\n\n<li>algorytmu Euklidesa (w wersji iteracyjnej),<\/li>\n\n\n\n<li>przeszukiwania liniowego,<\/li>\n\n\n\n<li>generowania ci\u0105g\u00f3w liczbowych,<\/li>\n\n\n\n<li>obliczania silni.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ad silni w Pythonie:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">n = 5<br>wynik = 1for i in range(1, n + 1):<br>    wynik = wynik * iprint(wynik)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ka\u017cda iteracja aktualizuje stan programu w spos\u00f3b deterministyczny.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"krotkie-uwagi-praktyczne\">Kr\u00f3tkie uwagi praktyczne<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Zawsze analizowa\u0107 czy zakres jest domkni\u0119ty czy otwarty.<\/li>\n\n\n\n<li>Sprawdza\u0107 znak kroku.<\/li>\n\n\n\n<li>Unika\u0107 modyfikacji kolekcji, po kt\u00f3rej aktualnie iterujemy.<\/li>\n\n\n\n<li>Dla du\u017cych danych rozwa\u017cy\u0107 wp\u0142yw z\u0142o\u017cono\u015bci czasowej.<\/li>\n\n\n\n<li>W Pythonie pami\u0119ta\u0107, \u017ce <code>range<\/code> nie tworzy listy, lecz obiekt iterowalny.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">P\u0119tla for jest jedn\u0105 z najbardziej podstawowych, a jednocze\u015bnie najcz\u0119\u015bciej u\u017cywanych konstrukcji steruj\u0105cych w programowaniu proceduralnym i skryptowym. Jej poprawne zrozumienie ma bezpo\u015bredni wp\u0142yw na jako\u015b\u0107 implementowanych algorytm\u00f3w i poprawno\u015b\u0107 logiki programu.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>P\u0119tla jest podstawowym mechanizmem sterowania przep\u0142ywem programu. Umo\u017cliwia wielokrotne wykonanie tego samego fragmentu kodu bez konieczno\u015bci jego r\u0119cznego powielania. W praktyce oznacza to oszcz\u0119dno\u015b\u0107 miejsca, wi\u0119ksz\u0105 czytelno\u015b\u0107 oraz mo\u017cliwo\u015b\u0107 pracy na danych o zmiennej d\u0142ugo\u015bci. Istnieje kilka rodzaj\u00f3w p\u0119tli. Jedne wykonuj\u0105 si\u0119 dop\u00f3ki spe\u0142niony jest warunek logiczny, inne za\u015b bazuj\u0105 na liczniku i znanej z g\u00f3ry liczbie powt\u00f3rze\u0144. W\u0142a\u015bnie do tej drugiej grupy nale\u017cy p\u0119tla for. Jej charakterystyczn\u0105 cech\u0105 jest to, \u017ce przed rozpocz\u0119ciem wykonania programu jeste\u015bmy w stanie okre\u015bli\u0107, ile razy dany blok instrukcji zostanie wykonany. W j\u0119zyku Python konstrukcja ta ma posta\u0107: for zmienna in range(start, stop, krok): Mo\u017cna zauwa\u017cy\u0107, \u017ce sk\u0142ada si\u0119 z kilku element\u00f3w: s\u0142owa kluczowego for, zmiennej steruj\u0105cej, s\u0142owa in, funkcji range oraz trzech parametr\u00f3w okre\u015blaj\u0105cych zakres iteracji. Mechanizm ten opiera si\u0119 na generowaniu kolejnych warto\u015bci z okre\u015blonego zakresu liczbowego i przypisywaniu ich do zmiennej steruj\u0105cej w ka\u017cdej iteracji. To w\u0142a\u015bnie stanowi podstaw\u0119 dzia\u0142ania konstrukcji okre\u015blanej jako P\u0119tla for. P\u0119tla for \u2013 sk\u0142adnia, elementy konstrukcji oraz python: przedzia\u0142 liczbowy generowany przez funkcj\u0119 range Roz\u0142\u00f3\u017cmy sk\u0142adni\u0119 na cz\u0119\u015bci: for i in range(start, stop, krok): 1. S\u0142owo kluczowe for Jest to instrukcja steruj\u0105ca rozpoczynaj\u0105ca konstrukcj\u0119 p\u0119tli. Informuje interpreter, \u017ce nast\u0105pi iteracyjne wykonanie bloku kodu. 2. Zmienna steruj\u0105ca Przyk\u0142adowo i. W ka\u017cdej iteracji przyjmuje kolejn\u0105 warto\u015b\u0107 z zakresu generowanego przez range. Jej warto\u015b\u0107 nadpisywana jest przy ka\u017cdym obrocie p\u0119tli. 3. S\u0142owo in Oznacza, \u017ce zmienna b\u0119dzie przyjmowa\u0107 kolejne warto\u015bci z pewnej sekwencji (obiektu iterowalnego). 4. Funkcja range Funkcja range(start, stop, krok) generuje ci\u0105g liczb ca\u0142kowitych. Jest to python: przedzia\u0142 liczbowy, kt\u00f3ry: Je\u017celi podamy tylko jeden argument: range(5) to: czyli otrzymamy liczby: 0, 1, 2, 3, 4. Przyk\u0142ad podstawowy for i in range(0, 5, 1): print(i) Wykonanie: Dla i = 5 p\u0119tla ju\u017c si\u0119 nie wykona, poniewa\u017c stop nie jest w\u0142\u0105czony do zakresu. Krok r\u00f3\u017cny 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\u00f3ci\u0107 uwag\u0119, \u017ce je\u015bli kierunek kroku jest sprzeczny z relacj\u0105 start\u2013stop, p\u0119tla nie wykona si\u0119 ani razu. P\u0119tla for w uj\u0119ciu algorytmicznym \u2013 licznik, warunek stopu i zmiana stanu iteracji W sensie teoretycznym p\u0119tla for jest specjalnym przypadkiem p\u0119tli zliczaj\u0105cej (counting loop). Mo\u017cna j\u0105 sprowadzi\u0107 do trzech operacji: W Pythonie: for i in range(1, 6): print(i) Algorytmicznie odpowiada to zapisowi: i = 1while i &lt; 6: print(i) i = i + 1 R\u00f3\u017cnica polega na tym, \u017ce w konstrukcji for: s\u0105 zapisane w spos\u00f3b zwarty i trudniej pope\u0142ni\u0107 b\u0142\u0105d logiczny. Zastosowanie w obliczeniach numerycznych Przyk\u0142ad: obliczanie sumy pierwszych n liczb naturalnych. Python: n = 10suma = 0for i in range(1, n + 1): suma = suma + iprint(suma) C (proceduralnie): #include &lt;stdio.h&gt;int main() { int n = 10; int suma = 0; for(int i = 1; i &lt;= n; i++) { suma = suma + i; } printf(&#8222;%d\\n&#8221;, suma); return 0;} C++: #include &lt;iostream&gt;using namespace std;int main() { int n = 10; int suma = 0; for(int i = 1; i &lt;= n; i++) { suma += i; } cout &lt;&lt; suma &lt;&lt; endl; return 0;} Struktura logiczna w ka\u017cdym j\u0119zyku jest identyczna: P\u0119tla for delphi oraz r\u00f3\u017cnice mi\u0119dzy implementacj\u0105 w Pythonie, C i Delphi W j\u0119zyku Delphi sk\u0142adnia wygl\u0105da inaczej: for i := 1 to 10 dobegin writeln(i);end; lub w d\u00f3\u0142: for i := 10 downto 1 dobegin writeln(i);end; Charakterystyczne cechy p\u0119tli for delphi: Por\u00f3wnanie: Cecha Python C\/C++ Delphi Warto\u015b\u0107 ko\u0144cowa wy\u0142\u0105czona (stop) zale\u017cna od warunku w\u0142\u0105czona Dowolny krok tak tak nie (tylko \u00b11) Mo\u017cliwo\u015b\u0107 modyfikacji licznika teoretycznie tak, ale niewskazane tak niewskazane W Pythonie p\u0119tla for nie jest klasyczn\u0105 p\u0119tl\u0105 licznikow\u0105, lecz p\u0119tl\u0105 iteruj\u0105c\u0105 po obiekcie. range dostarcza tylko jeden z mo\u017cliwych obiekt\u00f3w iterowalnych. P\u0119tla for w kontek\u015bcie iteracji po strukturach danych oraz zale\u017cno\u015b\u0107 mi\u0119dzy iteracj\u0105 a indeksem W Pythonie: lista = [10, 20, 30]for element in lista: print(element) Tutaj nie operujemy bezpo\u015brednio na indeksie. Zmienna element przyjmuje kolejno warto\u015bci 10, 20, 30. Je\u017celi potrzebny jest indeks: for i in range(len(lista)): print(i, lista[i]) To ju\u017c klasyczne podej\u015bcie licznikowe. W C: int tab[3] = {10, 20, 30};for(int i = 0; i &lt; 3; i++) { printf(&#8222;%d\\n&#8221;, tab[i]);} Tutaj p\u0119tla for jest naturalnym mechanizmem przegl\u0105dania tablic. Typowe b\u0142\u0119dy, pu\u0142apki i nieoczywiste zachowania konstrukcji p\u0119tla for 1. B\u0142\u0105d zakresu (off-by-one) Najcz\u0119stszy b\u0142\u0105d: for i in range(1, 10): Wielu pocz\u0105tkuj\u0105cych zak\u0142ada, \u017ce wykona si\u0119 10 iteracji, a faktycznie wykona si\u0119 9. 2. Niezgodny znak kroku for i in range(0, 10, -1): print(i) Nie wykona si\u0119 ani razu, poniewa\u017c warunek logiczny nie zostanie spe\u0142niony. 3. Modyfikacja zmiennej steruj\u0105cej wewn\u0105trz p\u0119tli W Pythonie: for i in range(5): i = 100 Zmiana i nie wp\u0142ywa na kolejne warto\u015bci generowane przez range. W C taka modyfikacja mo\u017ce wp\u0142yn\u0105\u0107 na dzia\u0142anie p\u0119tli i spowodowa\u0107 trudne do wykrycia b\u0142\u0119dy. 4. Zagnie\u017cd\u017cone p\u0119tle for i in range(3): for j in range(2): print(i, j) Z\u0142o\u017cono\u015b\u0107 czasowa ro\u015bnie multiplikatywnie. Dla dw\u00f3ch zakres\u00f3w d\u0142ugo\u015bci n mamy z\u0142o\u017cono\u015b\u0107 O(n\u00b2). Zastosowania praktyczne i zale\u017cno\u015b\u0107 od z\u0142o\u017cono\u015bci obliczeniowej P\u0119tla for jest podstawowym narz\u0119dziem w: Przyk\u0142ad: mno\u017cenie 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\u0142o\u017cono\u015b\u0107: O(n \u00b7 m \u00b7 p). W przypadku macierzy kwadratowej O(n\u00b3). Ka\u017cda dodatkowa zagnie\u017cd\u017cona p\u0119tla to wzrost rz\u0119du z\u0142o\u017cono\u015bci. P\u0119tla for jako fundament implementacji wielu klasycznych algorytm\u00f3w numerycznych i dyskretnych Bez tej konstrukcji trudno wyobrazi\u0107 sobie implementacj\u0119: Przyk\u0142ad silni w Pythonie: n = 5wynik = 1for i in range(1, n + 1): wynik = wynik * iprint(wynik) Ka\u017cda iteracja aktualizuje stan programu w spos\u00f3b deterministyczny. Kr\u00f3tkie uwagi praktyczne P\u0119tla for jest jedn\u0105 z najbardziej podstawowych, a jednocze\u015bnie najcz\u0119\u015bciej u\u017cywanych konstrukcji steruj\u0105cych w programowaniu proceduralnym i skryptowym. Jej poprawne zrozumienie ma bezpo\u015bredni wp\u0142yw na jako\u015b\u0107 implementowanych algorytm\u00f3w i poprawno\u015b\u0107 logiki programu.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":1004,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1009","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/pages\/1009","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/comments?post=1009"}],"version-history":[{"count":1,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/pages\/1009\/revisions"}],"predecessor-version":[{"id":1012,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/pages\/1009\/revisions\/1012"}],"up":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/pages\/1004"}],"wp:attachment":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/media?parent=1009"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}