{"id":1497,"date":"2026-04-07T13:46:15","date_gmt":"2026-04-07T11:46:15","guid":{"rendered":"https:\/\/trzykody.pl\/?p=1497"},"modified":"2026-04-25T13:50:52","modified_gmt":"2026-04-25T11:50:52","slug":"map-stosuje-funkcje-do-kazdego-elementu-iterowalnego","status":"publish","type":"post","link":"https:\/\/trzykody.pl\/index.php\/2026\/04\/07\/map-stosuje-funkcje-do-kazdego-elementu-iterowalnego\/","title":{"rendered":"Map \u2013 stosuje funkcj\u0119 do ka\u017cdego elementu iterowalnego"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Przy pracy z danymi bardzo cz\u0119sto pojawia si\u0119 ten sam schemat: mamy list\u0119 warto\u015bci i chcemy wykona\u0107 identyczn\u0105 operacj\u0119 na ka\u017cdym elemencie. Mo\u017ce to by\u0107 konwersja typ\u00f3w, podniesienie liczb do kwadratu, obliczenie podatku, zamiana tekstu na ma\u0142e litery albo przeliczenie jednostek. R\u0119czne pisanie p\u0119tli dzia\u0142a, ale szybko robi si\u0119 powtarzalne i podatne na b\u0142\u0119dy. W takich sytuacjach lepiej u\u017cywa\u0107 podej\u015bcia funkcyjnego, gdzie jasno opisujemy operacj\u0119 zamiast mechaniki iteracji, czyli Map \u2013 stosuje funkcj\u0119 do ka\u017cdego elementu iterowalnego.<\/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=\"#map-stosuje-funkcje-do-kazdego-elementu-iterowalnego-i-eliminuje-reczne-petle-przy-prostych-transformacjach-danych\">Map \u2013 stosuje funkcj\u0119 do ka\u017cdego elementu iterowalnego i eliminuje r\u0119czne p\u0119tle przy prostych transformacjach danych<\/a><ol><li><a href=\"#matematyczny-sens-operacji-transformacji-danych\">Matematyczny sens operacji transformacji danych<\/a><\/li><li><a href=\"#przyklad-w-pythonie\">Przyk\u0142ad w Pythonie<\/a><\/li><li><a href=\"#ten-sam-przyklad-z-funkcja-nazwana\">Ten sam przyk\u0142ad z funkcj\u0105 nazwan\u0105<\/a><\/li><\/ol><\/li><li><a href=\"#praca-na-tekstach-typach-danych-i-danych-wejsciowych-z-plikow\">Praca na tekstach, typach danych i danych wej\u015bciowych z plik\u00f3w<\/a><ol><li><a href=\"#konwersja-tekstu-na-liczby-calkowite\">Konwersja tekstu na liczby ca\u0142kowite<\/a><\/li><li><a href=\"#przyklad-na-napisach\">Przyk\u0142ad na napisach<\/a><\/li><\/ol><\/li><li><a href=\"#map-stosuje-funkcje-do-kazdego-elementu-iterowalnego-wtedy-gdy-wazna-jest-czytelnosc-i-przewidywalnosc-przetwarzania\">Map \u2013 stosuje funkcj\u0119 do ka\u017cdego elementu iterowalnego wtedy, gdy wa\u017cna jest czytelno\u015b\u0107 i przewidywalno\u015b\u0107 przetwarzania<\/a><ol><li><a href=\"#porownanie-z-klasyczna-petla\">Por\u00f3wnanie z klasyczn\u0105 p\u0119tl\u0105<\/a><\/li><li><a href=\"#odpowiednik-w-c\">Odpowiednik w C++<\/a><\/li><li><a href=\"#odpowiednik-w-php\">Odpowiednik w PHP<\/a><\/li><\/ol><\/li><li><a href=\"#laczenie-mapowania-z-filtrowaniem-i-redukcja-danych-w-praktycznych-zadaniach\">\u0141\u0105czenie mapowania z filtrowaniem i redukcj\u0105 danych w praktycznych zadaniach<\/a><ol><li><a href=\"#przyklad-sekwencji-operacji\">Przyk\u0142ad sekwencji operacji<\/a><\/li><\/ol><\/li><li><a href=\"#map-stosuje-funkcje-do-kazdego-elementu-iterowalnego-ale-wymaga-kontroli-typow-pamieci-i-leniwej-ewaluacji\">Map \u2013 stosuje funkcj\u0119 do ka\u017cdego elementu iterowalnego ale wymaga kontroli typ\u00f3w, pami\u0119ci i leniwej ewaluacji<\/a><ol><li><a href=\"#typowy-blad\">Typowy b\u0142\u0105d<\/a><\/li><li><a href=\"#problem-z-czytelnoscia\">Problem z czytelno\u015bci\u0105<\/a><\/li><li><a href=\"#problem-wydajnosci\">Problem wydajno\u015bci<\/a><\/li><\/ol><\/li><li><a href=\"#najczestsze-pulapki-i-bledy-spotykane-podczas-nauki-pracy-z-mapowaniem\">Najcz\u0119stsze pu\u0142apki i b\u0142\u0119dy spotykane podczas nauki pracy z mapowaniem<\/a><\/li><li><a href=\"#faq\">FAQ<\/a><ol><li><a href=\"#czy-mapowanie-jest-szybsze-od-zwyklej-petli\">Czy mapowanie jest szybsze od zwyk\u0142ej p\u0119tli?<\/a><\/li><li><a href=\"#kiedy-lepiej-uzyc-list-comprehension-zamiast-mapowania\">Kiedy lepiej u\u017cy\u0107 list comprehension zamiast mapowania?<\/a><\/li><li><a href=\"#czy-mozna-uzywac-kilku-kolekcji-jednoczesnie\">Czy mo\u017cna u\u017cywa\u0107 kilku kolekcji jednocze\u015bnie?<\/a><\/li><li><a href=\"#czy-mapowanie-zmienia-oryginalna-liste\">Czy mapowanie zmienia oryginaln\u0105 list\u0119?<\/a><\/li><li><a href=\"#czy-w-c-istnieje-odpowiednik-tej-funkcji\">Czy w C istnieje odpowiednik tej funkcji?<\/a><\/li><\/ol><\/li><\/ol><\/nav><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"map-stosuje-funkcje-do-kazdego-elementu-iterowalnego-i-eliminuje-reczne-petle-przy-prostych-transformacjach-danych\">Map \u2013 stosuje funkcj\u0119 do ka\u017cdego elementu iterowalnego i eliminuje r\u0119czne p\u0119tle przy prostych transformacjach danych<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Mechanizm mapowania polega na tym, \u017ce dla ka\u017cdego elementu kolekcji wywo\u0142ywana jest wskazana funkcja, a wynik trafia do nowej struktury danych. Oryginalna kolekcja zwykle pozostaje bez zmian. To wa\u017cne, bo ogranicza skutki uboczne i u\u0142atwia analiz\u0119 kodu.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Najprostszy przyk\u0142ad: lista liczb <code>[1, 2, 3, 4]<\/code>, a celem jest uzyskanie <code>[2, 4, 6, 8]<\/code>. Zamiast pisa\u0107 p\u0119tl\u0119 i r\u0119cznie dodawa\u0107 wyniki do nowej listy, przekazujemy funkcj\u0119 mno\u017c\u0105c\u0105 przez 2.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">W praktyce s\u0105 tu trzy elementy:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>dane wej\u015bciowe &#8211; iterowalny obiekt, np. lista, krotka, zbi\u00f3r<\/li>\n\n\n\n<li>funkcja transformuj\u0105ca &#8211; regu\u0142a przekszta\u0142cenia<\/li>\n\n\n\n<li>wynik &#8211; nowa kolekcja lub iterator<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">To podej\u015bcie jest szczeg\u00f3lnie wygodne tam, gdzie transformacja jest deterministyczna: ten sam argument daje zawsze ten sam wynik.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"matematyczny-sens-operacji-transformacji-danych\">Matematyczny sens operacji transformacji danych<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Formalnie mo\u017cna to zapisa\u0107 jako odwzorowanie funkcji:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Element<\/th><th>Zapis<\/th><\/tr><\/thead><tbody><tr><td>Funkcja<\/td><td><code>f(x) = 2x<\/code><\/td><\/tr><tr><td>Dane wej\u015bciowe<\/td><td><code>X = [1, 2, 3, 4]<\/code><\/td><\/tr><tr><td>Wynik<\/td><td><code>Y = [f(1), f(2), f(3), f(4)] = [2, 4, 6, 8]<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">To samo dzia\u0142a dla tekstu, dat, struktur danych i obiekt\u00f3w. Nie chodzi tylko o liczby.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"przyklad-w-pythonie\">Przyk\u0142ad w Pythonie<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">W Pythonie <code>map()<\/code> zwraca iterator, a nie gotow\u0105 list\u0119. To oznacza leniwe przetwarzanie &#8211; wynik powstaje dopiero podczas odczytu.<\/p>\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\\nliczby = [1, 2, 3, 4]\\nwynik = list(map(lambda x: x * 2, liczby))\\nprint(wynik)\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Wynik:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Operacja<\/th><th>Rezultat<\/th><\/tr><\/thead><tbody><tr><td>mno\u017cenie przez 2<\/td><td><code>[2, 4, 6, 8]<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><code>lambda<\/code> jest tu kr\u00f3tk\u0105 funkcj\u0105 anonimow\u0105. Dla prostych operacji jest wygodna, ale przy bardziej rozbudowanej logice lepiej u\u017cy\u0107 zwyk\u0142ej funkcji nazwanej.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"ten-sam-przyklad-z-funkcja-nazwana\">Ten sam przyk\u0142ad z funkcj\u0105 nazwan\u0105<\/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 podwoj(x):\\n return x * 2\\n\\nliczby = [1, 2, 3, 4]\\nwynik = list(map(podwoj, liczby))\\nprint(wynik)\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Ten zapis jest czytelniejszy podczas debugowania i w wi\u0119kszych projektach.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"praca-na-tekstach-typach-danych-i-danych-wejsciowych-z-plikow\">Praca na tekstach, typach danych i danych wej\u015bciowych z plik\u00f3w<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Najcz\u0119stsze u\u017cycie nie dotyczy liczb, tylko konwersji danych wej\u015bciowych. Klasyczny przypadek: u\u017cytkownik wpisuje liczby jako tekst rozdzielony spacj\u0105.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bez mapowania programista cz\u0119sto robi kilka etap\u00f3w r\u0119cznie. Z mapowaniem mo\u017cna to skr\u00f3ci\u0107 do jednej czytelnej operacji.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"konwersja-tekstu-na-liczby-calkowite\">Konwersja tekstu na liczby ca\u0142kowite<\/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\\ndane = input().split()\\nliczby = list(map(int, dane))\\nprint(liczby)\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Je\u017celi u\u017cytkownik wpisze:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>10 20 30 40<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">wynik b\u0119dzie:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Wej\u015bcie<\/th><th>Wynik<\/th><\/tr><\/thead><tbody><tr><td><code>\"10 20 30 40\"<\/code><\/td><td><code>[10, 20, 30, 40]<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">To jedno z najcz\u0119\u015bciej spotykanych zastosowa\u0144 podczas nauki algorytmiki, zada\u0144 akademickich i programowania konkursowego.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"przyklad-na-napisach\">Przyk\u0142ad na napisach<\/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\\nslowa = [\\\" Ala \\\", \\\" Kot \\\", \\\" Python \\\"]\\nwynik = list(map(str.strip, slowa))\\nprint(wynik)\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Tutaj wykorzystujemy gotow\u0105 funkcj\u0119 <code>str.strip<\/code>, kt\u00f3ra usuwa zb\u0119dne spacje z pocz\u0105tku i ko\u0144ca tekstu.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To wa\u017cna cecha: nie trzeba zawsze pisa\u0107 w\u0142asnej funkcji. Cz\u0119sto wystarczy przekaza\u0107 istniej\u0105c\u0105.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"map-stosuje-funkcje-do-kazdego-elementu-iterowalnego-wtedy-gdy-wazna-jest-czytelnosc-i-przewidywalnosc-przetwarzania\">Map \u2013 stosuje funkcj\u0119 do ka\u017cdego elementu iterowalnego wtedy, gdy wa\u017cna jest czytelno\u015b\u0107 i przewidywalno\u015b\u0107 przetwarzania<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Nie ka\u017cda p\u0119tla powinna zosta\u0107 zamieniona na mapowanie. Dobre u\u017cycie pojawia si\u0119 wtedy, gdy operacja jest czyst\u0105 transformacj\u0105 danych.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Je\u017celi kod ma:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>pobiera\u0107 element<\/li>\n\n\n\n<li>zmienia\u0107 jego warto\u015b\u0107<\/li>\n\n\n\n<li>zwraca\u0107 nowy wynik<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">to mapowanie zwykle ma sens.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Je\u017celi kod:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>modyfikuje stan programu<\/li>\n\n\n\n<li>zapisuje do pliku<\/li>\n\n\n\n<li>wysy\u0142a dane do API<\/li>\n\n\n\n<li>wykonuje logowanie<\/li>\n\n\n\n<li>zale\u017cy od zewn\u0119trznych skutk\u00f3w ubocznych<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">wtedy zwyk\u0142a p\u0119tla bywa lepsza.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To wa\u017cne, bo nadu\u017cywanie podej\u015bcia funkcyjnego cz\u0119sto pogarsza czytelno\u015b\u0107.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"porownanie-z-klasyczna-petla\">Por\u00f3wnanie z klasyczn\u0105 p\u0119tl\u0105<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Styl<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>P\u0119tla<\/td><td><code>python\\nwynik = []\\nfor x in liczby:\\n wynik.append(x * 2)\\n<\/code><\/td><\/tr><tr><td>Mapowanie<\/td><td><code>python\\nwynik = list(map(lambda x: x * 2, liczby))\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Drugi zapis jest kr\u00f3tszy, ale tylko wtedy, gdy operacja jest prosta. Je\u015bli logika zajmuje 10 linii, p\u0119tla mo\u017ce by\u0107 bardziej zrozumia\u0142a.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"odpowiednik-w-c\">Odpowiednik w C++<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">W C++ funkcj\u0119 podobn\u0105 do <code>map()<\/code> pe\u0142ni najcz\u0119\u015bciej <code>std::transform<\/code>.<\/p>\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>C++<\/td><td><code>cpp\\n#include &lt;iostream&gt;\\n#include &lt;vector&gt;\\n#include &lt;algorithm&gt;\\nusing namespace std;\\n\\nint main() {\\n vector&lt;int&gt; liczby = {1, 2, 3, 4};\\n vector&lt;int&gt; wynik(liczby.size());\\n\\n transform(liczby.begin(), liczby.end(), wynik.begin(),\\n [](int x) { return x * 2; });\\n\\n for (int x : wynik)\\n cout &lt;&lt; x &lt;&lt; \\\" \\\";\\n}\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Tutaj tak\u017ce idea jest identyczna: funkcja dzia\u0142a na ka\u017cdym elemencie.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"odpowiednik-w-php\">Odpowiednik w PHP<\/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>PHP<\/td><td><code>php\\n&lt;?php\\n$liczby = [1, 2, 3, 4];\\n$wynik = array_map(function($x) {\\n return $x * 2;\\n}, $liczby);\\n\\nprint_r($wynik);\\n?&gt;\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><code>array_map()<\/code> jest bardzo popularne przy pracy z danymi formularzy i API.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"laczenie-mapowania-z-filtrowaniem-i-redukcja-danych-w-praktycznych-zadaniach\">\u0141\u0105czenie mapowania z filtrowaniem i redukcj\u0105 danych w praktycznych zadaniach<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Rzadko ko\u0144czy si\u0119 na jednej operacji. Zwykle najpierw filtrujemy dane, potem je przekszta\u0142camy, a na ko\u0144cu agregujemy.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ad:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>wybierz liczby dodatnie<\/li>\n\n\n\n<li>podnie\u015b je do kwadratu<\/li>\n\n\n\n<li>policz sum\u0119<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">To ju\u017c przypomina realne przetwarzanie danych.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"przyklad-sekwencji-operacji\">Przyk\u0142ad sekwencji operacji<\/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\\nliczby = [-2, 3, -1, 5, 4]\\n\\ndodatnie = filter(lambda x: x &gt; 0, liczby)\\nkwadraty = map(lambda x: x * x, dodatnie)\\nwynik = sum(kwadraty)\\n\\nprint(wynik)\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Wynik:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Etap<\/th><th>Rezultat<\/th><\/tr><\/thead><tbody><tr><td>liczby dodatnie<\/td><td><code>[3, 5, 4]<\/code><\/td><\/tr><tr><td>kwadraty<\/td><td><code>[9, 25, 16]<\/code><\/td><\/tr><tr><td>suma<\/td><td><code>50<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Taki zapis dobrze pokazuje intencj\u0119 programu. Wida\u0107 nie tylko co robimy, ale te\u017c w jakiej kolejno\u015bci.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"map-stosuje-funkcje-do-kazdego-elementu-iterowalnego-ale-wymaga-kontroli-typow-pamieci-i-leniwej-ewaluacji\">Map \u2013 stosuje funkcj\u0119 do ka\u017cdego elementu iterowalnego ale wymaga kontroli typ\u00f3w, pami\u0119ci i leniwej ewaluacji<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Najcz\u0119stszy b\u0142\u0105d pocz\u0105tkuj\u0105cych to za\u0142o\u017cenie, \u017ce <code>map()<\/code> od razu zwraca list\u0119. W Pythonie tak nie jest &#8211; otrzymujemy iterator.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To oznacza dwie rzeczy:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>dane s\u0105 liczone dopiero przy odczycie<\/li>\n\n\n\n<li>iterator mo\u017cna zu\u017cy\u0107 tylko raz<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"typowy-blad\">Typowy b\u0142\u0105d<\/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\\nwynik = map(int, [\\\"1\\\", \\\"2\\\", \\\"3\\\"])\\nprint(wynik)\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Rezultat nie b\u0119dzie list\u0105, tylko informacj\u0105 o obiekcie iteratora.<\/p>\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>J\u0119zyk<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>Python<\/td><td><code>python\\nwynik = list(map(int, [\\\"1\\\", \\\"2\\\", \\\"3\\\"]))\\nprint(wynik)\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"problem-z-czytelnoscia\">Problem z czytelno\u015bci\u0105<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Zbyt rozbudowane <code>lambda<\/code> s\u0105 trudne w utrzymaniu. Je\u017celi funkcja zaczyna zawiera\u0107 wiele warunk\u00f3w, lepiej j\u0105 wydzieli\u0107.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Z\u0142y kierunek:<\/p>\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\\nmap(lambda x: x * 2 if x &gt; 0 else x - 5 if x &lt; -10 else 0, dane)\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Taki zapis utrudnia analiz\u0119 i zwi\u0119ksza ryzyko b\u0142\u0119du logicznego.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"problem-wydajnosci\">Problem wydajno\u015bci<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Dla ma\u0142ych danych r\u00f3\u017cnica jest zwykle pomijalna. Przy du\u017cych zbiorach iterator daje realn\u0105 oszcz\u0119dno\u015b\u0107 pami\u0119ci.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Lista miliona liczb:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Podej\u015bcie<\/th><th>Charakterystyka<\/th><\/tr><\/thead><tbody><tr><td><code>list(map(...))<\/code><\/td><td>natychmiastowa alokacja ca\u0142ego wyniku<\/td><\/tr><tr><td><code>map(...)<\/code><\/td><td>obliczanie element\u00f3w na \u017c\u0105danie<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Przy przetwarzaniu log\u00f3w, du\u017cych plik\u00f3w CSV i danych z sieci to ma znaczenie.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"najczestsze-pulapki-i-bledy-spotykane-podczas-nauki-pracy-z-mapowaniem\">Najcz\u0119stsze pu\u0142apki i b\u0142\u0119dy spotykane podczas nauki pracy z mapowaniem<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Pierwszy problem to mieszanie transformacji z efektami ubocznymi. <code>map()<\/code> nie s\u0142u\u017cy do drukowania wynik\u00f3w ani do zapisu do bazy.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Drugi problem to \u015blepe u\u017cywanie <code>lambda<\/code>, nawet gdy zwyk\u0142a funkcja by\u0142aby prostsza.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Trzeci problem to brak kontroli typ\u00f3w. Je\u015bli <code>int()<\/code> trafi na tekst <code>\"abc\"<\/code>, program zako\u0144czy si\u0119 b\u0142\u0119dem <code>ValueError<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Czwarty problem to zak\u0142adanie, \u017ce ka\u017cda p\u0119tla powinna zosta\u0107 zast\u0105piona stylem funkcyjnym. Nie powinna. Czytelno\u015b\u0107 jest wa\u017cniejsza ni\u017c skr\u00f3cenie kodu o dwie linie.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pi\u0105ty problem to zu\u017cycie iteratora. Je\u015bli raz przejdziemy po obiekcie <code>map<\/code>, drugi odczyt mo\u017ce zwr\u00f3ci\u0107 pusty wynik.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"faq\">FAQ<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-mapowanie-jest-szybsze-od-zwyklej-petli\">Czy mapowanie jest szybsze od zwyk\u0142ej p\u0119tli?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Nie zawsze. Dla prostych operacji r\u00f3\u017cnice bywaj\u0105 ma\u0142e. Cz\u0119sto wa\u017cniejsza jest czytelno\u015b\u0107 kodu ni\u017c sama szybko\u015b\u0107. W CPython niekt\u00f3re operacje wbudowane mog\u0105 dzia\u0142a\u0107 wydajniej, ale nie jest to regu\u0142a absolutna.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"kiedy-lepiej-uzyc-list-comprehension-zamiast-mapowania\">Kiedy lepiej u\u017cy\u0107 list comprehension zamiast mapowania?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">W Pythonie zapis:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">[x * 2 for x in liczby]<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">cz\u0119sto jest bardziej czytelny ni\u017c <code>map()<\/code>, szczeg\u00f3lnie dla prostych transformacji. <code>map()<\/code> bywa wygodniejsze przy u\u017cyciu gotowych funkcji, np. <code>int<\/code>, <code>float<\/code>, <code>str.strip<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-mozna-uzywac-kilku-kolekcji-jednoczesnie\">Czy mo\u017cna u\u017cywa\u0107 kilku kolekcji jednocze\u015bnie?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Tak. <code>map()<\/code> mo\u017ce przyjmowa\u0107 wi\u0119cej ni\u017c jeden iterowalny obiekt, je\u015bli funkcja oczekuje wielu argument\u00f3w.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-mapowanie-zmienia-oryginalna-liste\">Czy mapowanie zmienia oryginaln\u0105 list\u0119?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Standardowo nie. Powstaje nowy wynik. To zmniejsza ryzyko przypadkowego uszkodzenia danych wej\u015bciowych.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-w-c-istnieje-odpowiednik-tej-funkcji\">Czy w C istnieje odpowiednik tej funkcji?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Nie jako standardowa funkcja biblioteczna wprost. Najcz\u0119\u015bciej stosuje si\u0119 zwyk\u0142\u0105 p\u0119tl\u0119 lub w\u0142asne funkcje z wska\u017anikami na funkcje.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mapowanie jest proste dopiero wtedy, gdy rozumie si\u0119 jego granice. Samo skr\u00f3cenie kodu nie jest celem. Celem jest przewidywalne przetwarzanie danych, mniejsza liczba b\u0142\u0119d\u00f3w i \u0142atwiejsza analiza programu po kilku miesi\u0105cach. Je\u015bli transformacja jest jasna i powtarzalna, ten mechanizm zwykle daje lepszy rezultat ni\u017c r\u0119cznie pisana p\u0119tla.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>\u0179r\u00f3d\u0142o Foto: Freepik<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Przy pracy z danymi bardzo cz\u0119sto pojawia si\u0119 ten sam schemat: mamy list\u0119 warto\u015bci i chcemy wykona\u0107 identyczn\u0105 operacj\u0119 na ka\u017cdym elemencie. Mo\u017ce to by\u0107 konwersja typ\u00f3w, podniesienie liczb do kwadratu, obliczenie podatku, zamiana tekstu na ma\u0142e litery albo przeliczenie jednostek. R\u0119czne pisanie p\u0119tli dzia\u0142a, ale szybko robi si\u0119 powtarzalne i podatne na b\u0142\u0119dy. W takich sytuacjach lepiej u\u017cywa\u0107 podej\u015bcia funkcyjnego, gdzie jasno opisujemy operacj\u0119 zamiast mechaniki iteracji, czyli Map \u2013 stosuje funkcj\u0119 do ka\u017cdego elementu iterowalnego. Map \u2013 stosuje funkcj\u0119 do ka\u017cdego elementu iterowalnego i eliminuje r\u0119czne p\u0119tle przy prostych transformacjach danych Mechanizm mapowania polega na tym, \u017ce dla ka\u017cdego elementu kolekcji wywo\u0142ywana jest wskazana funkcja, a wynik trafia do nowej struktury danych. Oryginalna kolekcja zwykle pozostaje bez zmian. To wa\u017cne, bo ogranicza skutki uboczne i u\u0142atwia analiz\u0119 kodu. Najprostszy przyk\u0142ad: lista liczb [1, 2, 3, 4], a celem jest uzyskanie [2, 4, 6, 8]. Zamiast pisa\u0107 p\u0119tl\u0119 i r\u0119cznie dodawa\u0107 wyniki do nowej listy, przekazujemy funkcj\u0119 mno\u017c\u0105c\u0105 przez 2. W praktyce s\u0105 tu trzy elementy: To podej\u015bcie jest szczeg\u00f3lnie wygodne tam, gdzie transformacja jest deterministyczna: ten sam argument daje zawsze ten sam wynik. Matematyczny sens operacji transformacji danych Formalnie mo\u017cna to zapisa\u0107 jako odwzorowanie funkcji: Element Zapis Funkcja f(x) = 2x Dane wej\u015bciowe X = [1, 2, 3, 4] Wynik Y = [f(1), f(2), f(3), f(4)] = [2, 4, 6, 8] To samo dzia\u0142a dla tekstu, dat, struktur danych i obiekt\u00f3w. Nie chodzi tylko o liczby. Przyk\u0142ad w Pythonie W Pythonie map() zwraca iterator, a nie gotow\u0105 list\u0119. To oznacza leniwe przetwarzanie &#8211; wynik powstaje dopiero podczas odczytu. J\u0119zyk Kod Python python\\nliczby = [1, 2, 3, 4]\\nwynik = list(map(lambda x: x * 2, liczby))\\nprint(wynik)\\n Wynik: Operacja Rezultat mno\u017cenie przez 2 [2, 4, 6, 8] lambda jest tu kr\u00f3tk\u0105 funkcj\u0105 anonimow\u0105. Dla prostych operacji jest wygodna, ale przy bardziej rozbudowanej logice lepiej u\u017cy\u0107 zwyk\u0142ej funkcji nazwanej. Ten sam przyk\u0142ad z funkcj\u0105 nazwan\u0105 J\u0119zyk Kod Python python\\ndef podwoj(x):\\n return x * 2\\n\\nliczby = [1, 2, 3, 4]\\nwynik = list(map(podwoj, liczby))\\nprint(wynik)\\n Ten zapis jest czytelniejszy podczas debugowania i w wi\u0119kszych projektach. Praca na tekstach, typach danych i danych wej\u015bciowych z plik\u00f3w Najcz\u0119stsze u\u017cycie nie dotyczy liczb, tylko konwersji danych wej\u015bciowych. Klasyczny przypadek: u\u017cytkownik wpisuje liczby jako tekst rozdzielony spacj\u0105. Bez mapowania programista cz\u0119sto robi kilka etap\u00f3w r\u0119cznie. Z mapowaniem mo\u017cna to skr\u00f3ci\u0107 do jednej czytelnej operacji. Konwersja tekstu na liczby ca\u0142kowite J\u0119zyk Kod Python python\\ndane = input().split()\\nliczby = list(map(int, dane))\\nprint(liczby)\\n Je\u017celi u\u017cytkownik wpisze: 10 20 30 40 wynik b\u0119dzie: Wej\u015bcie Wynik &#8222;10 20 30 40&#8243; [10, 20, 30, 40] To jedno z najcz\u0119\u015bciej spotykanych zastosowa\u0144 podczas nauki algorytmiki, zada\u0144 akademickich i programowania konkursowego. Przyk\u0142ad na napisach J\u0119zyk Kod Python python\\nslowa = [\\&#8221; Ala \\&#8221;, \\&#8221; Kot \\&#8221;, \\&#8221; Python \\&#8221;]\\nwynik = list(map(str.strip, slowa))\\nprint(wynik)\\n Tutaj wykorzystujemy gotow\u0105 funkcj\u0119 str.strip, kt\u00f3ra usuwa zb\u0119dne spacje z pocz\u0105tku i ko\u0144ca tekstu. To wa\u017cna cecha: nie trzeba zawsze pisa\u0107 w\u0142asnej funkcji. Cz\u0119sto wystarczy przekaza\u0107 istniej\u0105c\u0105. Map \u2013 stosuje funkcj\u0119 do ka\u017cdego elementu iterowalnego wtedy, gdy wa\u017cna jest czytelno\u015b\u0107 i przewidywalno\u015b\u0107 przetwarzania Nie ka\u017cda p\u0119tla powinna zosta\u0107 zamieniona na mapowanie. Dobre u\u017cycie pojawia si\u0119 wtedy, gdy operacja jest czyst\u0105 transformacj\u0105 danych. Je\u017celi kod ma: to mapowanie zwykle ma sens. Je\u017celi kod: wtedy zwyk\u0142a p\u0119tla bywa lepsza. To wa\u017cne, bo nadu\u017cywanie podej\u015bcia funkcyjnego cz\u0119sto pogarsza czytelno\u015b\u0107. Por\u00f3wnanie z klasyczn\u0105 p\u0119tl\u0105 Styl Kod P\u0119tla python\\nwynik = []\\nfor x in liczby:\\n wynik.append(x * 2)\\n Mapowanie python\\nwynik = list(map(lambda x: x * 2, liczby))\\n Drugi zapis jest kr\u00f3tszy, ale tylko wtedy, gdy operacja jest prosta. Je\u015bli logika zajmuje 10 linii, p\u0119tla mo\u017ce by\u0107 bardziej zrozumia\u0142a. Odpowiednik w C++ W C++ funkcj\u0119 podobn\u0105 do map() pe\u0142ni najcz\u0119\u015bciej std::transform. J\u0119zyk Kod C++ cpp\\n#include &lt;iostream&gt;\\n#include &lt;vector&gt;\\n#include &lt;algorithm&gt;\\nusing namespace std;\\n\\nint main() {\\n vector&lt;int&gt; liczby = {1, 2, 3, 4};\\n vector&lt;int&gt; wynik(liczby.size());\\n\\n transform(liczby.begin(), liczby.end(), wynik.begin(),\\n [](int x) { return x * 2; });\\n\\n for (int x : wynik)\\n cout &lt;&lt; x &lt;&lt; \\&#8221; \\&#8221;;\\n}\\n Tutaj tak\u017ce idea jest identyczna: funkcja dzia\u0142a na ka\u017cdym elemencie. Odpowiednik w PHP J\u0119zyk Kod PHP php\\n&lt;?php\\n$liczby = [1, 2, 3, 4];\\n$wynik = array_map(function($x) {\\n return $x * 2;\\n}, $liczby);\\n\\nprint_r($wynik);\\n?&gt;\\n array_map() jest bardzo popularne przy pracy z danymi formularzy i API. \u0141\u0105czenie mapowania z filtrowaniem i redukcj\u0105 danych w praktycznych zadaniach Rzadko ko\u0144czy si\u0119 na jednej operacji. Zwykle najpierw filtrujemy dane, potem je przekszta\u0142camy, a na ko\u0144cu agregujemy. Przyk\u0142ad: To ju\u017c przypomina realne przetwarzanie danych. Przyk\u0142ad sekwencji operacji J\u0119zyk Kod Python python\\nliczby = [-2, 3, -1, 5, 4]\\n\\ndodatnie = filter(lambda x: x &gt; 0, liczby)\\nkwadraty = map(lambda x: x * x, dodatnie)\\nwynik = sum(kwadraty)\\n\\nprint(wynik)\\n Wynik: Etap Rezultat liczby dodatnie [3, 5, 4] kwadraty [9, 25, 16] suma 50 Taki zapis dobrze pokazuje intencj\u0119 programu. Wida\u0107 nie tylko co robimy, ale te\u017c w jakiej kolejno\u015bci. Map \u2013 stosuje funkcj\u0119 do ka\u017cdego elementu iterowalnego ale wymaga kontroli typ\u00f3w, pami\u0119ci i leniwej ewaluacji Najcz\u0119stszy b\u0142\u0105d pocz\u0105tkuj\u0105cych to za\u0142o\u017cenie, \u017ce map() od razu zwraca list\u0119. W Pythonie tak nie jest &#8211; otrzymujemy iterator. To oznacza dwie rzeczy: Typowy b\u0142\u0105d J\u0119zyk Kod Python python\\nwynik = map(int, [\\&#8221;1\\&#8221;, \\&#8221;2\\&#8221;, \\&#8221;3\\&#8221;])\\nprint(wynik)\\n Rezultat nie b\u0119dzie list\u0105, tylko informacj\u0105 o obiekcie iteratora. Poprawnie: J\u0119zyk Kod Python python\\nwynik = list(map(int, [\\&#8221;1\\&#8221;, \\&#8221;2\\&#8221;, \\&#8221;3\\&#8221;]))\\nprint(wynik)\\n Problem z czytelno\u015bci\u0105 Zbyt rozbudowane lambda s\u0105 trudne w utrzymaniu. Je\u017celi funkcja zaczyna zawiera\u0107 wiele warunk\u00f3w, lepiej j\u0105 wydzieli\u0107. Z\u0142y kierunek: J\u0119zyk Kod Python python\\nmap(lambda x: x * 2 if x &gt; 0 else x &#8211; 5 if x &lt; -10 else 0, dane)\\n Taki zapis utrudnia analiz\u0119 i zwi\u0119ksza ryzyko b\u0142\u0119du logicznego. Problem wydajno\u015bci Dla ma\u0142ych danych r\u00f3\u017cnica jest zwykle pomijalna. Przy du\u017cych zbiorach iterator daje realn\u0105 oszcz\u0119dno\u015b\u0107 pami\u0119ci. Lista miliona liczb: Podej\u015bcie Charakterystyka list(map(&#8230;)) natychmiastowa alokacja ca\u0142ego wyniku map(&#8230;) obliczanie element\u00f3w na \u017c\u0105danie Przy przetwarzaniu log\u00f3w, du\u017cych plik\u00f3w CSV i danych z sieci to ma znaczenie. Najcz\u0119stsze pu\u0142apki i b\u0142\u0119dy spotykane podczas nauki pracy z mapowaniem Pierwszy problem to mieszanie transformacji z efektami ubocznymi. map() nie s\u0142u\u017cy do drukowania wynik\u00f3w ani do zapisu do bazy. Drugi problem to \u015blepe u\u017cywanie lambda, nawet gdy zwyk\u0142a funkcja by\u0142aby prostsza. Trzeci problem to brak kontroli typ\u00f3w. Je\u015bli int() trafi na tekst &#8222;abc&#8221;, program zako\u0144czy si\u0119 b\u0142\u0119dem ValueError. Czwarty problem to zak\u0142adanie, \u017ce ka\u017cda p\u0119tla powinna zosta\u0107 zast\u0105piona stylem funkcyjnym. Nie powinna. Czytelno\u015b\u0107 jest wa\u017cniejsza ni\u017c skr\u00f3cenie kodu o dwie linie. Pi\u0105ty problem to zu\u017cycie iteratora. Je\u015bli raz przejdziemy po obiekcie map, drugi odczyt mo\u017ce zwr\u00f3ci\u0107 pusty wynik. FAQ Czy mapowanie jest szybsze od zwyk\u0142ej p\u0119tli? Nie zawsze. Dla prostych operacji r\u00f3\u017cnice bywaj\u0105 ma\u0142e. Cz\u0119sto wa\u017cniejsza jest czytelno\u015b\u0107 kodu ni\u017c sama szybko\u015b\u0107. W CPython niekt\u00f3re operacje wbudowane mog\u0105 dzia\u0142a\u0107 wydajniej, ale nie jest to regu\u0142a absolutna. Kiedy lepiej u\u017cy\u0107 list comprehension zamiast mapowania? W Pythonie zapis: [x * 2 for x in liczby] cz\u0119sto jest bardziej czytelny ni\u017c map(), szczeg\u00f3lnie dla prostych transformacji. map() bywa wygodniejsze przy u\u017cyciu gotowych funkcji, np. int, float, str.strip. Czy mo\u017cna u\u017cywa\u0107 kilku kolekcji jednocze\u015bnie? Tak. map() mo\u017ce przyjmowa\u0107 wi\u0119cej ni\u017c jeden iterowalny obiekt, je\u015bli funkcja oczekuje wielu argument\u00f3w. Czy mapowanie zmienia oryginaln\u0105 list\u0119? Standardowo nie. Powstaje nowy wynik. To zmniejsza ryzyko przypadkowego uszkodzenia danych wej\u015bciowych. Czy w C istnieje odpowiednik tej funkcji? Nie jako standardowa funkcja biblioteczna wprost. Najcz\u0119\u015bciej stosuje si\u0119 zwyk\u0142\u0105 p\u0119tl\u0119 lub w\u0142asne funkcje z wska\u017anikami na funkcje. Mapowanie jest proste dopiero wtedy, gdy rozumie si\u0119 jego granice. Samo skr\u00f3cenie kodu nie jest celem. Celem jest przewidywalne przetwarzanie danych, mniejsza liczba b\u0142\u0119d\u00f3w i \u0142atwiejsza analiza programu po kilku miesi\u0105cach. Je\u015bli transformacja jest jasna i powtarzalna, ten mechanizm zwykle daje lepszy rezultat ni\u017c r\u0119cznie pisana p\u0119tla. \u0179r\u00f3d\u0142o Foto: Freepik<\/p>\n","protected":false},"author":1,"featured_media":1498,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[27],"tags":[],"class_list":["post-1497","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\/1497","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=1497"}],"version-history":[{"count":1,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1497\/revisions"}],"predecessor-version":[{"id":1499,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1497\/revisions\/1499"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/media\/1498"}],"wp:attachment":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/media?parent=1497"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/categories?post=1497"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/tags?post=1497"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}