{"id":1546,"date":"2026-04-17T16:20:20","date_gmt":"2026-04-17T14:20:20","guid":{"rendered":"https:\/\/trzykody.pl\/?p=1546"},"modified":"2026-04-28T16:25:50","modified_gmt":"2026-04-28T14:25:50","slug":"sum-sumuje-elementy-iterowalne","status":"publish","type":"post","link":"https:\/\/trzykody.pl\/index.php\/2026\/04\/17\/sum-sumuje-elementy-iterowalne\/","title":{"rendered":"Sum \u2013 sumuje elementy iterowalne"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Praca z danymi iterowalnymi bardzo szybko prowadzi do jednego podstawowego problemu: trzeba policzy\u0107 \u0142\u0105czn\u0105 warto\u015b\u0107 wielu element\u00f3w bez r\u0119cznego przechodzenia po ka\u017cdym z nich. Dotyczy to liczb w li\u015bcie, wynik\u00f3w pomiar\u00f3w, warto\u015bci z pliku CSV, sum kontrolnych czy prostych operacji statystycznych. W praktyce programista robi to codziennie, nawet je\u015bli nie zwraca na to wi\u0119kszej uwagi. W Pythonie najprostszym narz\u0119dziem do takiego zadania jest w\u0142a\u015bnie Sum.<\/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=\"#sum-sumuje-elementy-iterowalne-i-dlaczego-ta-funkcja-jest-wazniejsza-niz-wyglada-na-pierwszy-rzut-oka\">Sum \u2013 sumuje elementy iterowalne i dlaczego ta funkcja jest wa\u017cniejsza ni\u017c wygl\u0105da na pierwszy rzut oka<\/a><\/li><li><a href=\"#podstawowa-skladnia-dzialania-oraz-roznica-miedzy-iterable-a-zwykla-zmienna-liczbowa\">Podstawowa sk\u0142adnia dzia\u0142ania oraz r\u00f3\u017cnica mi\u0119dzy iterable a zwyk\u0142\u0105 zmienn\u0105 liczbow\u0105<\/a><ol><li><a href=\"#przyklady-podstawowego-uzycia\">Przyk\u0142ady podstawowego u\u017cycia<\/a><\/li><\/ol><\/li><li><a href=\"#sum-sumuje-elementy-iterowalne-w-praktyce-pracy-na-listach-generatorach-i-danych-wejsciowych\">Sum \u2013 sumuje elementy iterowalne w praktyce pracy na listach, generatorach i danych wej\u015bciowych<\/a><ol><li><a href=\"#porownanie-podejscia-recznego-i-funkcji-sum\">Por\u00f3wnanie podej\u015bcia r\u0119cznego i funkcji sum()<\/a><\/li><\/ol><\/li><li><a href=\"#odpowiedniki-w-c-c-i-python-oraz-roznice-miedzy-podejsciem-proceduralnym-i-wbudowana-funkcja\">Odpowiedniki w C, C++ i Python oraz r\u00f3\u017cnice mi\u0119dzy podej\u015bciem proceduralnym i wbudowan\u0105 funkcj\u0105<\/a><ol><li><a href=\"#ten-sam-problem-w-trzech-jezykach\">Ten sam problem w trzech j\u0119zykach<\/a><\/li><\/ol><\/li><li><a href=\"#wzory-matematyczne-zwiazane-z-sumowaniem-i-ich-praktyczne-znaczenie-w-analizie-danych\">Wzory matematyczne zwi\u0105zane z sumowaniem i ich praktyczne znaczenie w analizie danych<\/a><ol><li><a href=\"#najczesciej-uzywane-wzory\">Najcz\u0119\u015bciej u\u017cywane wzory<\/a><\/li><\/ol><\/li><li><a href=\"#sum-sumuje-elementy-iterowalne-ale-nie-wszystko-i-tutaj-pojawiaja-sie-najczestsze-pulapki\">Sum \u2013 sumuje elementy iterowalne ale nie wszystko i tutaj pojawiaj\u0105 si\u0119 najcz\u0119stsze pu\u0142apki<\/a><ol><li><a href=\"#bezpieczna-konwersja-danych\">Bezpieczna konwersja danych<\/a><\/li><\/ol><\/li><li><a href=\"#krotkie-uwagi-praktyczne-z-codziennego-uzycia-i-rzeczy-na-ktore-naprawde-warto-uwazac\">Kr\u00f3tkie uwagi praktyczne z codziennego u\u017cycia i rzeczy, na kt\u00f3re naprawd\u0119 warto uwa\u017ca\u0107<\/a><\/li><li><a href=\"#faq\">FAQ<\/a><ol><li><a href=\"#czy-sum-dziala-na-slownikach\">Czy sum() dzia\u0142a na s\u0142ownikach?<\/a><\/li><li><a href=\"#czy-sum-jest-szybsze-niz-reczna-petla\">Czy sum() jest szybsze ni\u017c r\u0119czna p\u0119tla?<\/a><\/li><li><a href=\"#czy-mozna-uzywac-sum-dla-wartosci-logicznych\">Czy mo\u017cna u\u017cywa\u0107 sum() dla warto\u015bci logicznych?<\/a><\/li><li><a href=\"#czy-sum-dziala-na-set\">Czy sum() dzia\u0142a na set?<\/a><\/li><li><a href=\"#kiedy-lepiej-nie-uzywac-sum\">Kiedy lepiej nie u\u017cywa\u0107 sum()?<\/a><\/li><\/ol><\/li><li><a href=\"#zakonczenie\">Zako\u0144czenie<\/a><\/li><\/ol><\/nav><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"sum-sumuje-elementy-iterowalne-i-dlaczego-ta-funkcja-jest-wazniejsza-niz-wyglada-na-pierwszy-rzut-oka\">Sum \u2013 sumuje elementy iterowalne i dlaczego ta funkcja jest wa\u017cniejsza ni\u017c wygl\u0105da na pierwszy rzut oka<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Funkcja <code>sum()<\/code> w Pythonie s\u0142u\u017cy do dodawania element\u00f3w znajduj\u0105cych si\u0119 w obiekcie iterowalnym. Iterowalny oznacza taki, po kt\u00f3rym mo\u017cna przechodzi\u0107 element po elemencie: lista, krotka, zbi\u00f3r, generator, wynik dzia\u0142ania <code>range()<\/code>, a tak\u017ce wiele w\u0142asnych struktur.<br>Najprostsza forma wygl\u0105da tak:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sum(iterable)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">lub:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sum(iterable, start)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Drugi parametr <code>start<\/code> okre\u015bla warto\u015b\u0107 pocz\u0105tkow\u0105. Domy\u015blnie jest to <code>0<\/code>.<br>To wydaje si\u0119 banalne, ale w praktyce eliminuje du\u017c\u0105 liczb\u0119 r\u0119cznych p\u0119tli, zmniejsza liczb\u0119 b\u0142\u0119d\u00f3w i poprawia czytelno\u015b\u0107 kodu. Zamiast pisa\u0107 pi\u0119\u0107 linii kodu z licznikiem pomocniczym, mo\u017cna u\u017cy\u0107 jednej instrukcji, kt\u00f3ra od razu komunikuje intencj\u0119.<br>Najwa\u017cniejsze jest jednak to, \u017ce <code>sum()<\/code> nie jest tylko skr\u00f3tem sk\u0142adniowym. To tak\u017ce spos\u00f3b pisania kodu bardziej deklaratywnego: programista opisuje cel (\u201epolicz sum\u0119\u201d), a nie mechanik\u0119 wykonania (\u201eutw\u00f3rz zmienn\u0105, iteruj, dodawaj\u201d).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"podstawowa-skladnia-dzialania-oraz-roznica-miedzy-iterable-a-zwykla-zmienna-liczbowa\">Podstawowa sk\u0142adnia dzia\u0142ania oraz r\u00f3\u017cnica mi\u0119dzy iterable a zwyk\u0142\u0105 zmienn\u0105 liczbow\u0105<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Najcz\u0119stszy b\u0142\u0105d pocz\u0105tkuj\u0105cych polega na przekazaniu do <code>sum()<\/code> pojedynczej liczby zamiast kolekcji.<br>B\u0142\u0119dny zapis:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sum(10)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Python zwr\u00f3ci b\u0142\u0105d:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">TypeError: 'int' object is not iterable<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Dlaczego? Bo <code>10<\/code> nie jest iterowalne. Funkcja oczekuje czego\u015b w rodzaju:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>listy: <code>[1, 2, 3]<\/code><\/li>\n\n\n\n<li>krotki: <code>(1, 2, 3)<\/code><\/li>\n\n\n\n<li>zakresu: <code>range(1, 6)<\/code><\/li>\n\n\n\n<li>generatora: <code>(x for x in range(10))<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">To wa\u017cne rozr\u00f3\u017cnienie, bo wiele problem\u00f3w z <code>sum()<\/code> wynika w\u0142a\u015bnie z niepoprawnego typu danych.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"przyklady-podstawowego-uzycia\">Przyk\u0142ady podstawowego u\u017cycia<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Przyk\u0142ad<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>Lista liczb<\/td><td><code>wynik = sum([2, 4, 6, 8])<\/code><\/td><\/tr><tr><td>Krotka<\/td><td><code>wynik = sum((10, 20, 30))<\/code><\/td><\/tr><tr><td>Range<\/td><td><code>wynik = sum(range(1, 6))<\/code><\/td><\/tr><tr><td>Z warto\u015bci\u0105 pocz\u0105tkow\u0105<\/td><td><code>wynik = sum([1, 2, 3], 10)<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Dla <code>sum(range(1, 6))<\/code> wynik wynosi <code>15<\/code>, bo liczone jest:<br>1 + 2 + 3 + 4 + 5<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dla <code>sum([1, 2, 3], 10)<\/code> wynik wynosi <code>16<\/code>, bo:<br>10 + 1 + 2 + 3<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"sum-sumuje-elementy-iterowalne-w-praktyce-pracy-na-listach-generatorach-i-danych-wejsciowych\">Sum \u2013 sumuje elementy iterowalne w praktyce pracy na listach, generatorach i danych wej\u015bciowych<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Najwi\u0119ksza r\u00f3\u017cnica pojawia si\u0119 przy generatorach. Generator nie przechowuje wszystkich danych w pami\u0119ci naraz. Dla du\u017cych zbior\u00f3w danych ma to realne znaczenie.<br>Lista:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sum([x * 2 for x in range(1000000)])<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Generator:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sum(x * 2 for x in range(1000000))<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Druga wersja zwykle jest lepsza pami\u0119ciowo, bo nie tworzy ca\u0142ej listy po\u015bredniej.<br>Przy milionie element\u00f3w r\u00f3\u017cnica mo\u017ce oznacza\u0107 dziesi\u0105tki megabajt\u00f3w pami\u0119ci mniej. W ma\u0142ych skryptach nie ma to znaczenia, ale w analizie danych, przetwarzaniu log\u00f3w lub pracy na serwerze ju\u017c tak.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"porownanie-podejscia-recznego-i-funkcji-sum\">Por\u00f3wnanie podej\u015bcia r\u0119cznego i funkcji sum()<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Podej\u015bcie<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>P\u0119tla r\u0119czna<\/td><td><code>suma = 0<\/code><br><code>for x in liczby:<\/code><br>&nbsp;&nbsp;&nbsp;&nbsp;<code>suma += x<\/code><\/td><\/tr><tr><td>Funkcja sum<\/td><td><code>suma = sum(liczby)<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Oba rozwi\u0105zania s\u0105 poprawne, ale drugie:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>jest kr\u00f3tsze,<\/li>\n\n\n\n<li>trudniej je zepsu\u0107,<\/li>\n\n\n\n<li>\u0142atwiej je przeczyta\u0107 po kilku miesi\u0105cach.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">W kodzie produkcyjnym czytelno\u015b\u0107 bardzo cz\u0119sto jest wa\u017cniejsza ni\u017c \u201espryt\u201d.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"odpowiedniki-w-c-c-i-python-oraz-roznice-miedzy-podejsciem-proceduralnym-i-wbudowana-funkcja\">Odpowiedniki w C, C++ i Python oraz r\u00f3\u017cnice mi\u0119dzy podej\u015bciem proceduralnym i wbudowan\u0105 funkcj\u0105<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">W j\u0119zykach takich jak C i klasyczne C++ standardowo wykonuje si\u0119 sumowanie r\u0119cznie przez p\u0119tl\u0119. Python daje gotow\u0105 funkcj\u0119 w standardzie.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"ten-sam-problem-w-trzech-jezykach\">Ten sam problem w trzech j\u0119zykach<\/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>&nbsp;&nbsp;<code>int tab[5] = {1,2,3,4,5};<\/code><br>&nbsp;&nbsp;<code>int suma = 0;<\/code><br>&nbsp;&nbsp;<code>for(int i=0; i&lt;5; i++)<\/code><br>&nbsp;&nbsp;&nbsp;&nbsp;<code>suma += tab[i];<\/code><br>&nbsp;&nbsp;<code>printf(\"%d\", suma);<\/code><br>&nbsp;&nbsp;<code>return 0;<\/code><br><code>}<\/code><\/td><\/tr><tr><td>C++<\/td><td><code>#include &lt;iostream&gt;<\/code><br><code>using namespace std;<\/code><br><br><code>int main() {<\/code><br>&nbsp;&nbsp;<code>int tab[] = {1,2,3,4,5};<\/code><br>&nbsp;&nbsp;<code>int suma = 0;<\/code><br>&nbsp;&nbsp;<code>for(int x : tab)<\/code><br>&nbsp;&nbsp;&nbsp;&nbsp;<code>suma += x;<\/code><br>&nbsp;&nbsp;<code>cout &lt;&lt; suma;<\/code><br>&nbsp;&nbsp;<code>return 0;<\/code><br><code>}<\/code><\/td><\/tr><tr><td>Python<\/td><td><code>liczby = [1, 2, 3, 4, 5]<\/code><br><code>print(sum(liczby))<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Python wygrywa tu prostot\u0105. C i C++ daj\u0105 wi\u0119ksz\u0105 kontrol\u0119, ale dla zwyk\u0142ego sumowania kod jest d\u0142u\u017cszy i bardziej podatny na b\u0142\u0119dy indeksowania.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"wzory-matematyczne-zwiazane-z-sumowaniem-i-ich-praktyczne-znaczenie-w-analizie-danych\">Wzory matematyczne zwi\u0105zane z sumowaniem i ich praktyczne znaczenie w analizie danych<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Nie ka\u017cd\u0105 sum\u0119 trzeba liczy\u0107 iteracyjnie. Czasem mo\u017cna u\u017cy\u0107 wzoru matematycznego.<br>Najbardziej znany przypadek to suma kolejnych liczb naturalnych.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"najczesciej-uzywane-wzory\">Najcz\u0119\u015bciej u\u017cywane wzory<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Zastosowanie<\/th><th>Wz\u00f3r<\/th><\/tr><\/thead><tbody><tr><td>Suma od 1 do n<\/td><td><code>S = n(n+1)\/2<\/code><\/td><\/tr><tr><td>\u015arednia arytmetyczna<\/td><td><code>avg = (x1 + x2 + ... + xn)\/n<\/code><\/td><\/tr><tr><td>Suma kwadrat\u00f3w<\/td><td><code>S = 1\u00b2 + 2\u00b2 + ... + n\u00b2<\/code><\/td><\/tr><tr><td>Wz\u00f3r zamkni\u0119ty sumy kwadrat\u00f3w<\/td><td><code>S = n(n+1)(2n+1)\/6<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Dla <code>n = 100<\/code><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">1 + 2 + 3 + ... + 100 = 5050<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">zamiast 100 operacji mo\u017cna u\u017cy\u0107:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">100 \u00d7 101 \/ 2 = 5050<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">W algorytmice takie skr\u00f3ty s\u0105 bardzo wa\u017cne, szczeg\u00f3lnie przy analizie z\u0142o\u017cono\u015bci.<br>Je\u015bli program wykonuje si\u0119 milion razy, nawet ma\u0142a optymalizacja zaczyna mie\u0107 znaczenie.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"sum-sumuje-elementy-iterowalne-ale-nie-wszystko-i-tutaj-pojawiaja-sie-najczestsze-pulapki\">Sum \u2013 sumuje elementy iterowalne ale nie wszystko i tutaj pojawiaj\u0105 si\u0119 najcz\u0119stsze pu\u0142apki<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Funkcja <code>sum()<\/code> nie dzia\u0142a dobrze ze stringami.<br>B\u0142\u0119dny zapis:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sum([\"a\", \"b\", \"c\"])<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">To ko\u0144czy si\u0119 b\u0142\u0119dem, poniewa\u017c <code>sum()<\/code> zosta\u0142a zaprojektowana g\u0142\u00f3wnie do liczb, nie do konkatenacji tekstu.<br>Dla tekstu nale\u017cy u\u017cywa\u0107:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\"\".join([\"a\", \"b\", \"c\"])<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Drugi cz\u0119sty problem to typy mieszane.<br>Przyk\u0142ad:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sum([1, 2, \"3\"])<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">To r\u00f3wnie\u017c zako\u0144czy si\u0119 b\u0142\u0119dem, bo Python nie mo\u017ce bezpiecznie doda\u0107 liczby i tekstu.<br>W realnych projektach taki problem cz\u0119sto pojawia si\u0119 przy danych z plik\u00f3w CSV, formularzy i API. Dane wygl\u0105daj\u0105 jak liczby, ale s\u0105 stringami.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"bezpieczna-konwersja-danych\">Bezpieczna konwersja danych<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Problem<\/th><th>Poprawne rozwi\u0105zanie<\/th><\/tr><\/thead><tbody><tr><td>Liczby zapisane jako tekst<\/td><td><code>sum(map(int, dane))<\/code><\/td><\/tr><tr><td>Liczby zmiennoprzecinkowe<\/td><td><code>sum(map(float, dane))<\/code><\/td><\/tr><tr><td>\u0141\u0105czenie tekstu<\/td><td><code>\"\".join(lista)<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">To oszcz\u0119dza sporo czasu przy debugowaniu.<br>Najgorszy przypadek to sytuacja, gdy cz\u0119\u015b\u0107 danych dzia\u0142a poprawnie, a b\u0142\u0105d pojawia si\u0119 dopiero po kilku tysi\u0105cach rekord\u00f3w.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"krotkie-uwagi-praktyczne-z-codziennego-uzycia-i-rzeczy-na-ktore-naprawde-warto-uwazac\">Kr\u00f3tkie uwagi praktyczne z codziennego u\u017cycia i rzeczy, na kt\u00f3re naprawd\u0119 warto uwa\u017ca\u0107<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Nie warto nadu\u017cywa\u0107 <code>sum()<\/code> tam, gdzie logika jest bardziej z\u0142o\u017cona.<br>Je\u015bli podczas iteracji trzeba:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>filtrowa\u0107 wiele warunk\u00f3w,<\/li>\n\n\n\n<li>obs\u0142ugiwa\u0107 wyj\u0105tki,<\/li>\n\n\n\n<li>logowa\u0107 b\u0142\u0119dy,<\/li>\n\n\n\n<li>przerywa\u0107 wcze\u015bniej,<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">wtedy zwyk\u0142a p\u0119tla <code>for<\/code> bywa lepsza.<br>Przyk\u0142ad z\u0142ego uproszczenia to pr\u00f3ba upchni\u0119cia ca\u0142ej logiki w jednej linii generatora. Kod staje si\u0119 kr\u00f3tki, ale nieczytelny.<br>Druga rzecz to liczby zmiennoprzecinkowe. Dla warto\u015bci typu <code>float<\/code> mog\u0105 pojawi\u0107 si\u0119 b\u0142\u0119dy reprezentacji binarnej.<br>Przyk\u0142ad:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sum([0.1, 0.2])<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">wynik mo\u017ce wygl\u0105da\u0107 inaczej ni\u017c oczekiwane <code>0.3<\/code>.<br>W finansach lepiej u\u017cywa\u0107 <code>decimal.Decimal<\/code>, bo r\u00f3\u017cnica jednego grosza przy tysi\u0105cach operacji przestaje by\u0107 drobiazgiem.<\/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-sum-dziala-na-slownikach\">Czy <code>sum()<\/code> dzia\u0142a na s\u0142ownikach?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Tak, ale domy\u015blnie sumowane s\u0105 klucze, nie warto\u015bci.<\/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>sum({1: \"a\", 2: \"b\"})<\/code><\/td><td><code>3<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Je\u015bli potrzebne s\u0105 warto\u015bci liczbowe:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Kod<\/th><\/tr><\/thead><tbody><tr><td><code>sum(slownik.values())<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-sum-jest-szybsze-niz-reczna-petla\">Czy <code>sum()<\/code> jest szybsze ni\u017c r\u0119czna p\u0119tla?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Najcz\u0119\u015bciej tak lub por\u00f3wnywalnie, ale g\u0142\u00f3wn\u0105 zalet\u0105 jest czytelno\u015b\u0107. R\u00f3\u017cnice wydajno\u015bci zwykle nie s\u0105 kluczowe przy ma\u0142ych danych.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-mozna-uzywac-sum-dla-wartosci-logicznych\">Czy mo\u017cna u\u017cywa\u0107 <code>sum()<\/code> dla warto\u015bci logicznych?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Tak, poniewa\u017c <code>True<\/code> ma warto\u015b\u0107 <code>1<\/code>, a <code>False<\/code> ma warto\u015b\u0107 <code>0<\/code>.<\/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>sum([True, False, True])<\/code><\/td><td><code>2<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">To jest bardzo wygodne przy liczeniu spe\u0142nionych warunk\u00f3w.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-sum-dziala-na-set\">Czy <code>sum()<\/code> dzia\u0142a na <code>set<\/code>?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Tak, je\u015bli elementy s\u0105 liczbami.<\/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>sum({2, 4, 6})<\/code><\/td><td><code>12<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Trzeba tylko pami\u0119ta\u0107, \u017ce zbi\u00f3r nie zachowuje kolejno\u015bci.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"kiedy-lepiej-nie-uzywac-sum\">Kiedy lepiej nie u\u017cywa\u0107 <code>sum()<\/code>?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Gdy operacja nie jest zwyk\u0142ym dodawaniem albo gdy potrzebna jest rozbudowana kontrola nad przebiegiem p\u0119tli. Wtedy klasyczny <code>for<\/code> jest bardziej przewidywalny.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"zakonczenie\">Zako\u0144czenie<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><code>sum()<\/code> jest jedn\u0105 z tych funkcji, kt\u00f3re wygl\u0105daj\u0105 na ma\u0142e i nieistotne, dop\u00f3ki nie zacznie si\u0119 pisa\u0107 wi\u0119kszej ilo\u015bci kodu. Potem okazuje si\u0119, \u017ce pojawia si\u0119 wsz\u0119dzie: w analizie danych, algorytmach, raportach, walidacji i prostych skryptach administracyjnych. Dobrze rozumiane podstawy zwykle daj\u0105 wi\u0119ksz\u0105 przewag\u0119 ni\u017c skomplikowane sztuczki, a tutaj w\u0142a\u015bnie o to chodzi.<\/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 danymi iterowalnymi bardzo szybko prowadzi do jednego podstawowego problemu: trzeba policzy\u0107 \u0142\u0105czn\u0105 warto\u015b\u0107 wielu element\u00f3w bez r\u0119cznego przechodzenia po ka\u017cdym z nich. Dotyczy to liczb w li\u015bcie, wynik\u00f3w pomiar\u00f3w, warto\u015bci z pliku CSV, sum kontrolnych czy prostych operacji statystycznych. W praktyce programista robi to codziennie, nawet je\u015bli nie zwraca na to wi\u0119kszej uwagi. W Pythonie najprostszym narz\u0119dziem do takiego zadania jest w\u0142a\u015bnie Sum. Sum \u2013 sumuje elementy iterowalne i dlaczego ta funkcja jest wa\u017cniejsza ni\u017c wygl\u0105da na pierwszy rzut oka Funkcja sum() w Pythonie s\u0142u\u017cy do dodawania element\u00f3w znajduj\u0105cych si\u0119 w obiekcie iterowalnym. Iterowalny oznacza taki, po kt\u00f3rym mo\u017cna przechodzi\u0107 element po elemencie: lista, krotka, zbi\u00f3r, generator, wynik dzia\u0142ania range(), a tak\u017ce wiele w\u0142asnych struktur.Najprostsza forma wygl\u0105da tak: sum(iterable) lub: sum(iterable, start) Drugi parametr start okre\u015bla warto\u015b\u0107 pocz\u0105tkow\u0105. Domy\u015blnie jest to 0.To wydaje si\u0119 banalne, ale w praktyce eliminuje du\u017c\u0105 liczb\u0119 r\u0119cznych p\u0119tli, zmniejsza liczb\u0119 b\u0142\u0119d\u00f3w i poprawia czytelno\u015b\u0107 kodu. Zamiast pisa\u0107 pi\u0119\u0107 linii kodu z licznikiem pomocniczym, mo\u017cna u\u017cy\u0107 jednej instrukcji, kt\u00f3ra od razu komunikuje intencj\u0119.Najwa\u017cniejsze jest jednak to, \u017ce sum() nie jest tylko skr\u00f3tem sk\u0142adniowym. To tak\u017ce spos\u00f3b pisania kodu bardziej deklaratywnego: programista opisuje cel (\u201epolicz sum\u0119\u201d), a nie mechanik\u0119 wykonania (\u201eutw\u00f3rz zmienn\u0105, iteruj, dodawaj\u201d). Podstawowa sk\u0142adnia dzia\u0142ania oraz r\u00f3\u017cnica mi\u0119dzy iterable a zwyk\u0142\u0105 zmienn\u0105 liczbow\u0105 Najcz\u0119stszy b\u0142\u0105d pocz\u0105tkuj\u0105cych polega na przekazaniu do sum() pojedynczej liczby zamiast kolekcji.B\u0142\u0119dny zapis: sum(10) Python zwr\u00f3ci b\u0142\u0105d: TypeError: 'int&#8217; object is not iterable Dlaczego? Bo 10 nie jest iterowalne. Funkcja oczekuje czego\u015b w rodzaju: To wa\u017cne rozr\u00f3\u017cnienie, bo wiele problem\u00f3w z sum() wynika w\u0142a\u015bnie z niepoprawnego typu danych. Przyk\u0142ady podstawowego u\u017cycia Przyk\u0142ad Kod Lista liczb wynik = sum([2, 4, 6, 8]) Krotka wynik = sum((10, 20, 30)) Range wynik = sum(range(1, 6)) Z warto\u015bci\u0105 pocz\u0105tkow\u0105 wynik = sum([1, 2, 3], 10) Dla sum(range(1, 6)) wynik wynosi 15, bo liczone jest:1 + 2 + 3 + 4 + 5 Dla sum([1, 2, 3], 10) wynik wynosi 16, bo:10 + 1 + 2 + 3 Sum \u2013 sumuje elementy iterowalne w praktyce pracy na listach, generatorach i danych wej\u015bciowych Najwi\u0119ksza r\u00f3\u017cnica pojawia si\u0119 przy generatorach. Generator nie przechowuje wszystkich danych w pami\u0119ci naraz. Dla du\u017cych zbior\u00f3w danych ma to realne znaczenie.Lista: sum([x * 2 for x in range(1000000)]) Generator: sum(x * 2 for x in range(1000000)) Druga wersja zwykle jest lepsza pami\u0119ciowo, bo nie tworzy ca\u0142ej listy po\u015bredniej.Przy milionie element\u00f3w r\u00f3\u017cnica mo\u017ce oznacza\u0107 dziesi\u0105tki megabajt\u00f3w pami\u0119ci mniej. W ma\u0142ych skryptach nie ma to znaczenia, ale w analizie danych, przetwarzaniu log\u00f3w lub pracy na serwerze ju\u017c tak. Por\u00f3wnanie podej\u015bcia r\u0119cznego i funkcji sum() Podej\u015bcie Kod P\u0119tla r\u0119czna suma = 0for x in liczby:&nbsp;&nbsp;&nbsp;&nbsp;suma += x Funkcja sum suma = sum(liczby) Oba rozwi\u0105zania s\u0105 poprawne, ale drugie: W kodzie produkcyjnym czytelno\u015b\u0107 bardzo cz\u0119sto jest wa\u017cniejsza ni\u017c \u201espryt\u201d. Odpowiedniki w C, C++ i Python oraz r\u00f3\u017cnice mi\u0119dzy podej\u015bciem proceduralnym i wbudowan\u0105 funkcj\u0105 W j\u0119zykach takich jak C i klasyczne C++ standardowo wykonuje si\u0119 sumowanie r\u0119cznie przez p\u0119tl\u0119. Python daje gotow\u0105 funkcj\u0119 w standardzie. Ten sam problem w trzech j\u0119zykach J\u0119zyk Kod C #include &lt;stdio.h&gt; int main() {&nbsp;&nbsp;int tab[5] = {1,2,3,4,5};&nbsp;&nbsp;int suma = 0;&nbsp;&nbsp;for(int i=0; i&lt;5; i++)&nbsp;&nbsp;&nbsp;&nbsp;suma += tab[i];&nbsp;&nbsp;printf(&#8222;%d&#8221;, suma);&nbsp;&nbsp;return 0;} C++ #include &lt;iostream&gt;using namespace std; int main() {&nbsp;&nbsp;int tab[] = {1,2,3,4,5};&nbsp;&nbsp;int suma = 0;&nbsp;&nbsp;for(int x : tab)&nbsp;&nbsp;&nbsp;&nbsp;suma += x;&nbsp;&nbsp;cout &lt;&lt; suma;&nbsp;&nbsp;return 0;} Python liczby = [1, 2, 3, 4, 5]print(sum(liczby)) Python wygrywa tu prostot\u0105. C i C++ daj\u0105 wi\u0119ksz\u0105 kontrol\u0119, ale dla zwyk\u0142ego sumowania kod jest d\u0142u\u017cszy i bardziej podatny na b\u0142\u0119dy indeksowania. Wzory matematyczne zwi\u0105zane z sumowaniem i ich praktyczne znaczenie w analizie danych Nie ka\u017cd\u0105 sum\u0119 trzeba liczy\u0107 iteracyjnie. Czasem mo\u017cna u\u017cy\u0107 wzoru matematycznego.Najbardziej znany przypadek to suma kolejnych liczb naturalnych. Najcz\u0119\u015bciej u\u017cywane wzory Zastosowanie Wz\u00f3r Suma od 1 do n S = n(n+1)\/2 \u015arednia arytmetyczna avg = (x1 + x2 + &#8230; + xn)\/n Suma kwadrat\u00f3w S = 1\u00b2 + 2\u00b2 + &#8230; + n\u00b2 Wz\u00f3r zamkni\u0119ty sumy kwadrat\u00f3w S = n(n+1)(2n+1)\/6 Dla n = 100 1 + 2 + 3 + &#8230; + 100 = 5050 zamiast 100 operacji mo\u017cna u\u017cy\u0107: 100 \u00d7 101 \/ 2 = 5050 W algorytmice takie skr\u00f3ty s\u0105 bardzo wa\u017cne, szczeg\u00f3lnie przy analizie z\u0142o\u017cono\u015bci.Je\u015bli program wykonuje si\u0119 milion razy, nawet ma\u0142a optymalizacja zaczyna mie\u0107 znaczenie. Sum \u2013 sumuje elementy iterowalne ale nie wszystko i tutaj pojawiaj\u0105 si\u0119 najcz\u0119stsze pu\u0142apki Funkcja sum() nie dzia\u0142a dobrze ze stringami.B\u0142\u0119dny zapis: sum([&#8222;a&#8221;, &#8222;b&#8221;, &#8222;c&#8221;]) To ko\u0144czy si\u0119 b\u0142\u0119dem, poniewa\u017c sum() zosta\u0142a zaprojektowana g\u0142\u00f3wnie do liczb, nie do konkatenacji tekstu.Dla tekstu nale\u017cy u\u017cywa\u0107: &#8222;&#8221;.join([&#8222;a&#8221;, &#8222;b&#8221;, &#8222;c&#8221;]) Drugi cz\u0119sty problem to typy mieszane.Przyk\u0142ad: sum([1, 2, &#8222;3&#8221;]) To r\u00f3wnie\u017c zako\u0144czy si\u0119 b\u0142\u0119dem, bo Python nie mo\u017ce bezpiecznie doda\u0107 liczby i tekstu.W realnych projektach taki problem cz\u0119sto pojawia si\u0119 przy danych z plik\u00f3w CSV, formularzy i API. Dane wygl\u0105daj\u0105 jak liczby, ale s\u0105 stringami. Bezpieczna konwersja danych Problem Poprawne rozwi\u0105zanie Liczby zapisane jako tekst sum(map(int, dane)) Liczby zmiennoprzecinkowe sum(map(float, dane)) \u0141\u0105czenie tekstu &#8222;&#8221;.join(lista) To oszcz\u0119dza sporo czasu przy debugowaniu.Najgorszy przypadek to sytuacja, gdy cz\u0119\u015b\u0107 danych dzia\u0142a poprawnie, a b\u0142\u0105d pojawia si\u0119 dopiero po kilku tysi\u0105cach rekord\u00f3w. Kr\u00f3tkie uwagi praktyczne z codziennego u\u017cycia i rzeczy, na kt\u00f3re naprawd\u0119 warto uwa\u017ca\u0107 Nie warto nadu\u017cywa\u0107 sum() tam, gdzie logika jest bardziej z\u0142o\u017cona.Je\u015bli podczas iteracji trzeba: wtedy zwyk\u0142a p\u0119tla for bywa lepsza.Przyk\u0142ad z\u0142ego uproszczenia to pr\u00f3ba upchni\u0119cia ca\u0142ej logiki w jednej linii generatora. Kod staje si\u0119 kr\u00f3tki, ale nieczytelny.Druga rzecz to liczby zmiennoprzecinkowe. Dla warto\u015bci typu float mog\u0105 pojawi\u0107 si\u0119 b\u0142\u0119dy reprezentacji binarnej.Przyk\u0142ad: sum([0.1, 0.2]) wynik mo\u017ce wygl\u0105da\u0107 inaczej ni\u017c oczekiwane 0.3.W finansach lepiej u\u017cywa\u0107 decimal.Decimal, bo r\u00f3\u017cnica jednego grosza przy tysi\u0105cach operacji przestaje by\u0107 drobiazgiem. FAQ Czy sum() dzia\u0142a na s\u0142ownikach? Tak, ale domy\u015blnie sumowane s\u0105 klucze, nie warto\u015bci. Kod Wynik sum({1: &#8222;a&#8221;, 2: &#8222;b&#8221;}) 3 Je\u015bli potrzebne s\u0105 warto\u015bci liczbowe: Kod sum(slownik.values()) Czy sum() jest szybsze ni\u017c r\u0119czna p\u0119tla? Najcz\u0119\u015bciej tak lub por\u00f3wnywalnie, ale g\u0142\u00f3wn\u0105 zalet\u0105 jest czytelno\u015b\u0107. R\u00f3\u017cnice wydajno\u015bci zwykle nie s\u0105 kluczowe przy ma\u0142ych danych. Czy mo\u017cna u\u017cywa\u0107 sum() dla warto\u015bci logicznych? Tak, poniewa\u017c True ma warto\u015b\u0107 1, a False ma warto\u015b\u0107 0. Kod Wynik sum([True, False, True]) 2 To jest bardzo wygodne przy liczeniu spe\u0142nionych warunk\u00f3w. Czy sum() dzia\u0142a na set? Tak, je\u015bli elementy s\u0105 liczbami. Kod Wynik sum({2, 4, 6}) 12 Trzeba tylko pami\u0119ta\u0107, \u017ce zbi\u00f3r nie zachowuje kolejno\u015bci. Kiedy lepiej nie u\u017cywa\u0107 sum()? Gdy operacja nie jest zwyk\u0142ym dodawaniem albo gdy potrzebna jest rozbudowana kontrola nad przebiegiem p\u0119tli. Wtedy klasyczny for jest bardziej przewidywalny. Zako\u0144czenie sum() jest jedn\u0105 z tych funkcji, kt\u00f3re wygl\u0105daj\u0105 na ma\u0142e i nieistotne, dop\u00f3ki nie zacznie si\u0119 pisa\u0107 wi\u0119kszej ilo\u015bci kodu. Potem okazuje si\u0119, \u017ce pojawia si\u0119 wsz\u0119dzie: w analizie danych, algorytmach, raportach, walidacji i prostych skryptach administracyjnych. Dobrze rozumiane podstawy zwykle daj\u0105 wi\u0119ksz\u0105 przewag\u0119 ni\u017c skomplikowane sztuczki, a tutaj w\u0142a\u015bnie o to chodzi. \u0179r\u00f3d\u0142o Foto: Freepik<\/p>\n","protected":false},"author":1,"featured_media":1547,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[27],"tags":[],"class_list":["post-1546","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\/1546","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=1546"}],"version-history":[{"count":1,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1546\/revisions"}],"predecessor-version":[{"id":1548,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1546\/revisions\/1548"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/media\/1547"}],"wp:attachment":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/media?parent=1546"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/categories?post=1546"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/tags?post=1546"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}