{"id":1439,"date":"2026-03-31T14:03:45","date_gmt":"2026-03-31T12:03:45","guid":{"rendered":"https:\/\/trzykody.pl\/?p=1439"},"modified":"2026-04-21T14:08:48","modified_gmt":"2026-04-21T12:08:48","slug":"enumerate-dodaje-indeksy-do-elementow-iterowalnych-podczas-iteracji","status":"publish","type":"post","link":"https:\/\/trzykody.pl\/index.php\/2026\/03\/31\/enumerate-dodaje-indeksy-do-elementow-iterowalnych-podczas-iteracji\/","title":{"rendered":"Enumerate \u2013 dodaje indeksy do element\u00f3w iterowalnych podczas iteracji"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Praca z kolekcjami danych bardzo szybko prowadzi do sytuacji, w kt\u00f3rej sama warto\u015b\u0107 elementu nie wystarcza. Trzeba jeszcze wiedzie\u0107, na kt\u00f3rej pozycji si\u0119 znajduje: numer wiersza, indeks b\u0142\u0119du, miejsce w rankingu albo kolejno\u015b\u0107 przetwarzania. R\u0119czne zwi\u0119kszanie licznika dzia\u0142a, ale \u0142atwo wtedy o pomy\u0142k\u0119, zw\u0142aszcza przy zagnie\u017cd\u017conych p\u0119tlach albo filtrowaniu danych. W codziennej pracy z listami, krotkami i napisami naturalnym rozwi\u0105zaniem staje si\u0119 <strong>enumerate <\/strong>\u2013 dodaje indeksy do element\u00f3w iterowalnych podczas 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><a href=\"#enumerate-dodaje-indeksy-do-elementow-iterowalnych-podczas-iteracji-i-eliminuje-reczne-zarzadzanie-licznikiem-w-petli\">enumerate \u2013 dodaje indeksy do element\u00f3w iterowalnych podczas iteracji i eliminuje r\u0119czne zarz\u0105dzanie licznikiem w p\u0119tli<\/a><ol><li><a href=\"#podstawowa-skladnia-i-parametry\">Podstawowa sk\u0142adnia i parametry<\/a><\/li><li><a href=\"#prosty-przyklad-w-pythonie\">Prosty przyk\u0142ad w Pythonie<\/a><\/li><\/ol><\/li><li><a href=\"#enumerate-dodaje-indeksy-do-elementow-iterowalnych-podczas-iteracji-takze-dla-napisow-krotek-i-danych-wejsciowych\">enumerate \u2013 dodaje indeksy do element\u00f3w iterowalnych podczas iteracji tak\u017ce dla napis\u00f3w, krotek i danych wej\u015bciowych<\/a><ol><li><a href=\"#iteracja-po-napisie\">Iteracja po napisie<\/a><\/li><li><a href=\"#iteracja-po-pliku\">Iteracja po pliku<\/a><\/li><li><a href=\"#slowniki-i-ostroznosc\">S\u0142owniki i ostro\u017cno\u015b\u0107<\/a><\/li><\/ol><\/li><li><a href=\"#enumerate-dodaje-indeksy-do-elementow-iterowalnych-podczas-iteracji-a-podobne-rozwiazania-w-c-i-c\">enumerate \u2013 dodaje indeksy do element\u00f3w iterowalnych podczas iteracji a podobne rozwi\u0105zania w C i C++<\/a><ol><li><a href=\"#przyklad-w-c\">Przyk\u0142ad w C<\/a><\/li><li><a href=\"#przyklad-w-c-1\">Przyk\u0142ad w C++<\/a><\/li><li><a href=\"#gdzie-to-naprawde-oszczedza-czas\">Gdzie to naprawd\u0119 oszcz\u0119dza czas<\/a><\/li><\/ol><\/li><li><a href=\"#typowe-pulapki-i-bledy-ktore-pojawiaja-sie-najczesciej\">Typowe pu\u0142apki i b\u0142\u0119dy, kt\u00f3re pojawiaj\u0105 si\u0119 najcz\u0119\u015bciej<\/a><ol><li><a href=\"#nadpisanie-nazwy-funkcji\">Nadpisanie nazwy funkcji<\/a><\/li><li><a href=\"#niepotrzebne-uzywanie-range-len\">Niepotrzebne u\u017cywanie range(len())<\/a><\/li><li><a href=\"#zly-start-indeksowania\">Z\u0142y start indeksowania<\/a><\/li><\/ol><\/li><li><a href=\"#krotkie-zaleznosci-z-innymi-narzedziami-pythona\">Kr\u00f3tkie zale\u017cno\u015bci z innymi narz\u0119dziami Pythona<\/a><\/li><li><a href=\"#faq\">FAQ<\/a><ol><li><a href=\"#czy-funkcja-dziala-tylko-dla-list\">Czy funkcja dzia\u0142a tylko dla list?<\/a><\/li><li><a href=\"#czy-indeks-zawsze-zaczyna-sie-od-zera\">Czy indeks zawsze zaczyna si\u0119 od zera?<\/a><\/li><li><a href=\"#czy-enumerate-jest-szybsze-niz-reczny-licznik\">Czy enumerate() jest szybsze ni\u017c r\u0119czny licznik?<\/a><\/li><li><a href=\"#kiedy-lepiej-uzyc-range-len\">Kiedy lepiej u\u017cy\u0107 range(len())?<\/a><\/li><li><a href=\"#czy-mozna-uzywac-tego-w-duzych-plikach\">Czy mo\u017cna u\u017cywa\u0107 tego w du\u017cych plikach?<\/a><\/li><li><a href=\"#czy-dziala-ze-slownikami\">Czy dzia\u0142a ze s\u0142ownikami?<\/a><\/li><\/ol><\/li><\/ol><\/nav><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"enumerate-dodaje-indeksy-do-elementow-iterowalnych-podczas-iteracji-i-eliminuje-reczne-zarzadzanie-licznikiem-w-petli\">enumerate \u2013 dodaje indeksy do element\u00f3w iterowalnych podczas iteracji i eliminuje r\u0119czne zarz\u0105dzanie licznikiem w p\u0119tli<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Funkcja <code>enumerate()<\/code> w Pythonie zwraca obiekt iterowalny, kt\u00f3ry podczas przechodzenia po danych dostarcza par\u0119:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>indeks<\/li>\n\n\n\n<li>warto\u015b\u0107 elementu<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Zamiast pisa\u0107 osobny licznik:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">i = 0<br>for element in lista:<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">mo\u017cna od razu pobra\u0107 obie informacje w jednej konstrukcji:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">for i, element in enumerate(lista):<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">To rozwi\u0105zanie jest prostsze, czytelniejsze i bezpieczniejsze.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Najwa\u017cniejsze jest to, \u017ce <code>enumerate()<\/code> nie kopiuje ca\u0142ej listy. Zwraca iterator, wi\u0119c dzia\u0142a oszcz\u0119dnie pami\u0119ciowo. Przy ma\u0142ych danych nie ma to du\u017cego znaczenia, ale przy tysi\u0105cach lub milionach rekord\u00f3w r\u00f3\u017cnica jest ju\u017c realna.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">W praktyce u\u017cywa si\u0119 tego mi\u0119dzy innymi przy:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>wy\u015bwietlaniu numerowanych list<\/li>\n\n\n\n<li>analizie plik\u00f3w tekstowych linia po linii<\/li>\n\n\n\n<li>raportowaniu b\u0142\u0119d\u00f3w z numerem pozycji<\/li>\n\n\n\n<li>walidacji danych wej\u015bciowych<\/li>\n\n\n\n<li>przetwarzaniu CSV<\/li>\n\n\n\n<li>pracy z logami systemowymi<\/li>\n\n\n\n<li>debugowaniu algorytm\u00f3w<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"podstawowa-skladnia-i-parametry\">Podstawowa sk\u0142adnia i parametry<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Sk\u0142adnia wygl\u0105da tak:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Element<\/th><th>Opis<\/th><\/tr><\/thead><tbody><tr><td><code>enumerate(iterable)<\/code><\/td><td>indeksowanie od 0<\/td><\/tr><tr><td><code>enumerate(iterable, start=1)<\/code><\/td><td>indeksowanie od wskazanej warto\u015bci<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Drugi parametr jest bardzo wa\u017cny. Domy\u015blnie indeks zaczyna si\u0119 od <code>0<\/code>, co jest naturalne dla programowania, ale nie zawsze wygodne dla u\u017cytkownika ko\u0144cowego.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Lista pozycji w menu zwykle zaczyna si\u0119 od <code>1<\/code>, nie od <code>0<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"prosty-przyklad-w-pythonie\">Prosty przyk\u0142ad w Pythonie<\/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>lista = [\"Ala\", \"Ola\", \"Jan\"]<\/code><br><br><code>for indeks, imie in enumerate(lista):<\/code><br>&nbsp;&nbsp;&nbsp;&nbsp;<code>print(indeks, imie)<\/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>Indeks<\/th><th>Warto\u015b\u0107<\/th><\/tr><\/thead><tbody><tr><td>0<\/td><td>Ala<\/td><\/tr><tr><td>1<\/td><td>Ola<\/td><\/tr><tr><td>2<\/td><td>Jan<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ad z numeracj\u0105 od 1:<\/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>for nr, imie in enumerate(lista, start=1):<\/code><br>&nbsp;&nbsp;&nbsp;&nbsp;<code>print(nr, imie)<\/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>Numer<\/th><th>Warto\u015b\u0107<\/th><\/tr><\/thead><tbody><tr><td>1<\/td><td>Ala<\/td><\/tr><tr><td>2<\/td><td>Ola<\/td><\/tr><tr><td>3<\/td><td>Jan<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">To drobna zmiana, ale w aplikacjach u\u017cytkowych bardzo potrzebna.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"enumerate-dodaje-indeksy-do-elementow-iterowalnych-podczas-iteracji-takze-dla-napisow-krotek-i-danych-wejsciowych\">enumerate \u2013 dodaje indeksy do element\u00f3w iterowalnych podczas iteracji tak\u017ce dla napis\u00f3w, krotek i danych wej\u015bciowych<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Wiele os\u00f3b kojarzy t\u0119 funkcj\u0119 wy\u0142\u0105cznie z listami, ale dzia\u0142a ona dla ka\u017cdego obiektu iterowalnego.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To oznacza:<\/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>s\u0142owniki (po odpowiednim u\u017cyciu)<\/li>\n\n\n\n<li>pliki<\/li>\n\n\n\n<li>generatory<\/li>\n\n\n\n<li>zakresy <code>range()<\/code><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"iteracja-po-napisie\">Iteracja po napisie<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ka\u017cdy znak w stringu ma swoj\u0105 pozycj\u0119.<\/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>tekst = \"Python\"<\/code><br><br><code>for i, znak in enumerate(tekst):<\/code><br>&nbsp;&nbsp;&nbsp;&nbsp;<code>print(i, znak)<\/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>Pozycja<\/th><th>Znak<\/th><\/tr><\/thead><tbody><tr><td>0<\/td><td>P<\/td><\/tr><tr><td>1<\/td><td>y<\/td><\/tr><tr><td>2<\/td><td>t<\/td><\/tr><tr><td>3<\/td><td>h<\/td><\/tr><tr><td>4<\/td><td>o<\/td><\/tr><tr><td>5<\/td><td>n<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">To przydaje si\u0119 np. przy parserach, analizie sk\u0142adni lub walidacji danych.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"iteracja-po-pliku\">Iteracja po pliku<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Podczas czytania pliku numer linii jest cz\u0119sto wa\u017cniejszy ni\u017c sama tre\u015b\u0107.<\/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>with open(\"dane.txt\", \"r\", encoding=\"utf-8\") as plik:<\/code><br>&nbsp;&nbsp;&nbsp;&nbsp;<code>for nr, linia in enumerate(plik, start=1):<\/code><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<code>print(nr, linia.strip())<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Tutaj unikamy r\u0119cznego liczenia linii, a komunikaty b\u0142\u0119d\u00f3w staj\u0105 si\u0119 od razu czytelne.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"slowniki-i-ostroznosc\">S\u0142owniki i ostro\u017cno\u015b\u0107<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Przy s\u0142ownikach trzeba pami\u0119ta\u0107, \u017ce iteracja domy\u015blnie przechodzi po kluczach.<\/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>dane = {\"a\": 10, \"b\": 20}<\/code><br><br><code>for i, klucz in enumerate(dane):<\/code><br>&nbsp;&nbsp;&nbsp;&nbsp;<code>print(i, klucz)<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Je\u015bli potrzebne s\u0105 klucz i warto\u015b\u0107, lepiej u\u017cy\u0107:<\/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>for i, (k, v) in enumerate(dane.items()):<\/code><br>&nbsp;&nbsp;&nbsp;&nbsp;<code>print(i, k, v)<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">To miejsce, gdzie pocz\u0105tkuj\u0105cy cz\u0119sto pope\u0142niaj\u0105 b\u0142\u0105d.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"enumerate-dodaje-indeksy-do-elementow-iterowalnych-podczas-iteracji-a-podobne-rozwiazania-w-c-i-c\">enumerate \u2013 dodaje indeksy do element\u00f3w iterowalnych podczas iteracji a podobne rozwi\u0105zania w C i C++<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Python robi to bardzo elegancko, ale sam problem istnieje w ka\u017cdym j\u0119zyku.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">W C i C++ indeks najcz\u0119\u015bciej obs\u0142uguje si\u0119 r\u0119cznie.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"przyklad-w-c\">Przyk\u0142ad w C<\/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>C<\/td><td><code>#include &lt;stdio.h&gt;<\/code><br><br><code>int main()<\/code><br><code>{<\/code><br>&nbsp;&nbsp;&nbsp;&nbsp;<code>char *imiona[] = {\"Ala\", \"Ola\", \"Jan\"};<\/code><br>&nbsp;&nbsp;&nbsp;&nbsp;<code>int n = 3;<\/code><br><br>&nbsp;&nbsp;&nbsp;&nbsp;<code>for (int i = 0; i &lt; n; i++)<\/code><br>&nbsp;&nbsp;&nbsp;&nbsp;<code>{<\/code><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<code>printf(\"%d %s\\n\", i, imiona[i]);<\/code><br>&nbsp;&nbsp;&nbsp;&nbsp;<code>}<\/code><br><br>&nbsp;&nbsp;&nbsp;&nbsp;<code>return 0;<\/code><br><code>}<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Tutaj programista sam pilnuje:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>pocz\u0105tku licznika<\/li>\n\n\n\n<li>ko\u0144ca zakresu<\/li>\n\n\n\n<li>poprawnego indeksu<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">To zwi\u0119ksza ryzyko b\u0142\u0119d\u00f3w typu out-of-bounds.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"przyklad-w-c-1\">Przyk\u0142ad w C++<\/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>C++<\/td><td><code>#include &lt;iostream&gt;<\/code><br><code>#include &lt;vector&gt;<\/code><br><br><code>int main()<\/code><br><code>{<\/code><br>&nbsp;&nbsp;&nbsp;&nbsp;<code>std::vector&lt;std::string&gt; dane = {\"Ala\", \"Ola\", \"Jan\"};<\/code><br><br>&nbsp;&nbsp;&nbsp;&nbsp;<code>for (size_t i = 0; i &lt; dane.size(); i++)<\/code><br>&nbsp;&nbsp;&nbsp;&nbsp;<code>{<\/code><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<code>std::cout &lt;&lt; i &lt;&lt; \" \" &lt;&lt; dane[i] &lt;&lt; std::endl;<\/code><br>&nbsp;&nbsp;&nbsp;&nbsp;<code>}<\/code><br><code>}<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Mechanizm jest podobny, ale mniej wygodny ni\u017c w Pythonie.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Python upraszcza ten fragment bez utraty czytelno\u015bci.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"gdzie-to-naprawde-oszczedza-czas\">Gdzie to naprawd\u0119 oszcz\u0119dza czas<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Najbardziej wida\u0107 to przy:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>analizie danych wej\u015bciowych<\/li>\n\n\n\n<li>walidacji formularzy<\/li>\n\n\n\n<li>importach CSV<\/li>\n\n\n\n<li>logach b\u0142\u0119d\u00f3w<\/li>\n\n\n\n<li>debugowaniu algorytm\u00f3w sortowania<\/li>\n\n\n\n<li>testach automatycznych<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Je\u015bli program zwraca komunikat:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u201eB\u0142\u0105d w rekordzie 842\u201d<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">to u\u017cytkownik mo\u017ce dzia\u0142a\u0107.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Je\u015bli zwraca:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u201eB\u0142\u0105d danych\u201d<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">to zaczyna si\u0119 strata czasu.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dobra numeracja to nie kosmetyka. To oszcz\u0119dno\u015b\u0107 pracy.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"typowe-pulapki-i-bledy-ktore-pojawiaja-sie-najczesciej\">Typowe pu\u0142apki i b\u0142\u0119dy, kt\u00f3re pojawiaj\u0105 si\u0119 najcz\u0119\u015bciej<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"nadpisanie-nazwy-funkcji\">Nadpisanie nazwy funkcji<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Bardzo cz\u0119sty problem:<\/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>enumerate = 5<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Po takim przypisaniu funkcja przestaje dzia\u0142a\u0107.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To klasyczny b\u0142\u0105d pocz\u0105tkuj\u0105cych. Nie nale\u017cy u\u017cywa\u0107 nazw funkcji wbudowanych jako nazw zmiennych.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"niepotrzebne-uzywanie-range-len\">Niepotrzebne u\u017cywanie range(len())<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Cz\u0119sto spotykany kod:<\/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>for i in range(len(lista)):<\/code><br>&nbsp;&nbsp;&nbsp;&nbsp;<code>print(i, lista[i])<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Dzia\u0142a, ale jest mniej czytelny i bardziej podatny na b\u0142\u0119dy.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Lepsza wersja:<\/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>for i, element in enumerate(lista):<\/code><br>&nbsp;&nbsp;&nbsp;&nbsp;<code>print(i, element)<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><code>range(len())<\/code> ma sens tylko wtedy, gdy naprawd\u0119 potrzebny jest dost\u0119p indeksowy do wielu struktur r\u00f3wnocze\u015bnie.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"zly-start-indeksowania\">Z\u0142y start indeksowania<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">B\u0142\u0105d logiczny:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>u\u017cytkownik widzi numeracj\u0119 od 0<\/li>\n\n\n\n<li>raport powinien zaczyna\u0107 si\u0119 od 1<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">To wygl\u0105da drobnie, ale w systemach produkcyjnych generuje niepotrzebne zg\u0142oszenia.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dlatego warto \u015bwiadomie ustawia\u0107 <code>start=<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"krotkie-zaleznosci-z-innymi-narzedziami-pythona\">Kr\u00f3tkie zale\u017cno\u015bci z innymi narz\u0119dziami Pythona<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Najcz\u0119\u015bciej <code>enumerate()<\/code> wsp\u00f3\u0142pracuje z:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>zip()<\/code><\/li>\n\n\n\n<li><code>sorted()<\/code><\/li>\n\n\n\n<li><code>reversed()<\/code><\/li>\n\n\n\n<li><code>list()<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ad:<\/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>lista = [\"c\", \"a\", \"b\"]<\/code><br><br><code>for i, wartosc in enumerate(sorted(lista), start=1):<\/code><br>&nbsp;&nbsp;&nbsp;&nbsp;<code>print(i, wartosc)<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Najpierw sortowanie, potem numeracja.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To bardzo typowy schemat.<\/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-funkcja-dziala-tylko-dla-list\">Czy funkcja dzia\u0142a tylko dla list?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Nie. Dzia\u0142a dla wszystkich obiekt\u00f3w iterowalnych: napis\u00f3w, krotek, plik\u00f3w, generator\u00f3w, s\u0142ownik\u00f3w i wielu innych.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-indeks-zawsze-zaczyna-sie-od-zera\">Czy indeks zawsze zaczyna si\u0119 od zera?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Domy\u015blnie tak, ale mo\u017cna to zmieni\u0107 parametrem <code>start<\/code>.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Parametr<\/th><th>Przyk\u0142ad<\/th><\/tr><\/thead><tbody><tr><td>start<\/td><td><code>enumerate(lista, start=1)<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-enumerate-jest-szybsze-niz-reczny-licznik\">Czy enumerate() jest szybsze ni\u017c r\u0119czny licznik?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Najwa\u017cniejsza korzy\u015b\u0107 to czytelno\u015b\u0107 i mniejsze ryzyko b\u0142\u0119d\u00f3w. R\u00f3\u017cnice wydajno\u015bci zwykle s\u0105 ma\u0142e, ale iterator dzia\u0142a pami\u0119ciowo bardzo rozs\u0105dnie.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"kiedy-lepiej-uzyc-range-len\">Kiedy lepiej u\u017cy\u0107 range(len())?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Gdy potrzebny jest bezpo\u015bredni dost\u0119p indeksowy do kilku struktur r\u00f3wnocze\u015bnie albo gdy trzeba modyfikowa\u0107 dane wed\u0142ug pozycji.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-mozna-uzywac-tego-w-duzych-plikach\">Czy mo\u017cna u\u017cywa\u0107 tego w du\u017cych plikach?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Tak. To dobre rozwi\u0105zanie przy przetwarzaniu du\u017cych plik\u00f3w tekstowych, poniewa\u017c iterator nie \u0142aduje wszystkiego naraz do pami\u0119ci.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-dziala-ze-slownikami\">Czy dzia\u0142a ze s\u0142ownikami?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Tak, ale domy\u015blnie iteruje po kluczach. Je\u015bli potrzebne s\u0105 pary klucz-warto\u015b\u0107, nale\u017cy u\u017cy\u0107 <code>.items()<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dobra kontrola indeks\u00f3w to jedna z tych rzeczy, kt\u00f3re wydaj\u0105 si\u0119 drobne, dop\u00f3ki nie trzeba znale\u017a\u0107 b\u0142\u0119du w tysi\u0105cach rekord\u00f3w. Wtedy prosty, czytelny mechanizm okazuje si\u0119 wa\u017cniejszy ni\u017c najbardziej efektowna sk\u0142adnia. W praktyce w\u0142a\u015bnie takie ma\u0142e narz\u0119dzia najbardziej poprawiaj\u0105 jako\u015b\u0107 kodu.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>\u0179r\u00f3d\u0142o Foto: Freepik<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Praca z kolekcjami danych bardzo szybko prowadzi do sytuacji, w kt\u00f3rej sama warto\u015b\u0107 elementu nie wystarcza. Trzeba jeszcze wiedzie\u0107, na kt\u00f3rej pozycji si\u0119 znajduje: numer wiersza, indeks b\u0142\u0119du, miejsce w rankingu albo kolejno\u015b\u0107 przetwarzania. R\u0119czne zwi\u0119kszanie licznika dzia\u0142a, ale \u0142atwo wtedy o pomy\u0142k\u0119, zw\u0142aszcza przy zagnie\u017cd\u017conych p\u0119tlach albo filtrowaniu danych. W codziennej pracy z listami, krotkami i napisami naturalnym rozwi\u0105zaniem staje si\u0119 enumerate \u2013 dodaje indeksy do element\u00f3w iterowalnych podczas iteracji. enumerate \u2013 dodaje indeksy do element\u00f3w iterowalnych podczas iteracji i eliminuje r\u0119czne zarz\u0105dzanie licznikiem w p\u0119tli Funkcja enumerate() w Pythonie zwraca obiekt iterowalny, kt\u00f3ry podczas przechodzenia po danych dostarcza par\u0119: Zamiast pisa\u0107 osobny licznik: i = 0for element in lista: mo\u017cna od razu pobra\u0107 obie informacje w jednej konstrukcji: for i, element in enumerate(lista): To rozwi\u0105zanie jest prostsze, czytelniejsze i bezpieczniejsze. Najwa\u017cniejsze jest to, \u017ce enumerate() nie kopiuje ca\u0142ej listy. Zwraca iterator, wi\u0119c dzia\u0142a oszcz\u0119dnie pami\u0119ciowo. Przy ma\u0142ych danych nie ma to du\u017cego znaczenia, ale przy tysi\u0105cach lub milionach rekord\u00f3w r\u00f3\u017cnica jest ju\u017c realna. W praktyce u\u017cywa si\u0119 tego mi\u0119dzy innymi przy: Podstawowa sk\u0142adnia i parametry Sk\u0142adnia wygl\u0105da tak: Element Opis enumerate(iterable) indeksowanie od 0 enumerate(iterable, start=1) indeksowanie od wskazanej warto\u015bci Drugi parametr jest bardzo wa\u017cny. Domy\u015blnie indeks zaczyna si\u0119 od 0, co jest naturalne dla programowania, ale nie zawsze wygodne dla u\u017cytkownika ko\u0144cowego. Lista pozycji w menu zwykle zaczyna si\u0119 od 1, nie od 0. Prosty przyk\u0142ad w Pythonie J\u0119zyk Kod Python lista = [&#8222;Ala&#8221;, &#8222;Ola&#8221;, &#8222;Jan&#8221;] for indeks, imie in enumerate(lista):&nbsp;&nbsp;&nbsp;&nbsp;print(indeks, imie) Wynik: Indeks Warto\u015b\u0107 0 Ala 1 Ola 2 Jan Przyk\u0142ad z numeracj\u0105 od 1: J\u0119zyk Kod Python for nr, imie in enumerate(lista, start=1):&nbsp;&nbsp;&nbsp;&nbsp;print(nr, imie) Wynik: Numer Warto\u015b\u0107 1 Ala 2 Ola 3 Jan To drobna zmiana, ale w aplikacjach u\u017cytkowych bardzo potrzebna. enumerate \u2013 dodaje indeksy do element\u00f3w iterowalnych podczas iteracji tak\u017ce dla napis\u00f3w, krotek i danych wej\u015bciowych Wiele os\u00f3b kojarzy t\u0119 funkcj\u0119 wy\u0142\u0105cznie z listami, ale dzia\u0142a ona dla ka\u017cdego obiektu iterowalnego. To oznacza: Iteracja po napisie Ka\u017cdy znak w stringu ma swoj\u0105 pozycj\u0119. J\u0119zyk Kod Python tekst = &#8222;Python&#8221; for i, znak in enumerate(tekst):&nbsp;&nbsp;&nbsp;&nbsp;print(i, znak) Wynik: Pozycja Znak 0 P 1 y 2 t 3 h 4 o 5 n To przydaje si\u0119 np. przy parserach, analizie sk\u0142adni lub walidacji danych. Iteracja po pliku Podczas czytania pliku numer linii jest cz\u0119sto wa\u017cniejszy ni\u017c sama tre\u015b\u0107. J\u0119zyk Kod Python with open(&#8222;dane.txt&#8221;, &#8222;r&#8221;, encoding=&#8221;utf-8&#8243;) as plik:&nbsp;&nbsp;&nbsp;&nbsp;for nr, linia in enumerate(plik, start=1):&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(nr, linia.strip()) Tutaj unikamy r\u0119cznego liczenia linii, a komunikaty b\u0142\u0119d\u00f3w staj\u0105 si\u0119 od razu czytelne. S\u0142owniki i ostro\u017cno\u015b\u0107 Przy s\u0142ownikach trzeba pami\u0119ta\u0107, \u017ce iteracja domy\u015blnie przechodzi po kluczach. J\u0119zyk Kod Python dane = {&#8222;a&#8221;: 10, &#8222;b&#8221;: 20} for i, klucz in enumerate(dane):&nbsp;&nbsp;&nbsp;&nbsp;print(i, klucz) Je\u015bli potrzebne s\u0105 klucz i warto\u015b\u0107, lepiej u\u017cy\u0107: J\u0119zyk Kod Python for i, (k, v) in enumerate(dane.items()):&nbsp;&nbsp;&nbsp;&nbsp;print(i, k, v) To miejsce, gdzie pocz\u0105tkuj\u0105cy cz\u0119sto pope\u0142niaj\u0105 b\u0142\u0105d. enumerate \u2013 dodaje indeksy do element\u00f3w iterowalnych podczas iteracji a podobne rozwi\u0105zania w C i C++ Python robi to bardzo elegancko, ale sam problem istnieje w ka\u017cdym j\u0119zyku. W C i C++ indeks najcz\u0119\u015bciej obs\u0142uguje si\u0119 r\u0119cznie. Przyk\u0142ad w C J\u0119zyk Kod C #include &lt;stdio.h&gt; int main(){&nbsp;&nbsp;&nbsp;&nbsp;char *imiona[] = {&#8222;Ala&#8221;, &#8222;Ola&#8221;, &#8222;Jan&#8221;};&nbsp;&nbsp;&nbsp;&nbsp;int n = 3; &nbsp;&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; n; i++)&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&#8222;%d %s\\n&#8221;, i, imiona[i]);&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return 0;} Tutaj programista sam pilnuje: To zwi\u0119ksza ryzyko b\u0142\u0119d\u00f3w typu out-of-bounds. Przyk\u0142ad w C++ J\u0119zyk Kod C++ #include &lt;iostream&gt;#include &lt;vector&gt; int main(){&nbsp;&nbsp;&nbsp;&nbsp;std::vector&lt;std::string&gt; dane = {&#8222;Ala&#8221;, &#8222;Ola&#8221;, &#8222;Jan&#8221;}; &nbsp;&nbsp;&nbsp;&nbsp;for (size_t i = 0; i &lt; dane.size(); i++)&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout &lt;&lt; i &lt;&lt; &#8221; &#8221; &lt;&lt; dane[i] &lt;&lt; std::endl;&nbsp;&nbsp;&nbsp;&nbsp;}} Mechanizm jest podobny, ale mniej wygodny ni\u017c w Pythonie. Python upraszcza ten fragment bez utraty czytelno\u015bci. Gdzie to naprawd\u0119 oszcz\u0119dza czas Najbardziej wida\u0107 to przy: Je\u015bli program zwraca komunikat: \u201eB\u0142\u0105d w rekordzie 842\u201d to u\u017cytkownik mo\u017ce dzia\u0142a\u0107. Je\u015bli zwraca: \u201eB\u0142\u0105d danych\u201d to zaczyna si\u0119 strata czasu. Dobra numeracja to nie kosmetyka. To oszcz\u0119dno\u015b\u0107 pracy. Typowe pu\u0142apki i b\u0142\u0119dy, kt\u00f3re pojawiaj\u0105 si\u0119 najcz\u0119\u015bciej Nadpisanie nazwy funkcji Bardzo cz\u0119sty problem: J\u0119zyk Kod Python enumerate = 5 Po takim przypisaniu funkcja przestaje dzia\u0142a\u0107. To klasyczny b\u0142\u0105d pocz\u0105tkuj\u0105cych. Nie nale\u017cy u\u017cywa\u0107 nazw funkcji wbudowanych jako nazw zmiennych. Niepotrzebne u\u017cywanie range(len()) Cz\u0119sto spotykany kod: J\u0119zyk Kod Python for i in range(len(lista)):&nbsp;&nbsp;&nbsp;&nbsp;print(i, lista[i]) Dzia\u0142a, ale jest mniej czytelny i bardziej podatny na b\u0142\u0119dy. Lepsza wersja: J\u0119zyk Kod Python for i, element in enumerate(lista):&nbsp;&nbsp;&nbsp;&nbsp;print(i, element) range(len()) ma sens tylko wtedy, gdy naprawd\u0119 potrzebny jest dost\u0119p indeksowy do wielu struktur r\u00f3wnocze\u015bnie. Z\u0142y start indeksowania B\u0142\u0105d logiczny: To wygl\u0105da drobnie, ale w systemach produkcyjnych generuje niepotrzebne zg\u0142oszenia. Dlatego warto \u015bwiadomie ustawia\u0107 start=. Kr\u00f3tkie zale\u017cno\u015bci z innymi narz\u0119dziami Pythona Najcz\u0119\u015bciej enumerate() wsp\u00f3\u0142pracuje z: Przyk\u0142ad: J\u0119zyk Kod Python lista = [&#8222;c&#8221;, &#8222;a&#8221;, &#8222;b&#8221;] for i, wartosc in enumerate(sorted(lista), start=1):&nbsp;&nbsp;&nbsp;&nbsp;print(i, wartosc) Najpierw sortowanie, potem numeracja. To bardzo typowy schemat. FAQ Czy funkcja dzia\u0142a tylko dla list? Nie. Dzia\u0142a dla wszystkich obiekt\u00f3w iterowalnych: napis\u00f3w, krotek, plik\u00f3w, generator\u00f3w, s\u0142ownik\u00f3w i wielu innych. Czy indeks zawsze zaczyna si\u0119 od zera? Domy\u015blnie tak, ale mo\u017cna to zmieni\u0107 parametrem start. Parametr Przyk\u0142ad start enumerate(lista, start=1) Czy enumerate() jest szybsze ni\u017c r\u0119czny licznik? Najwa\u017cniejsza korzy\u015b\u0107 to czytelno\u015b\u0107 i mniejsze ryzyko b\u0142\u0119d\u00f3w. R\u00f3\u017cnice wydajno\u015bci zwykle s\u0105 ma\u0142e, ale iterator dzia\u0142a pami\u0119ciowo bardzo rozs\u0105dnie. Kiedy lepiej u\u017cy\u0107 range(len())? Gdy potrzebny jest bezpo\u015bredni dost\u0119p indeksowy do kilku struktur r\u00f3wnocze\u015bnie albo gdy trzeba modyfikowa\u0107 dane wed\u0142ug pozycji. Czy mo\u017cna u\u017cywa\u0107 tego w du\u017cych plikach? Tak. To dobre rozwi\u0105zanie przy przetwarzaniu du\u017cych plik\u00f3w tekstowych, poniewa\u017c iterator nie \u0142aduje wszystkiego naraz do pami\u0119ci. Czy dzia\u0142a ze s\u0142ownikami? Tak, ale domy\u015blnie iteruje po kluczach. Je\u015bli potrzebne s\u0105 pary klucz-warto\u015b\u0107, nale\u017cy u\u017cy\u0107 .items(). Dobra kontrola indeks\u00f3w to jedna z tych rzeczy, kt\u00f3re wydaj\u0105 si\u0119 drobne, dop\u00f3ki nie trzeba znale\u017a\u0107 b\u0142\u0119du w tysi\u0105cach rekord\u00f3w. Wtedy prosty, czytelny mechanizm okazuje si\u0119 wa\u017cniejszy ni\u017c najbardziej efektowna sk\u0142adnia. W praktyce w\u0142a\u015bnie takie ma\u0142e narz\u0119dzia najbardziej poprawiaj\u0105 jako\u015b\u0107 kodu. \u0179r\u00f3d\u0142o Foto: Freepik<\/p>\n","protected":false},"author":1,"featured_media":1440,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24],"tags":[],"class_list":["post-1439","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kodowanie"],"_links":{"self":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1439","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=1439"}],"version-history":[{"count":1,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1439\/revisions"}],"predecessor-version":[{"id":1441,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1439\/revisions\/1441"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/media\/1440"}],"wp:attachment":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/media?parent=1439"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/categories?post=1439"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/tags?post=1439"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}