{"id":1116,"date":"2021-06-16T17:25:00","date_gmt":"2021-06-16T15:25:00","guid":{"rendered":"https:\/\/trzykody.pl\/?page_id=1116"},"modified":"2026-02-20T18:51:42","modified_gmt":"2026-02-20T17:51:42","slug":"petle","status":"publish","type":"page","link":"https:\/\/trzykody.pl\/index.php\/python\/petle\/","title":{"rendered":"P\u0119tle"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">P\u0119tle to podstawowy mechanizm sterowania przep\u0142ywem programu. Umo\u017cliwiaj\u0105 wielokrotne wykonywanie fragmentu kodu w spos\u00f3b kontrolowany &#8211; do momentu spe\u0142nienia okre\u015blonego warunku albo dla ka\u017cdego elementu danej kolekcji. Bez nich praktycznie nie da si\u0119 pisa\u0107 program\u00f3w przetwarzaj\u0105cych dane, wykonuj\u0105cych obliczenia iteracyjne czy operuj\u0105cych na strukturach takich jak listy i s\u0142owniki. Zagadnienie P\u0119tle Python obejmuje kilka konstrukcji j\u0119zykowych oraz dodatkowe mechanizmy pomocnicze, kt\u00f3re razem tworz\u0105 sp\u00f3jny system iteracji.<\/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=\"#petle-python-konstrukcja-for-jako-podstawowy-mechanizm-iteracji-po-sekwencjach-i-iteratorach\">P\u0119tle Python &#8211; konstrukcja for jako podstawowy mechanizm iteracji po sekwencjach i iteratorach<\/a><ol><li class=\"\"><a href=\"#czym-jest-petla-for-i-jak-dziala-w-pythonie\">Czym jest p\u0119tla for i jak dzia\u0142a w Pythonie<\/a><\/li><li class=\"\"><a href=\"#iteracja-po-roznych-typach-danych\">Iteracja po r\u00f3\u017cnych typach danych<\/a><\/li><li class=\"\"><a href=\"#funkcja-range-jako-generator-liczb\">Funkcja range() jako generator liczb<\/a><\/li><li class=\"\"><a href=\"#iteracja-z-indeksem-enumerate\">Iteracja z indeksem &#8211; enumerate()<\/a><\/li><li class=\"\"><a href=\"#zagniezdzone-petle-for\">Zagnie\u017cd\u017cone p\u0119tle for<\/a><\/li><\/ol><\/li><li class=\"\"><a href=\"#petle-python-konstrukcja-while-warunki-zakonczenia-i-kontrola-przeplywu-programu\">P\u0119tle Python &#8211; konstrukcja while, warunki zako\u0144czenia i kontrola przep\u0142ywu programu<\/a><ol><li class=\"\"><a href=\"#podstawowa-konstrukcja-while\">Podstawowa konstrukcja while<\/a><\/li><li class=\"\"><a href=\"#ryzyko-petli-nieskonczonej\">Ryzyko p\u0119tli niesko\u0144czonej<\/a><\/li><li class=\"\"><a href=\"#instrukcja-break\">Instrukcja break<\/a><\/li><li class=\"\"><a href=\"#instrukcja-continue\">Instrukcja continue<\/a><\/li><li class=\"\"><a href=\"#klauzula-else-w-petlach\">Klauzula else w p\u0119tlach<\/a><\/li><\/ol><\/li><li class=\"\"><a href=\"#petle-python-zaawansowane-mechanizmy-list-comprehensions-generatory-iteratory-wlasne-i-aspekty-wydajnosciowe\">P\u0119tle Python &#8211; zaawansowane mechanizmy: list comprehensions, generatory, iteratory w\u0142asne i aspekty wydajno\u015bciowe<\/a><ol><li class=\"\"><a href=\"#list-comprehensions-jako-skrocona-forma-petli\">List comprehensions jako skr\u00f3cona forma p\u0119tli<\/a><\/li><li class=\"\"><a href=\"#generator-expressions\">Generator expressions<\/a><\/li><li class=\"\"><a href=\"#wlasne-iteratory\">W\u0142asne iteratory<\/a><\/li><li class=\"\"><a href=\"#funkcja-iter-i-next\">Funkcja iter() i next()<\/a><\/li><li class=\"\"><a href=\"#porownanie-z-c-i-c\">Por\u00f3wnanie z C i C++<\/a><\/li><li class=\"\"><a href=\"#wydajnosc-i-zlozonosc\">Wydajno\u015b\u0107 i z\u0142o\u017cono\u015b\u0107<\/a><\/li><\/ol><\/li><li class=\"\"><a href=\"#uwagi-praktyczne-i-typowe-bledy\">Uwagi praktyczne i typowe b\u0142\u0119dy<\/a><\/li><\/ol><\/nav><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"petle-python-konstrukcja-for-jako-podstawowy-mechanizm-iteracji-po-sekwencjach-i-iteratorach\">P\u0119tle Python &#8211; konstrukcja <code>for<\/code> jako podstawowy mechanizm iteracji po sekwencjach i iteratorach<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czym-jest-petla-for-i-jak-dziala-w-pythonie\">Czym jest p\u0119tla <code>for<\/code> i jak dzia\u0142a w Pythonie<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">W Pythonie p\u0119tla <code>for<\/code> nie jest klasyczn\u0105 p\u0119tl\u0105 licznikow\u0105 znan\u0105 z j\u0119zyka C. Jest to konstrukcja iteracyjna oparta na protokole iteratora. Oznacza to, \u017ce nie operuje bezpo\u015brednio na liczniku, lecz na obiekcie dostarczaj\u0105cym kolejne warto\u015bci.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Og\u00f3lna posta\u0107:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">for zmienna in obiekt_iterowalny:<br>    instrukcje<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Dzia\u0142anie:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Python pobiera iterator z obiektu (wywo\u0142uj\u0105c wewn\u0119trznie metod\u0119 <code>__iter__()<\/code>).<\/li>\n\n\n\n<li>W ka\u017cdej iteracji wywo\u0142ywana jest metoda <code>__next__()<\/code>.<\/li>\n\n\n\n<li>Je\u015bli pojawi si\u0119 wyj\u0105tek <code>StopIteration<\/code>, p\u0119tla ko\u0144czy dzia\u0142anie.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ad:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">for x in [10, 20, 30]:<br>    print(x)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ka\u017cdy element listy zostaje przypisany do zmiennej <code>x<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"iteracja-po-roznych-typach-danych\">Iteracja po r\u00f3\u017cnych typach danych<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">P\u0119tla <code>for<\/code> dzia\u0142a z ka\u017cdym obiektem iterowalnym:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>listy<\/li>\n\n\n\n<li>krotki<\/li>\n\n\n\n<li>napisy<\/li>\n\n\n\n<li>zbiory<\/li>\n\n\n\n<li>s\u0142owniki<\/li>\n\n\n\n<li>zakresy (<code>range<\/code>)<\/li>\n\n\n\n<li>pliki<\/li>\n\n\n\n<li>generatory<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Iteracja po napisie:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">for znak in \"abc\":<br>    print(znak)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Iteracja po s\u0142owniku:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">d = {\"a\": 1, \"b\": 2}<br>for klucz in d:<br>    print(klucz)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Aby uzyska\u0107 pary klucz-warto\u015b\u0107:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">for klucz, wartosc in d.items():<br>    print(klucz, wartosc)<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"funkcja-range-jako-generator-liczb\">Funkcja <code>range()<\/code> jako generator liczb<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><code>range()<\/code> zwraca obiekt typu range, kt\u00f3ry generuje liczby ca\u0142kowite w okre\u015blonym zakresie.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Postacie:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">range(stop)<br>range(start, stop)<br>range(start, stop, krok)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ad:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">for i in range(5):<br>    print(i)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Wynik:<br>0 1 2 3 4<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>range()<\/code> nie tworzy listy &#8211; generuje warto\u015bci dynamicznie, co jest oszcz\u0119dne pami\u0119ciowo.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"iteracja-z-indeksem-enumerate\">Iteracja z indeksem &#8211; <code>enumerate()<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Cz\u0119sty problem: potrzebny jest zar\u00f3wno element, jak i jego indeks.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">lista = [\"a\", \"b\", \"c\"]for i, wartosc in enumerate(lista):<br>    print(i, wartosc)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>enumerate()<\/code> zwraca iterator par <code>(indeks, element)<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"zagniezdzone-petle-for\">Zagnie\u017cd\u017cone p\u0119tle <code>for<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Mo\u017cliwe jest zagnie\u017cd\u017canie p\u0119tli:<\/p>\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 p\u0119tli o d\u0142ugo\u015bci <code>n<\/code> mamy z\u0142o\u017cono\u015b\u0107 O(n\u00b2).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"petle-python-konstrukcja-while-warunki-zakonczenia-i-kontrola-przeplywu-programu\">P\u0119tle Python &#8211; konstrukcja <code>while<\/code>, warunki zako\u0144czenia i kontrola przep\u0142ywu programu<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"podstawowa-konstrukcja-while\">Podstawowa konstrukcja <code>while<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">P\u0119tla <code>while<\/code> wykonuje blok kodu tak d\u0142ugo, jak warunek logiczny jest prawdziwy.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">while warunek:<br>    instrukcje<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ad:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">i = 0<br>while i &lt; 5:<br>    print(i)<br>    i += 1<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Warunek sprawdzany jest przed ka\u017cd\u0105 iteracj\u0105.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"ryzyko-petli-nieskonczonej\">Ryzyko p\u0119tli niesko\u0144czonej<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Je\u017celi warunek nigdy nie stanie si\u0119 fa\u0142szywy, p\u0119tla b\u0119dzie wykonywana bez ko\u0144ca:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">while True:<br>    print(\"dziala\")<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Taka konstrukcja jest u\u017cywana celowo w serwerach, p\u0119tlach g\u0142\u00f3wnych program\u00f3w czy systemach wbudowanych.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"instrukcja-break\">Instrukcja <code>break<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Natychmiastowe przerwanie p\u0119tli.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">while True:<br>    x = int(input())<br>    if x == 0:<br>        break<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Po wykonaniu <code>break<\/code> sterowanie przechodzi za blok p\u0119tli.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"instrukcja-continue\">Instrukcja <code>continue<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Pomija bie\u017c\u0105c\u0105 iteracj\u0119 i przechodzi do nast\u0119pnej.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">for i in range(5):<br>    if i == 2:<br>        continue<br>    print(i)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Wynik: 0 1 3 4<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"klauzula-else-w-petlach\">Klauzula <code>else<\/code> w p\u0119tlach<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Python posiada mniej znany mechanizm <code>else<\/code> po p\u0119tli.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">for i in range(5):<br>    print(i)<br>else:<br>    print(\"koniec\")<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Blok <code>else<\/code> wykona si\u0119, je\u015bli p\u0119tla zako\u0144czy\u0142a si\u0119 naturalnie (bez <code>break<\/code>).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ad z wyszukiwaniem:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">liczby = [1, 3, 5, 7]for x in liczby:<br>    if x == 4:<br>        print(\"znaleziono\")<br>        break<br>else:<br>    print(\"nie znaleziono\")<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"petle-python-zaawansowane-mechanizmy-list-comprehensions-generatory-iteratory-wlasne-i-aspekty-wydajnosciowe\">P\u0119tle Python &#8211; zaawansowane mechanizmy: list comprehensions, generatory, iteratory w\u0142asne i aspekty wydajno\u015bciowe<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"list-comprehensions-jako-skrocona-forma-petli\">List comprehensions jako skr\u00f3cona forma p\u0119tli<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Sk\u0142adnia:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">[wyrazenie for element in sekwencja if warunek]<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ad:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">kwadraty = [x*x for x in range(10)]<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Z warunkiem:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">parzyste = [x for x in range(20) if x % 2 == 0]<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Mechanizm:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Tworzona jest nowa lista.<\/li>\n\n\n\n<li>Iteracja odbywa si\u0119 podobnie jak w <code>for<\/code>.<\/li>\n\n\n\n<li>Wyra\u017cenie generuje element wynikowy.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">List comprehensions s\u0105 zwykle szybsze ni\u017c r\u0119czne dodawanie element\u00f3w przez <code>append()<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"generator-expressions\">Generator expressions<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">R\u00f3\u017cni\u0105 si\u0119 nawiasami:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">gen = (x*x for x in range(10))<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Nie tworz\u0105 listy w pami\u0119ci. Warto\u015bci generowane s\u0105 na \u017c\u0105danie.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">U\u017cycie:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">for x in gen:<br>    print(x)<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"wlasne-iteratory\">W\u0142asne iteratory<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Aby obiekt by\u0142 iterowalny, musi implementowa\u0107:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>__iter__()<\/code><\/li>\n\n\n\n<li><code>__next__()<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Minimalny przyk\u0142ad:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">class Licznik:<br>    def __init__(self, max):<br>        self.max = max<br>        self.i = 0    def __iter__(self):<br>        return self    def __next__(self):<br>        if self.i &lt; self.max:<br>            self.i += 1<br>            return self.i - 1<br>        else:<br>            raise StopIteration<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">U\u017cycie:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">for x in Licznik(3):<br>    print(x)<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"funkcja-iter-i-next\">Funkcja <code>iter()<\/code> i <code>next()<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Mo\u017cliwe jest r\u0119czne sterowanie iteracj\u0105:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">it = iter([1,2,3])<br>print(next(it))<br>print(next(it))<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Po wyczerpaniu element\u00f3w pojawi si\u0119 <code>StopIteration<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"porownanie-z-c-i-c\">Por\u00f3wnanie z C i C++<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">W C klasyczna p\u0119tla licznikowa:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">#include &lt;stdio.h&gt;int main() {<br>    int i;<br>    for(i = 0; i &lt; 5; i++) {<br>        printf(\"%d\\n\", i);<br>    }<br>    return 0;<br>}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">W C++:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">#include &lt;iostream&gt;<br>using namespace std;int main() {<br>    for(int i = 0; i &lt; 5; i++) {<br>        cout &lt;&lt; i &lt;&lt; endl;<br>    }<br>}<\/pre>\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>    print(i)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Python nie udost\u0119pnia bezpo\u015brednio zmiennej steruj\u0105cej jako mechanizmu j\u0119zykowego \u2014 opiera si\u0119 na iteratorach.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"wydajnosc-i-zlozonosc\">Wydajno\u015b\u0107 i z\u0142o\u017cono\u015b\u0107<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>P\u0119tla <code>for<\/code> po li\u015bcie: O(n)<\/li>\n\n\n\n<li>Zagnie\u017cd\u017cone p\u0119tle: O(n\u00b2), O(n\u00b3), itd.<\/li>\n\n\n\n<li>List comprehension: cz\u0119sto minimalnie szybsze<\/li>\n\n\n\n<li>Generator: oszcz\u0119dno\u015b\u0107 pami\u0119ci kosztem niewielkiego narzutu wywo\u0142a\u0144<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Koszt operacji wewn\u0105trz p\u0119tli dominuje nad sam\u0105 konstrukcj\u0105 p\u0119tli.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"uwagi-praktyczne-i-typowe-bledy\">Uwagi praktyczne i typowe b\u0142\u0119dy<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Modyfikowanie listy podczas iteracji mo\u017ce prowadzi\u0107 do nieprzewidywalnych efekt\u00f3w.<\/li>\n\n\n\n<li>Brak inkrementacji w <code>while<\/code> powoduje p\u0119tl\u0119 niesko\u0144czon\u0105.<\/li>\n\n\n\n<li>Nadu\u017cywanie zagnie\u017cd\u017conych p\u0119tli prowadzi do problem\u00f3w wydajno\u015bciowych.<\/li>\n\n\n\n<li>W wielu przypadkach operacje na ca\u0142ych kolekcjach (<code>sum<\/code>, <code>map<\/code>, <code>any<\/code>, <code>all<\/code>) s\u0105 czytelniejsze ni\u017c r\u0119czne p\u0119tle.<\/li>\n\n\n\n<li>Zbyt skomplikowane list comprehensions obni\u017caj\u0105 czytelno\u015b\u0107.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">P\u0119tle stanowi\u0105 rdze\u0144 sterowania przep\u0142ywem w Pythonie. Konstrukcje <code>for<\/code>, <code>while<\/code>, mechanizm iterator\u00f3w oraz generatory tworz\u0105 sp\u00f3jny model iteracji oparty na protokole iteratora. Zrozumienie ich dzia\u0142ania na poziomie wewn\u0119trznym pozwala pisa\u0107 kod przewidywalny, wydajny i poprawny logicznie.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>P\u0119tle to podstawowy mechanizm sterowania przep\u0142ywem programu. Umo\u017cliwiaj\u0105 wielokrotne wykonywanie fragmentu kodu w spos\u00f3b kontrolowany &#8211; do momentu spe\u0142nienia okre\u015blonego warunku albo dla ka\u017cdego elementu danej kolekcji. Bez nich praktycznie nie da si\u0119 pisa\u0107 program\u00f3w przetwarzaj\u0105cych dane, wykonuj\u0105cych obliczenia iteracyjne czy operuj\u0105cych na strukturach takich jak listy i s\u0142owniki. Zagadnienie P\u0119tle Python obejmuje kilka konstrukcji j\u0119zykowych oraz dodatkowe mechanizmy pomocnicze, kt\u00f3re razem tworz\u0105 sp\u00f3jny system iteracji. P\u0119tle Python &#8211; konstrukcja for jako podstawowy mechanizm iteracji po sekwencjach i iteratorach Czym jest p\u0119tla for i jak dzia\u0142a w Pythonie W Pythonie p\u0119tla for nie jest klasyczn\u0105 p\u0119tl\u0105 licznikow\u0105 znan\u0105 z j\u0119zyka C. Jest to konstrukcja iteracyjna oparta na protokole iteratora. Oznacza to, \u017ce nie operuje bezpo\u015brednio na liczniku, lecz na obiekcie dostarczaj\u0105cym kolejne warto\u015bci. Og\u00f3lna posta\u0107: for zmienna in obiekt_iterowalny: instrukcje Dzia\u0142anie: Przyk\u0142ad: for x in [10, 20, 30]: print(x) Ka\u017cdy element listy zostaje przypisany do zmiennej x. Iteracja po r\u00f3\u017cnych typach danych P\u0119tla for dzia\u0142a z ka\u017cdym obiektem iterowalnym: Iteracja po napisie: for znak in &#8222;abc&#8221;: print(znak) Iteracja po s\u0142owniku: d = {&#8222;a&#8221;: 1, &#8222;b&#8221;: 2}for klucz in d: print(klucz) Aby uzyska\u0107 pary klucz-warto\u015b\u0107: for klucz, wartosc in d.items(): print(klucz, wartosc) Funkcja range() jako generator liczb range() zwraca obiekt typu range, kt\u00f3ry generuje liczby ca\u0142kowite w okre\u015blonym zakresie. Postacie: range(stop)range(start, stop)range(start, stop, krok) Przyk\u0142ad: for i in range(5): print(i) Wynik:0 1 2 3 4 range() nie tworzy listy &#8211; generuje warto\u015bci dynamicznie, co jest oszcz\u0119dne pami\u0119ciowo. Iteracja z indeksem &#8211; enumerate() Cz\u0119sty problem: potrzebny jest zar\u00f3wno element, jak i jego indeks. lista = [&#8222;a&#8221;, &#8222;b&#8221;, &#8222;c&#8221;]for i, wartosc in enumerate(lista): print(i, wartosc) enumerate() zwraca iterator par (indeks, element). Zagnie\u017cd\u017cone p\u0119tle for Mo\u017cliwe jest zagnie\u017cd\u017canie p\u0119tli: 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 p\u0119tli o d\u0142ugo\u015bci n mamy z\u0142o\u017cono\u015b\u0107 O(n\u00b2). P\u0119tle Python &#8211; konstrukcja while, warunki zako\u0144czenia i kontrola przep\u0142ywu programu Podstawowa konstrukcja while P\u0119tla while wykonuje blok kodu tak d\u0142ugo, jak warunek logiczny jest prawdziwy. while warunek: instrukcje Przyk\u0142ad: i = 0while i &lt; 5: print(i) i += 1 Warunek sprawdzany jest przed ka\u017cd\u0105 iteracj\u0105. Ryzyko p\u0119tli niesko\u0144czonej Je\u017celi warunek nigdy nie stanie si\u0119 fa\u0142szywy, p\u0119tla b\u0119dzie wykonywana bez ko\u0144ca: while True: print(&#8222;dziala&#8221;) Taka konstrukcja jest u\u017cywana celowo w serwerach, p\u0119tlach g\u0142\u00f3wnych program\u00f3w czy systemach wbudowanych. Instrukcja break Natychmiastowe przerwanie p\u0119tli. while True: x = int(input()) if x == 0: break Po wykonaniu break sterowanie przechodzi za blok p\u0119tli. Instrukcja continue Pomija bie\u017c\u0105c\u0105 iteracj\u0119 i przechodzi do nast\u0119pnej. for i in range(5): if i == 2: continue print(i) Wynik: 0 1 3 4 Klauzula else w p\u0119tlach Python posiada mniej znany mechanizm else po p\u0119tli. for i in range(5): print(i)else: print(&#8222;koniec&#8221;) Blok else wykona si\u0119, je\u015bli p\u0119tla zako\u0144czy\u0142a si\u0119 naturalnie (bez break). Przyk\u0142ad z wyszukiwaniem: liczby = [1, 3, 5, 7]for x in liczby: if x == 4: print(&#8222;znaleziono&#8221;) breakelse: print(&#8222;nie znaleziono&#8221;) P\u0119tle Python &#8211; zaawansowane mechanizmy: list comprehensions, generatory, iteratory w\u0142asne i aspekty wydajno\u015bciowe List comprehensions jako skr\u00f3cona forma p\u0119tli Sk\u0142adnia: [wyrazenie for element in sekwencja if warunek] Przyk\u0142ad: kwadraty = [x*x for x in range(10)] Z warunkiem: parzyste = [x for x in range(20) if x % 2 == 0] Mechanizm: List comprehensions s\u0105 zwykle szybsze ni\u017c r\u0119czne dodawanie element\u00f3w przez append(). Generator expressions R\u00f3\u017cni\u0105 si\u0119 nawiasami: gen = (x*x for x in range(10)) Nie tworz\u0105 listy w pami\u0119ci. Warto\u015bci generowane s\u0105 na \u017c\u0105danie. U\u017cycie: for x in gen: print(x) W\u0142asne iteratory Aby obiekt by\u0142 iterowalny, musi implementowa\u0107: Minimalny przyk\u0142ad: class Licznik: def __init__(self, max): self.max = max self.i = 0 def __iter__(self): return self def __next__(self): if self.i &lt; self.max: self.i += 1 return self.i &#8211; 1 else: raise StopIteration U\u017cycie: for x in Licznik(3): print(x) Funkcja iter() i next() Mo\u017cliwe jest r\u0119czne sterowanie iteracj\u0105: it = iter([1,2,3])print(next(it))print(next(it)) Po wyczerpaniu element\u00f3w pojawi si\u0119 StopIteration. Por\u00f3wnanie z C i C++ W C klasyczna p\u0119tla licznikowa: #include &lt;stdio.h&gt;int main() { int i; for(i = 0; i &lt; 5; i++) { printf(&#8222;%d\\n&#8221;, i); } return 0;} W C++: #include &lt;iostream&gt;using namespace std;int main() { for(int i = 0; i &lt; 5; i++) { cout &lt;&lt; i &lt;&lt; endl; }} W Pythonie: for i in range(5): print(i) Python nie udost\u0119pnia bezpo\u015brednio zmiennej steruj\u0105cej jako mechanizmu j\u0119zykowego \u2014 opiera si\u0119 na iteratorach. Wydajno\u015b\u0107 i z\u0142o\u017cono\u015b\u0107 Koszt operacji wewn\u0105trz p\u0119tli dominuje nad sam\u0105 konstrukcj\u0105 p\u0119tli. Uwagi praktyczne i typowe b\u0142\u0119dy P\u0119tle stanowi\u0105 rdze\u0144 sterowania przep\u0142ywem w Pythonie. Konstrukcje for, while, mechanizm iterator\u00f3w oraz generatory tworz\u0105 sp\u00f3jny model iteracji oparty na protokole iteratora. Zrozumienie ich dzia\u0142ania na poziomie wewn\u0119trznym pozwala pisa\u0107 kod przewidywalny, wydajny i poprawny logicznie.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":1031,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1116","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/pages\/1116","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=1116"}],"version-history":[{"count":1,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/pages\/1116\/revisions"}],"predecessor-version":[{"id":1117,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/pages\/1116\/revisions\/1117"}],"up":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/pages\/1031"}],"wp:attachment":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/media?parent=1116"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}