{"id":1291,"date":"2026-04-17T18:05:39","date_gmt":"2026-04-17T16:05:39","guid":{"rendered":"https:\/\/trzykody.pl\/?p=1291"},"modified":"2026-04-17T18:05:41","modified_gmt":"2026-04-17T16:05:41","slug":"funkcje-python","status":"publish","type":"post","link":"https:\/\/trzykody.pl\/index.php\/2026\/04\/17\/funkcje-python\/","title":{"rendered":"Funkcje Python"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Programowanie bez wyodr\u0119bniania powtarzalnych fragment\u00f3w szybko prowadzi do chaosu: kod ro\u015bnie, trudniej go testowa\u0107, a drobna zmiana w jednym miejscu wymaga r\u0119cznych poprawek w kilku innych. Mechanizm funkcji rozwi\u0105zuje ten problem przez wprowadzenie lokalnych blok\u00f3w logiki z jasno okre\u015blonym wej\u015bciem i wyj\u015bciem. W praktyce oznacza to mniejsze ryzyko b\u0142\u0119d\u00f3w, \u0142atwiejsze debugowanie i mo\u017cliwo\u015b\u0107 ponownego u\u017cycia kodu bez kopiowania. W j\u0119zyku Python ten mechanizm jest prosty sk\u0142adniowo, ale kryje sporo subtelno\u015bci zwi\u0105zanych z przekazywaniem argument\u00f3w, zakresem zmiennych i obiektowym modelem danych, co dobrze wida\u0107, gdy analizuje si\u0119 <strong>Funkcje Python<\/strong>.<\/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><a href=\"#funkcje-python-jako-podstawowy-mechanizm-organizacji-kodu-i-redukcji-powtorzen-w-projektach\">Funkcje Python jako podstawowy mechanizm organizacji kodu i redukcji powt\u00f3rze\u0144 w projektach<\/a><ol><li><a href=\"#przyklady-definicji-funkcji\">Przyk\u0142ady definicji funkcji<\/a><\/li><\/ol><\/li><li><a href=\"#sposoby-przekazywania-argumentow-do-funkcji-i-konsekwencje-mutowalnosci-obiektow\">Sposoby przekazywania argument\u00f3w do funkcji i konsekwencje mutowalno\u015bci obiekt\u00f3w<\/a><ol><li><a href=\"#przyklady-zachowania\">Przyk\u0142ady zachowania<\/a><\/li><\/ol><\/li><li><a href=\"#funkcje-python-a-zakres-zmiennych-i-reguly-legb-w-praktyce-dzialania-interpretera\">Funkcje Python a zakres zmiennych i regu\u0142y LEGB w praktyce dzia\u0142ania interpretera<\/a><ol><li><a href=\"#przyklad-dzialania-zakresow\">Przyk\u0142ad dzia\u0142ania zakres\u00f3w<\/a><\/li><\/ol><\/li><li><a href=\"#zwracanie-wartosci-i-wielokrotne-wyniki-poprzez-krotki-oraz-ich-rozpakowanie\">Zwracanie warto\u015bci i wielokrotne wyniki poprzez krotki oraz ich rozpakowanie<\/a><ol><li><a href=\"#przyklad\">Przyk\u0142ad<\/a><\/li><\/ol><\/li><li><a href=\"#funkcje-jako-obiekty-pierwszej-klasy-i-wykorzystanie-ich-w-bardziej-zaawansowanych-konstrukcjach\">Funkcje jako obiekty pierwszej klasy i wykorzystanie ich w bardziej zaawansowanych konstrukcjach<\/a><\/li><li><a href=\"#funkcje-anonimowe-lambda-i-ich-ograniczenia-w-zastosowaniach-praktycznych\">Funkcje anonimowe lambda i ich ograniczenia w zastosowaniach praktycznych<\/a><\/li><li><a href=\"#rekurencja-jako-alternatywa-dla-iteracji-i-jej-koszt-obliczeniowy-w-pythonie\">Rekurencja jako alternatywa dla iteracji i jej koszt obliczeniowy w Pythonie<\/a><ol><li><a href=\"#przyklad-silni\">Przyk\u0142ad silni<\/a><\/li><\/ol><\/li><li><a href=\"#typowe-bledy-i-pulapki-przy-pracy-z-funkcjami-w-pythonie\">Typowe b\u0142\u0119dy i pu\u0142apki przy pracy z funkcjami w Pythonie<\/a><\/li><li><a href=\"#faq\">FAQ<\/a><\/li><li><a href=\"#zakonczenie\">Zako\u0144czenie<\/a><\/li><\/ol><\/nav><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"funkcje-python-jako-podstawowy-mechanizm-organizacji-kodu-i-redukcji-powtorzen-w-projektach\">Funkcje Python jako podstawowy mechanizm organizacji kodu i redukcji powt\u00f3rze\u0144 w projektach<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Funkcja to blok instrukcji oznaczony nazw\u0105, kt\u00f3ry mo\u017cna wywo\u0142a\u0107 wielokrotnie z r\u00f3\u017cnymi danymi wej\u015bciowymi. W Pythonie funkcje s\u0105 obiektami pierwszej klasy, co oznacza, \u017ce mo\u017cna je przypisywa\u0107 do zmiennych, przekazywa\u0107 jako argumenty i zwraca\u0107 z innych funkcji.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Najprostsza funkcja przyjmuje dane wej\u015bciowe, przetwarza je i zwraca wynik. W praktyce funkcja mo\u017ce nie zwraca\u0107 nic (implicitnie <code>None<\/code>), ale i tak pe\u0142ni rol\u0119 logicznego wydzielenia operacji.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"przyklady-definicji-funkcji\">Przyk\u0142ady definicji funkcji<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>J\u0119zyk<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>Python<\/td><td><code>python\\ndef suma(a, b):\\n return a + b\\n<\/code><\/td><\/tr><tr><td>C<\/td><td><code>c\\nint suma(int a, int b) {\\n return a + b;\\n}\\n<\/code><\/td><\/tr><tr><td>C++<\/td><td><code>cpp\\nint suma(int a, int b) {\\n return a + b;\\n}\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Istotna r\u00f3\u017cnica: Python nie wymaga deklarowania typ\u00f3w, co przyspiesza pisanie, ale zwi\u0119ksza ryzyko b\u0142\u0119d\u00f3w runtime.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"sposoby-przekazywania-argumentow-do-funkcji-i-konsekwencje-mutowalnosci-obiektow\">Sposoby przekazywania argument\u00f3w do funkcji i konsekwencje mutowalno\u015bci obiekt\u00f3w<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Python stosuje model \u201epass by object reference\u201d (czasem b\u0142\u0119dnie nazywany \u201epass by value\u201d lub \u201epass by reference\u201d). W praktyce oznacza to, \u017ce funkcja dostaje referencj\u0119 do obiektu, ale nie mo\u017ce zmieni\u0107 samego przypisania poza swoim zakresem.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Kluczowa r\u00f3\u017cnica pojawia si\u0119 przy obiektach mutowalnych (listy, s\u0142owniki) i niemutowalnych (int, str, tuple).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"przyklady-zachowania\">Przyk\u0142ady zachowania<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Przypadek<\/th><th>Kod Python<\/th><th>Efekt<\/th><\/tr><\/thead><tbody><tr><td>Niemutowalny<\/td><td><code>python\\ndef zmien(x):\\n x = x + 1\\n\\nx = 5\\nzmien(x)\\n<\/code><\/td><td>x nadal 5<\/td><\/tr><tr><td>Mutowalny<\/td><td><code>python\\ndef dodaj(lista):\\n lista.append(10)\\n\\nl = [1,2]\\ndodaj(l)\\n<\/code><\/td><td>l = [1,2,10]<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">To jedno z najcz\u0119stszych \u017ar\u00f3de\u0142 b\u0142\u0119d\u00f3w. Programista zak\u0142ada, \u017ce dane s\u0105 kopiowane, a faktycznie s\u0105 modyfikowane w miejscu.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"funkcje-python-a-zakres-zmiennych-i-reguly-legb-w-praktyce-dzialania-interpretera\">Funkcje Python a zakres zmiennych i regu\u0142y LEGB w praktyce dzia\u0142ania interpretera<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Python stosuje regu\u0142\u0119 LEGB (Local, Enclosing, Global, Built-in), kt\u00f3ra okre\u015bla kolejno\u015b\u0107 wyszukiwania zmiennych.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Local \u2013 wewn\u0105trz funkcji<\/li>\n\n\n\n<li>Enclosing \u2013 funkcje zewn\u0119trzne (zagnie\u017cd\u017cone)<\/li>\n\n\n\n<li>Global \u2013 modu\u0142<\/li>\n\n\n\n<li>Built-in \u2013 funkcje wbudowane<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"przyklad-dzialania-zakresow\">Przyk\u0142ad dzia\u0142ania zakres\u00f3w<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Kod<\/th><th>Wyja\u015bnienie<\/th><\/tr><\/thead><tbody><tr><td><code>python\\nx = 10\\n\\ndef f():\\n x = 5\\n return x\\n<\/code><\/td><td>zwraca 5 (lokalne x)<\/td><\/tr><tr><td><code>python\\nx = 10\\n\\ndef f():\\n return x\\n<\/code><\/td><td>zwraca 10 (globalne x)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Zmienne globalne mo\u017cna modyfikowa\u0107, ale wymaga to u\u017cycia s\u0142owa kluczowego <code>global<\/code>.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Kod<\/th><th>Efekt<\/th><\/tr><\/thead><tbody><tr><td><code>python\\nx = 10\\n\\ndef f():\\n global x\\n x = 20\\n<\/code><\/td><td>zmienia globalne x<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Nadu\u017cywanie <code>global<\/code> prowadzi do trudnych do \u015bledzenia b\u0142\u0119d\u00f3w.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"zwracanie-wartosci-i-wielokrotne-wyniki-poprzez-krotki-oraz-ich-rozpakowanie\">Zwracanie warto\u015bci i wielokrotne wyniki poprzez krotki oraz ich rozpakowanie<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Python pozwala zwraca\u0107 wiele warto\u015bci poprzez krotki. W praktyce nie jest to \u201ewiele zwrot\u00f3w\u201d, tylko jeden obiekt zawieraj\u0105cy kilka element\u00f3w.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"przyklad\">Przyk\u0142ad<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Kod<\/th><th>Wynik<\/th><\/tr><\/thead><tbody><tr><td><code>python\\ndef operacje(a, b):\\n return a+b, a-b\\n\\ns, r = operacje(5, 3)\\n<\/code><\/td><td>s=8, r=2<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Pod mask\u0105:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">return (a+b, a-b)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Rozpakowanie dzia\u0142a automatycznie, co upraszcza zapis, ale mo\u017ce prowadzi\u0107 do b\u0142\u0119d\u00f3w, gdy liczba warto\u015bci si\u0119 nie zgadza.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"funkcje-jako-obiekty-pierwszej-klasy-i-wykorzystanie-ich-w-bardziej-zaawansowanych-konstrukcjach\">Funkcje jako obiekty pierwszej klasy i wykorzystanie ich w bardziej zaawansowanych konstrukcjach<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Funkcje mo\u017cna przypisywa\u0107 do zmiennych:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Kod<\/th><th>Efekt<\/th><\/tr><\/thead><tbody><tr><td><code>python\\ndef f(x):\\n return x*2\\n\\ng = f\\n<\/code><\/td><td>g dzia\u0142a jak f<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Mo\u017cna przekazywa\u0107 funkcje jako argumenty:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Kod<\/th><th>Efekt<\/th><\/tr><\/thead><tbody><tr><td><code>python\\ndef wykonaj(f, x):\\n return f(x)\\n<\/code><\/td><td>funkcja wy\u017cszego rz\u0119du<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">To podstawa dla:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>map<\/code><\/li>\n\n\n\n<li><code>filter<\/code><\/li>\n\n\n\n<li>dekorator\u00f3w<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"funkcje-anonimowe-lambda-i-ich-ograniczenia-w-zastosowaniach-praktycznych\">Funkcje anonimowe lambda i ich ograniczenia w zastosowaniach praktycznych<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Lambda to skr\u00f3cona forma funkcji:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Kod<\/th><th>Odpowiednik<\/th><\/tr><\/thead><tbody><tr><td><code>python\\nlambda x: x+1\\n<\/code><\/td><td>funkcja jednowierszowa<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ad u\u017cycia:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Kod<\/th><th>Wynik<\/th><\/tr><\/thead><tbody><tr><td><code>python\\nlist(map(lambda x: x*2, [1,2,3]))\\n<\/code><\/td><td>[2,4,6]<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Ograniczenia:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>tylko jedno wyra\u017cenie<\/li>\n\n\n\n<li>brak instrukcji (if\/for w klasycznej formie)<\/li>\n\n\n\n<li>trudniejsza czytelno\u015b\u0107 przy z\u0142o\u017conych operacjach<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">W praktyce lambda sprawdza si\u0119 w kr\u00f3tkich transformacjach.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"rekurencja-jako-alternatywa-dla-iteracji-i-jej-koszt-obliczeniowy-w-pythonie\">Rekurencja jako alternatywa dla iteracji i jej koszt obliczeniowy w Pythonie<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Rekurencja polega na wywo\u0142ywaniu funkcji przez sam\u0105 siebie. W Pythonie ma ograniczenie g\u0142\u0119boko\u015bci (~1000 wywo\u0142a\u0144 domy\u015blnie).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"przyklad-silni\">Przyk\u0142ad silni<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>J\u0119zyk<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>Python<\/td><td><code>python\\ndef silnia(n):\\n if n == 0:\\n return 1\\n return n * silnia(n-1)\\n<\/code><\/td><\/tr><tr><td>C<\/td><td><code>c\\nint silnia(int n) {\\n if(n==0) return 1;\\n return n * silnia(n-1);\\n}\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Rekurencja jest czytelna, ale:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>wolniejsza (narzut wywo\u0142a\u0144)<\/li>\n\n\n\n<li>ryzyko stack overflow<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Iteracja jest cz\u0119sto bezpieczniejsza.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"typowe-bledy-i-pulapki-przy-pracy-z-funkcjami-w-pythonie\">Typowe b\u0142\u0119dy i pu\u0142apki przy pracy z funkcjami w Pythonie<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Mutable default arguments<\/strong><\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Kod<\/th><th>Problem<\/th><\/tr><\/thead><tbody><tr><td><code>python\\ndef f(lista=[]):\\n lista.append(1)\\n return lista\\n<\/code><\/td><td>lista wsp\u00f3\u0142dzielona mi\u0119dzy wywo\u0142aniami<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Poprawnie:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Kod<\/th><th>Rozwi\u0105zanie<\/th><\/tr><\/thead><tbody><tr><td><code>python\\ndef f(lista=None):\\n if lista is None:\\n lista = []\\n<\/code><\/td><td>nowa lista<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>Brak return<\/strong><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Funkcja bez <code>return<\/code> zwraca <code>None<\/code>, co cz\u0119sto prowadzi do b\u0142\u0119d\u00f3w:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">x = f() + 1  # b\u0142\u0105d je\u015bli f() zwraca None<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>Nadpisywanie nazw funkcji<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">len = 5<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">psuje dost\u0119p do funkcji wbudowanej.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"faq\">FAQ<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Czy funkcja musi zawsze co\u015b zwraca\u0107?<\/strong><br>Nie, brak <code>return<\/code> oznacza zwr\u00f3cenie <code>None<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Czy Python przekazuje argumenty przez referencj\u0119?<\/strong><br>Nie dok\u0142adnie; przekazuje referencj\u0119 do obiektu, ale przypisania s\u0105 lokalne.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Czy mo\u017cna zwr\u00f3ci\u0107 wi\u0119cej ni\u017c jedn\u0105 warto\u015b\u0107?<\/strong><br>Tak, poprzez krotk\u0119.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Kiedy u\u017cywa\u0107 lambda zamiast def?<\/strong><br>Gdy funkcja jest bardzo prosta i jednorazowa.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Dlaczego mutable default argument to problem?<\/strong><br>Bo obiekt jest tworzony tylko raz i wsp\u00f3\u0142dzielony mi\u0119dzy wywo\u0142aniami.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Czy rekurencja jest dobra w Pythonie?<\/strong><br>Do prostych przypadk\u00f3w tak, ale dla du\u017cych danych lepiej u\u017cywa\u0107 iteracji.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"zakonczenie\">Zako\u0144czenie<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Funkcje stanowi\u0105 fundament organizacji kodu i bez ich poprawnego zrozumienia trudno pisa\u0107 wi\u0119ksze programy bez chaosu. W Pythonie ich prostota jest pozorna \u2014 pod spodem kryj\u0105 si\u0119 mechanizmy, kt\u00f3re w realnych projektach cz\u0119sto decyduj\u0105 o stabilno\u015bci i przewidywalno\u015bci dzia\u0142ania programu.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>\u0179r\u00f3d\u0142o Foto: Freepik<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Programowanie bez wyodr\u0119bniania powtarzalnych fragment\u00f3w szybko prowadzi do chaosu: kod ro\u015bnie, trudniej go testowa\u0107, a drobna zmiana w jednym miejscu wymaga r\u0119cznych poprawek w kilku innych. Mechanizm funkcji rozwi\u0105zuje ten problem przez wprowadzenie lokalnych blok\u00f3w logiki z jasno okre\u015blonym wej\u015bciem i wyj\u015bciem. W praktyce oznacza to mniejsze ryzyko b\u0142\u0119d\u00f3w, \u0142atwiejsze debugowanie i mo\u017cliwo\u015b\u0107 ponownego u\u017cycia kodu bez kopiowania. W j\u0119zyku Python ten mechanizm jest prosty sk\u0142adniowo, ale kryje sporo subtelno\u015bci zwi\u0105zanych z przekazywaniem argument\u00f3w, zakresem zmiennych i obiektowym modelem danych, co dobrze wida\u0107, gdy analizuje si\u0119 Funkcje Python. Funkcje Python jako podstawowy mechanizm organizacji kodu i redukcji powt\u00f3rze\u0144 w projektach Funkcja to blok instrukcji oznaczony nazw\u0105, kt\u00f3ry mo\u017cna wywo\u0142a\u0107 wielokrotnie z r\u00f3\u017cnymi danymi wej\u015bciowymi. W Pythonie funkcje s\u0105 obiektami pierwszej klasy, co oznacza, \u017ce mo\u017cna je przypisywa\u0107 do zmiennych, przekazywa\u0107 jako argumenty i zwraca\u0107 z innych funkcji. Najprostsza funkcja przyjmuje dane wej\u015bciowe, przetwarza je i zwraca wynik. W praktyce funkcja mo\u017ce nie zwraca\u0107 nic (implicitnie None), ale i tak pe\u0142ni rol\u0119 logicznego wydzielenia operacji. Przyk\u0142ady definicji funkcji J\u0119zyk Kod Python python\\ndef suma(a, b):\\n return a + b\\n C c\\nint suma(int a, int b) {\\n return a + b;\\n}\\n C++ cpp\\nint suma(int a, int b) {\\n return a + b;\\n}\\n Istotna r\u00f3\u017cnica: Python nie wymaga deklarowania typ\u00f3w, co przyspiesza pisanie, ale zwi\u0119ksza ryzyko b\u0142\u0119d\u00f3w runtime. Sposoby przekazywania argument\u00f3w do funkcji i konsekwencje mutowalno\u015bci obiekt\u00f3w Python stosuje model \u201epass by object reference\u201d (czasem b\u0142\u0119dnie nazywany \u201epass by value\u201d lub \u201epass by reference\u201d). W praktyce oznacza to, \u017ce funkcja dostaje referencj\u0119 do obiektu, ale nie mo\u017ce zmieni\u0107 samego przypisania poza swoim zakresem. Kluczowa r\u00f3\u017cnica pojawia si\u0119 przy obiektach mutowalnych (listy, s\u0142owniki) i niemutowalnych (int, str, tuple). Przyk\u0142ady zachowania Przypadek Kod Python Efekt Niemutowalny python\\ndef zmien(x):\\n x = x + 1\\n\\nx = 5\\nzmien(x)\\n x nadal 5 Mutowalny python\\ndef dodaj(lista):\\n lista.append(10)\\n\\nl = [1,2]\\ndodaj(l)\\n l = [1,2,10] To jedno z najcz\u0119stszych \u017ar\u00f3de\u0142 b\u0142\u0119d\u00f3w. Programista zak\u0142ada, \u017ce dane s\u0105 kopiowane, a faktycznie s\u0105 modyfikowane w miejscu. Funkcje Python a zakres zmiennych i regu\u0142y LEGB w praktyce dzia\u0142ania interpretera Python stosuje regu\u0142\u0119 LEGB (Local, Enclosing, Global, Built-in), kt\u00f3ra okre\u015bla kolejno\u015b\u0107 wyszukiwania zmiennych. Przyk\u0142ad dzia\u0142ania zakres\u00f3w Kod Wyja\u015bnienie python\\nx = 10\\n\\ndef f():\\n x = 5\\n return x\\n zwraca 5 (lokalne x) python\\nx = 10\\n\\ndef f():\\n return x\\n zwraca 10 (globalne x) Zmienne globalne mo\u017cna modyfikowa\u0107, ale wymaga to u\u017cycia s\u0142owa kluczowego global. Kod Efekt python\\nx = 10\\n\\ndef f():\\n global x\\n x = 20\\n zmienia globalne x Nadu\u017cywanie global prowadzi do trudnych do \u015bledzenia b\u0142\u0119d\u00f3w. Zwracanie warto\u015bci i wielokrotne wyniki poprzez krotki oraz ich rozpakowanie Python pozwala zwraca\u0107 wiele warto\u015bci poprzez krotki. W praktyce nie jest to \u201ewiele zwrot\u00f3w\u201d, tylko jeden obiekt zawieraj\u0105cy kilka element\u00f3w. Przyk\u0142ad Kod Wynik python\\ndef operacje(a, b):\\n return a+b, a-b\\n\\ns, r = operacje(5, 3)\\n s=8, r=2 Pod mask\u0105: return (a+b, a-b) Rozpakowanie dzia\u0142a automatycznie, co upraszcza zapis, ale mo\u017ce prowadzi\u0107 do b\u0142\u0119d\u00f3w, gdy liczba warto\u015bci si\u0119 nie zgadza. Funkcje jako obiekty pierwszej klasy i wykorzystanie ich w bardziej zaawansowanych konstrukcjach Funkcje mo\u017cna przypisywa\u0107 do zmiennych: Kod Efekt python\\ndef f(x):\\n return x*2\\n\\ng = f\\n g dzia\u0142a jak f Mo\u017cna przekazywa\u0107 funkcje jako argumenty: Kod Efekt python\\ndef wykonaj(f, x):\\n return f(x)\\n funkcja wy\u017cszego rz\u0119du To podstawa dla: Funkcje anonimowe lambda i ich ograniczenia w zastosowaniach praktycznych Lambda to skr\u00f3cona forma funkcji: Kod Odpowiednik python\\nlambda x: x+1\\n funkcja jednowierszowa Przyk\u0142ad u\u017cycia: Kod Wynik python\\nlist(map(lambda x: x*2, [1,2,3]))\\n [2,4,6] Ograniczenia: W praktyce lambda sprawdza si\u0119 w kr\u00f3tkich transformacjach. Rekurencja jako alternatywa dla iteracji i jej koszt obliczeniowy w Pythonie Rekurencja polega na wywo\u0142ywaniu funkcji przez sam\u0105 siebie. W Pythonie ma ograniczenie g\u0142\u0119boko\u015bci (~1000 wywo\u0142a\u0144 domy\u015blnie). Przyk\u0142ad silni J\u0119zyk Kod Python python\\ndef silnia(n):\\n if n == 0:\\n return 1\\n return n * silnia(n-1)\\n C c\\nint silnia(int n) {\\n if(n==0) return 1;\\n return n * silnia(n-1);\\n}\\n Rekurencja jest czytelna, ale: Iteracja jest cz\u0119sto bezpieczniejsza. Typowe b\u0142\u0119dy i pu\u0142apki przy pracy z funkcjami w Pythonie Kod Problem python\\ndef f(lista=[]):\\n lista.append(1)\\n return lista\\n lista wsp\u00f3\u0142dzielona mi\u0119dzy wywo\u0142aniami Poprawnie: Kod Rozwi\u0105zanie python\\ndef f(lista=None):\\n if lista is None:\\n lista = []\\n nowa lista Funkcja bez return zwraca None, co cz\u0119sto prowadzi do b\u0142\u0119d\u00f3w: x = f() + 1 # b\u0142\u0105d je\u015bli f() zwraca None len = 5 psuje dost\u0119p do funkcji wbudowanej. FAQ Czy funkcja musi zawsze co\u015b zwraca\u0107?Nie, brak return oznacza zwr\u00f3cenie None. Czy Python przekazuje argumenty przez referencj\u0119?Nie dok\u0142adnie; przekazuje referencj\u0119 do obiektu, ale przypisania s\u0105 lokalne. Czy mo\u017cna zwr\u00f3ci\u0107 wi\u0119cej ni\u017c jedn\u0105 warto\u015b\u0107?Tak, poprzez krotk\u0119. Kiedy u\u017cywa\u0107 lambda zamiast def?Gdy funkcja jest bardzo prosta i jednorazowa. Dlaczego mutable default argument to problem?Bo obiekt jest tworzony tylko raz i wsp\u00f3\u0142dzielony mi\u0119dzy wywo\u0142aniami. Czy rekurencja jest dobra w Pythonie?Do prostych przypadk\u00f3w tak, ale dla du\u017cych danych lepiej u\u017cywa\u0107 iteracji. Zako\u0144czenie Funkcje stanowi\u0105 fundament organizacji kodu i bez ich poprawnego zrozumienia trudno pisa\u0107 wi\u0119ksze programy bez chaosu. W Pythonie ich prostota jest pozorna \u2014 pod spodem kryj\u0105 si\u0119 mechanizmy, kt\u00f3re w realnych projektach cz\u0119sto decyduj\u0105 o stabilno\u015bci i przewidywalno\u015bci dzia\u0142ania programu. \u0179r\u00f3d\u0142o Foto: Freepik<\/p>\n","protected":false},"author":1,"featured_media":1292,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[27],"tags":[],"class_list":["post-1291","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-jezyk-programowania"],"_links":{"self":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1291","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"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=1291"}],"version-history":[{"count":1,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1291\/revisions"}],"predecessor-version":[{"id":1293,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1291\/revisions\/1293"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/media\/1292"}],"wp:attachment":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/media?parent=1291"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/categories?post=1291"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/tags?post=1291"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}