{"id":1523,"date":"2026-04-20T15:37:39","date_gmt":"2026-04-20T13:37:39","guid":{"rendered":"https:\/\/trzykody.pl\/?p=1523"},"modified":"2026-04-28T15:46:04","modified_gmt":"2026-04-28T13:46:04","slug":"range-generuje-sekwencje-liczb-calkowitych","status":"publish","type":"post","link":"https:\/\/trzykody.pl\/index.php\/2026\/04\/20\/range-generuje-sekwencje-liczb-calkowitych\/","title":{"rendered":"Range \u2013 generuje sekwencj\u0119 liczb ca\u0142kowitych"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Sekwencje liczb ca\u0142kowitych pojawiaj\u0105 si\u0119 praktycznie wsz\u0119dzie: w p\u0119tlach, indeksowaniu tablic, analizie danych, testach algorytm\u00f3w i generowaniu zakres\u00f3w warto\u015bci wej\u015bciowych. Programista bardzo szybko zauwa\u017ca, \u017ce r\u0119czne wypisywanie kolejnych liczb jest nie tylko niewygodne, ale te\u017c podatne na b\u0142\u0119dy. Potrzebny jest mechanizm prosty, przewidywalny i tani obliczeniowo, kt\u00f3ry pozwala utworzy\u0107 ci\u0105g warto\u015bci wed\u0142ug jasno okre\u015blonych zasad &#8211; w\u0142a\u015bnie tak dzia\u0142a Range.<\/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=\"#range-generuje-sekwencje-liczb-calkowitych-i-dlaczego-ten-mechanizm-jest-tak-czesto-uzywany-w-codziennej-pracy-programisty\">Range \u2013 generuje sekwencj\u0119 liczb ca\u0142kowitych i dlaczego ten mechanizm jest tak cz\u0119sto u\u017cywany w codziennej pracy programisty<\/a><\/li><li><a href=\"#parametry-start-stop-i-step-decyduja-o-calym-zachowaniu-zakresu-liczb\">Parametry start stop i step decyduj\u0105 o ca\u0142ym zachowaniu zakresu liczb<\/a><ol><li><a href=\"#tabela-podstawowych-zapisow-i-ich-interpretacji\">Tabela podstawowych zapis\u00f3w i ich interpretacji<\/a><\/li><li><a href=\"#tabela-prostych-zaleznosci-matematycznych\">Tabela prostych zale\u017cno\u015bci matematycznych<\/a><\/li><\/ol><\/li><li><a href=\"#range-generuje-sekwencje-liczb-calkowitych-podczas-pracy-z-petlami-i-indeksami-tablic\">Range \u2013 generuje sekwencj\u0119 liczb ca\u0142kowitych podczas pracy z p\u0119tlami i indeksami tablic<\/a><ol><li><a href=\"#tabela-przykladow-w-pythonie\">Tabela przyk\u0142ad\u00f3w w Pythonie<\/a><\/li><li><a href=\"#tabela-przykladu-indeksowania\">Tabela przyk\u0142adu indeksowania<\/a><\/li><\/ol><\/li><li><a href=\"#odpowiedniki-w-c-i-c-nie-sa-funkcja-range-ale-realizuja-dokladnie-te-sama-idee\">Odpowiedniki w C i C++ nie s\u0105 funkcj\u0105 range ale realizuj\u0105 dok\u0142adnie t\u0119 sam\u0105 ide\u0119<\/a><ol><li><a href=\"#tabela-przykladow-w-c\">Tabela przyk\u0142ad\u00f3w w C<\/a><\/li><li><a href=\"#tabela-przykladow-w-c-1\">Tabela przyk\u0142ad\u00f3w w C++<\/a><\/li><\/ol><\/li><li><a href=\"#range-generuje-sekwencje-liczb-calkowitych-rowniez-w-zadaniach-algorytmicznych-i-analizie-danych\">Range \u2013 generuje sekwencj\u0119 liczb ca\u0142kowitych r\u00f3wnie\u017c w zadaniach algorytmicznych i analizie danych<\/a><ol><li><a href=\"#tabela-przykladu-algorytmicznego-w-pythonie\">Tabela przyk\u0142adu algorytmicznego w Pythonie<\/a><\/li><li><a href=\"#tabela-wzoru-matematycznego\">Tabela wzoru matematycznego<\/a><\/li><\/ol><\/li><li><a href=\"#typowe-pulapki-ktore-zabieraja-czas-i-powoduja-bledy-trudne-do-znalezienia\">Typowe pu\u0142apki kt\u00f3re zabieraj\u0105 czas i powoduj\u0105 b\u0142\u0119dy trudne do znalezienia<\/a><ol><li><a href=\"#tabela-nieefektywnych-i-poprawnych-zapisow\">Tabela nieefektywnych i poprawnych zapis\u00f3w<\/a><\/li><\/ol><\/li><li><a href=\"#uwagi-praktyczne-z-pracy-nad-kodem-ktory-ma-dzialac-dlugo-a-nie-tylko-przejsc-jeden-test\">Uwagi praktyczne z pracy nad kodem kt\u00f3ry ma dzia\u0142a\u0107 d\u0142ugo a nie tylko przej\u015b\u0107 jeden test<\/a><\/li><li><a href=\"#faq\">FAQ<\/a><ol><li><a href=\"#czy-wartosc-koncowa-w-range-jest-wliczana\">Czy warto\u015b\u0107 ko\u0144cowa w range jest wliczana?<\/a><\/li><li><a href=\"#dlaczego-krok-nie-moze-byc-rowny-zero\">Dlaczego krok nie mo\u017ce by\u0107 r\u00f3wny zero?<\/a><\/li><li><a href=\"#czy-range-w-pythonie-tworzy-pelna-liste-liczb\">Czy range w Pythonie tworzy pe\u0142n\u0105 list\u0119 liczb?<\/a><\/li><li><a href=\"#kiedy-lepiej-uzywac-indeksow-niz-bezposredniej-iteracji-po-elementach\">Kiedy lepiej u\u017cywa\u0107 indeks\u00f3w ni\u017c bezpo\u015bredniej iteracji po elementach?<\/a><\/li><li><a href=\"#czy-w-c-istnieje-funkcja-identyczna-jak-pythonowe-range\">Czy w C istnieje funkcja identyczna jak Pythonowe range?<\/a><\/li><li><a href=\"#dlaczego-range-10-0-nic-nie-zwraca\">Dlaczego range(10, 0) nic nie zwraca?<\/a><\/li><\/ol><\/li><\/ol><\/nav><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"range-generuje-sekwencje-liczb-calkowitych-i-dlaczego-ten-mechanizm-jest-tak-czesto-uzywany-w-codziennej-pracy-programisty\">Range \u2013 generuje sekwencj\u0119 liczb ca\u0142kowitych i dlaczego ten mechanizm jest tak cz\u0119sto u\u017cywany w codziennej pracy programisty<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Poj\u0119cie range najcz\u0119\u015bciej oznacza generator lub konstrukcj\u0119 tworz\u0105c\u0105 uporz\u0105dkowany ci\u0105g liczb ca\u0142kowitych od warto\u015bci pocz\u0105tkowej do ko\u0144cowej, z okre\u015blonym krokiem przej\u015bcia. Najprostszy przyk\u0142ad to liczby od 1 do 10, ale w praktyce r\u00f3wnie cz\u0119sto potrzebne s\u0105 zakresy malej\u0105ce, zakresy co 2, co 5 albo nawet co -1.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To nie jest tylko wygoda sk\u0142adni. Range pozwala unikn\u0105\u0107 r\u0119cznego sterowania licznikiem i zmniejsza liczb\u0119 b\u0142\u0119d\u00f3w logicznych. Bardzo cz\u0119sty problem pocz\u0105tkuj\u0105cych to pomy\u0142ka typu \u201eczy g\u00f3rna granica jest wliczana czy nie\u201d. W wielu j\u0119zykach programowania zakres ko\u0144czy si\u0119 tu\u017c przed warto\u015bci\u0105 ko\u0144cow\u0105, co ma ogromne znaczenie przy pracy na indeksach.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">W Pythonie <code>range()<\/code> nie tworzy od razu pe\u0142nej listy liczb. To wa\u017cne. Zwraca obiekt iterowalny, kt\u00f3ry generuje warto\u015bci w trakcie dzia\u0142ania programu. Dzi\u0119ki temu mo\u017cna przej\u015b\u0107 przez milion element\u00f3w bez zajmowania pami\u0119ci na milion liczb jednocze\u015bnie.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">W C i C++ nie istnieje dok\u0142adnie taka sama funkcja w standardzie proceduralnym, ale idea jest realizowana przez p\u0119tle <code>for<\/code>, liczniki oraz w\u0142asne generatory.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"parametry-start-stop-i-step-decyduja-o-calym-zachowaniu-zakresu-liczb\">Parametry start stop i step decyduj\u0105 o ca\u0142ym zachowaniu zakresu liczb<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Najcz\u0119\u015bciej range opiera si\u0119 na trzech parametrach:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>warto\u015b\u0107 pocz\u0105tkowa (<code>start<\/code>)<\/li>\n\n\n\n<li>warto\u015b\u0107 ko\u0144cowa (<code>stop<\/code>)<\/li>\n\n\n\n<li>krok (<code>step<\/code>)<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Najwi\u0119cej pomy\u0142ek dotyczy parametru <code>stop<\/code>, poniewa\u017c zwykle nie nale\u017cy on do wyniku.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"tabela-podstawowych-zapisow-i-ich-interpretacji\">Tabela podstawowych zapis\u00f3w i ich interpretacji<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Zapis<\/th><th>Wynik logiczny<\/th><\/tr><\/thead><tbody><tr><td><code>range(5)<\/code><\/td><td>0, 1, 2, 3, 4<\/td><\/tr><tr><td><code>range(2, 7)<\/code><\/td><td>2, 3, 4, 5, 6<\/td><\/tr><tr><td><code>range(1, 10, 2)<\/code><\/td><td>1, 3, 5, 7, 9<\/td><\/tr><tr><td><code>range(10, 0, -2)<\/code><\/td><td>10, 8, 6, 4, 2<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Warto zauwa\u017cy\u0107 dwie rzeczy:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Po pierwsze, brak <code>start<\/code> oznacza automatycznie pocz\u0105tek od zera.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Po drugie, je\u015bli krok jest dodatni, a <code>start &gt; stop<\/code>, zakres b\u0119dzie pusty. Program nie zg\u0142osi b\u0142\u0119du logicznego, tylko po prostu nic nie wykona. To cz\u0119sto prowadzi do trudnych do zauwa\u017cenia problem\u00f3w.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"tabela-prostych-zaleznosci-matematycznych\">Tabela prostych zale\u017cno\u015bci matematycznych<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Zagadnienie<\/th><th>Wz\u00f3r<\/th><\/tr><\/thead><tbody><tr><td>Liczba element\u00f3w dla kroku dodatniego<\/td><td><code>n = ceil((stop - start) \/ step)<\/code><\/td><\/tr><tr><td>Warunek poprawno\u015bci kroku<\/td><td><code>step \u2260 0<\/code><\/td><\/tr><tr><td>Zakres malej\u0105cy<\/td><td><code>step &lt; 0<\/code><\/td><\/tr><tr><td>Zakres rosn\u0105cy<\/td><td><code>step &gt; 0<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Krok r\u00f3wny zero jest niedozwolony. Taki przypadek nie ma sensu, bo iterator nigdy nie przesuwa\u0142by si\u0119 dalej.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"range-generuje-sekwencje-liczb-calkowitych-podczas-pracy-z-petlami-i-indeksami-tablic\">Range \u2013 generuje sekwencj\u0119 liczb ca\u0142kowitych podczas pracy z p\u0119tlami i indeksami tablic<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Najbardziej klasyczne u\u017cycie dotyczy p\u0119tli.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Programista nie chce pisa\u0107:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u201ewykonaj operacj\u0119 pi\u0119\u0107 razy\u201d<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">tylko:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u201edla i od 0 do 4 wykonaj operacj\u0119\u201d.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To jest czytelniejsze i pozwala u\u017cywa\u0107 zmiennej steruj\u0105cej jako indeksu.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"tabela-przykladow-w-pythonie\">Tabela przyk\u0142ad\u00f3w w Pythonie<\/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>Prosta p\u0119tla<\/td><td><code>python\\nfor i in range(5):\\n print(i)\\n<\/code><\/td><\/tr><tr><td>Iteracja od 1 do 10<\/td><td><code>python\\nfor i in range(1, 11):\\n print(i)\\n<\/code><\/td><\/tr><tr><td>Co drugi element<\/td><td><code>python\\nfor i in range(0, 20, 2):\\n print(i)\\n<\/code><\/td><\/tr><tr><td>P\u0119tla malej\u0105ca<\/td><td><code>python\\nfor i in range(10, 0, -1):\\n print(i)\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">W praktyce indeksowanie tablic bardzo cz\u0119sto wygl\u0105da tak:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"tabela-przykladu-indeksowania\">Tabela przyk\u0142adu indeksowania<\/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 = [10, 20, 30, 40]\\n\\nfor i in range(len(dane)):\\n print(i, dane[i])\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Dzisiaj cz\u0119\u015bciej u\u017cywa si\u0119 konstrukcji bezpo\u015bredniej iteracji po elementach, ale znajomo\u015b\u0107 indeks\u00f3w nadal jest obowi\u0105zkowa przy algorytmach sortowania, grafach i dynamic programming.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"odpowiedniki-w-c-i-c-nie-sa-funkcja-range-ale-realizuja-dokladnie-te-sama-idee\">Odpowiedniki w C i C++ nie s\u0105 funkcj\u0105 range ale realizuj\u0105 dok\u0142adnie t\u0119 sam\u0105 ide\u0119<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">W j\u0119zyku C programista sam kontroluje licznik.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"tabela-przykladow-w-c\">Tabela przyk\u0142ad\u00f3w w C<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Przypadek<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>Zakres rosn\u0105cy<\/td><td><code>c\\n#include &lt;stdio.h&gt;\\n\\nint main() {\\n int i;\\n for(i = 0; i &lt; 5; i++) {\\n printf(\\\"%d\\\\n\\\", i);\\n }\\n return 0;\\n}\\n<\/code><\/td><\/tr><tr><td>Zakres malej\u0105cy<\/td><td><code>c\\n#include &lt;stdio.h&gt;\\n\\nint main() {\\n int i;\\n for(i = 10; i &gt; 0; i--) {\\n printf(\\\"%d\\\\n\\\", i);\\n }\\n return 0;\\n}\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">W C++ mo\u017cna pisa\u0107 podobnie proceduralnie:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"tabela-przykladow-w-c-1\">Tabela przyk\u0142ad\u00f3w w C++<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Przypadek<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>Klasyczny for<\/td><td><code>cpp\\n#include &lt;iostream&gt;\\nusing namespace std;\\n\\nint main() {\\n for(int i = 1; i &lt;= 5; i++) {\\n cout &lt;&lt; i &lt;&lt; endl;\\n }\\n return 0;\\n}\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">R\u00f3\u017cnica polega na tym, \u017ce Python dostarcza gotowy obiekt zakresu, a C\/C++ pozostawia pe\u0142n\u0105 kontrol\u0119 programi\u015bcie.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To daje wi\u0119ksz\u0105 elastyczno\u015b\u0107, ale te\u017c wi\u0119cej okazji do b\u0142\u0119d\u00f3w typu:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>z\u0142y warunek ko\u0144ca<\/li>\n\n\n\n<li>niesko\u0144czona p\u0119tla<\/li>\n\n\n\n<li>pomy\u0142ka <code>i++<\/code> i <code>i--<\/code><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"range-generuje-sekwencje-liczb-calkowitych-rowniez-w-zadaniach-algorytmicznych-i-analizie-danych\">Range \u2013 generuje sekwencj\u0119 liczb ca\u0142kowitych r\u00f3wnie\u017c w zadaniach algorytmicznych i analizie danych<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">W zadaniach akademickich range pojawia si\u0119 stale:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>generowanie testowych danych wej\u015bciowych<\/li>\n\n\n\n<li>przegl\u0105d wszystkich wierzcho\u0142k\u00f3w grafu<\/li>\n\n\n\n<li>dynamic programming<\/li>\n\n\n\n<li>tablice prefiksowe<\/li>\n\n\n\n<li>algorytmy sortowania<\/li>\n\n\n\n<li>wyszukiwanie binarne<\/li>\n\n\n\n<li>symulacje matematyczne<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ad: suma liczb od 1 do N.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"tabela-przykladu-algorytmicznego-w-pythonie\">Tabela przyk\u0142adu algorytmicznego w Pythonie<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Zadanie<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>Suma od 1 do N<\/td><td><code>python\\nn = 100\\nsuma = 0\\n\\nfor i in range(1, n + 1):\\n suma += i\\n\\nprint(suma)\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Formalnie mo\u017cna to policzy\u0107 szybciej:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"tabela-wzoru-matematycznego\">Tabela wzoru matematycznego<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Problem<\/th><th>Wz\u00f3r<\/th><\/tr><\/thead><tbody><tr><td>Suma liczb od 1 do n<\/td><td><code>S = n(n + 1) \/ 2<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Ale w realnych programach cz\u0119sto nie sumujemy prostych liczb, tylko warto\u015bci wynikaj\u0105ce z warunk\u00f3w, filtr\u00f3w i oblicze\u0144 po\u015brednich. Wtedy iteracja jest konieczna.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"typowe-pulapki-ktore-zabieraja-czas-i-powoduja-bledy-trudne-do-znalezienia\">Typowe pu\u0142apki kt\u00f3re zabieraj\u0105 czas i powoduj\u0105 b\u0142\u0119dy trudne do znalezienia<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Najcz\u0119stszy b\u0142\u0105d to niezrozumienie granicy ko\u0144cowej.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Programista oczekuje:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">1 do 10<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">a pisze:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">range(1, 10)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">i dostaje tylko do 9.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To klasyczny problem.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Druga pu\u0142apka to krok ujemny.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Je\u015bli kto\u015b zapisze:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">range(10, 1)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">otrzyma pusty wynik, poniewa\u017c Python zak\u0142ada krok dodatni. Trzeba jawnie poda\u0107:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">range(10, 1, -1)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Trzecia pu\u0142apka to niepotrzebna konwersja do listy.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"tabela-nieefektywnych-i-poprawnych-zapisow\">Tabela nieefektywnych i poprawnych zapis\u00f3w<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Wersja<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>Gorsza pami\u0119ciowo<\/td><td><code>python\\nlista = list(range(1000000))\\n<\/code><\/td><\/tr><tr><td>Lepsza przy iteracji<\/td><td><code>python\\nfor i in range(1000000):\\n pass\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Tworzenie ogromnej listy bez potrzeby potrafi niepotrzebnie zwi\u0119kszy\u0107 zu\u017cycie pami\u0119ci i spowolni\u0107 program.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"uwagi-praktyczne-z-pracy-nad-kodem-ktory-ma-dzialac-dlugo-a-nie-tylko-przejsc-jeden-test\">Uwagi praktyczne z pracy nad kodem kt\u00f3ry ma dzia\u0142a\u0107 d\u0142ugo a nie tylko przej\u015b\u0107 jeden test<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Je\u017celi zakres steruje indeksem tablicy, zawsze warto jeszcze raz sprawdzi\u0107:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>czy ostatni indeks istnieje<\/li>\n\n\n\n<li>czy nie wychodzimy poza rozmiar<\/li>\n\n\n\n<li>czy p\u0119tla nie pomija pierwszego lub ostatniego elementu<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">W zadaniach rekrutacyjnych i na egzaminach bardzo du\u017co b\u0142\u0119d\u00f3w nie wynika z trudnego algorytmu, tylko w\u0142a\u015bnie z niepoprawnie ustawionego zakresu.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Druga rzecz: przy du\u017cych danych lepiej my\u015ble\u0107 o iteratorach ni\u017c o gotowych listach. To szczeg\u00f3lnie wa\u017cne w Pythonie.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Trzecia rzecz: warto \u015bwiadomie wybiera\u0107 mi\u0119dzy iteracj\u0105 po indeksach a iteracj\u0105 po elementach. Je\u015bli indeks nie jest potrzebny, prostszy kod zwykle jest lepszy.<\/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-wartosc-koncowa-w-range-jest-wliczana\">Czy warto\u015b\u0107 ko\u0144cowa w range jest wliczana?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Najcz\u0119\u015bciej nie. <code>stop<\/code> oznacza granic\u0119 wy\u0142\u0105czn\u0105. <code>range(1, 5)<\/code> daje 1, 2, 3, 4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"dlaczego-krok-nie-moze-byc-rowny-zero\">Dlaczego krok nie mo\u017ce by\u0107 r\u00f3wny zero?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Bo iterator nie przesuwa\u0142by si\u0119 dalej i prowadzi\u0142by do logicznie niesko\u0144czonego dzia\u0142ania. Taki zapis jest b\u0142\u0119dem.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-range-w-pythonie-tworzy-pelna-liste-liczb\">Czy range w Pythonie tworzy pe\u0142n\u0105 list\u0119 liczb?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Nie. Tworzy obiekt iterowalny, kt\u00f3ry generuje warto\u015bci w trakcie dzia\u0142ania programu. To oszcz\u0119dza pami\u0119\u0107.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"kiedy-lepiej-uzywac-indeksow-niz-bezposredniej-iteracji-po-elementach\">Kiedy lepiej u\u017cywa\u0107 indeks\u00f3w ni\u017c bezpo\u015bredniej iteracji po elementach?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Gdy potrzebny jest numer pozycji, por\u00f3wnywanie s\u0105siednich element\u00f3w, modyfikacja konkretnego indeksu albo implementacja algorytmu tablicowego.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-w-c-istnieje-funkcja-identyczna-jak-pythonowe-range\">Czy w C istnieje funkcja identyczna jak Pythonowe range?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Nie w standardowej formie. Najcz\u0119\u015bciej u\u017cywa si\u0119 klasycznej p\u0119tli <code>for<\/code>, kt\u00f3ra realizuje t\u0119 sam\u0105 ide\u0119.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"dlaczego-range-10-0-nic-nie-zwraca\">Dlaczego <code>range(10, 0)<\/code> nic nie zwraca?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Bo domy\u015blny krok jest dodatni. Dla zakresu malej\u0105cego trzeba jawnie poda\u0107 krok ujemny, na przyk\u0142ad <code>range(10, 0, -1)<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Zakres liczb ca\u0142kowitych wydaje si\u0119 drobiazgiem, dop\u00f3ki nie zaczyna sterowa\u0107 wa\u017cnym fragmentem algorytmu. Wtedy okazuje si\u0119, \u017ce poprawnie ustawione granice p\u0119tli decyduj\u0105 o poprawno\u015bci ca\u0142ego programu. To jedna z tych prostych konstrukcji, kt\u00f3re trzeba rozumie\u0107 dok\u0142adnie, a nie tylko \u201emniej wi\u0119cej\u201d.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>\u0179r\u00f3d\u0142o Foto: Freepik<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Sekwencje liczb ca\u0142kowitych pojawiaj\u0105 si\u0119 praktycznie wsz\u0119dzie: w p\u0119tlach, indeksowaniu tablic, analizie danych, testach algorytm\u00f3w i generowaniu zakres\u00f3w warto\u015bci wej\u015bciowych. Programista bardzo szybko zauwa\u017ca, \u017ce r\u0119czne wypisywanie kolejnych liczb jest nie tylko niewygodne, ale te\u017c podatne na b\u0142\u0119dy. Potrzebny jest mechanizm prosty, przewidywalny i tani obliczeniowo, kt\u00f3ry pozwala utworzy\u0107 ci\u0105g warto\u015bci wed\u0142ug jasno okre\u015blonych zasad &#8211; w\u0142a\u015bnie tak dzia\u0142a Range. Range \u2013 generuje sekwencj\u0119 liczb ca\u0142kowitych i dlaczego ten mechanizm jest tak cz\u0119sto u\u017cywany w codziennej pracy programisty Poj\u0119cie range najcz\u0119\u015bciej oznacza generator lub konstrukcj\u0119 tworz\u0105c\u0105 uporz\u0105dkowany ci\u0105g liczb ca\u0142kowitych od warto\u015bci pocz\u0105tkowej do ko\u0144cowej, z okre\u015blonym krokiem przej\u015bcia. Najprostszy przyk\u0142ad to liczby od 1 do 10, ale w praktyce r\u00f3wnie cz\u0119sto potrzebne s\u0105 zakresy malej\u0105ce, zakresy co 2, co 5 albo nawet co -1. To nie jest tylko wygoda sk\u0142adni. Range pozwala unikn\u0105\u0107 r\u0119cznego sterowania licznikiem i zmniejsza liczb\u0119 b\u0142\u0119d\u00f3w logicznych. Bardzo cz\u0119sty problem pocz\u0105tkuj\u0105cych to pomy\u0142ka typu \u201eczy g\u00f3rna granica jest wliczana czy nie\u201d. W wielu j\u0119zykach programowania zakres ko\u0144czy si\u0119 tu\u017c przed warto\u015bci\u0105 ko\u0144cow\u0105, co ma ogromne znaczenie przy pracy na indeksach. W Pythonie range() nie tworzy od razu pe\u0142nej listy liczb. To wa\u017cne. Zwraca obiekt iterowalny, kt\u00f3ry generuje warto\u015bci w trakcie dzia\u0142ania programu. Dzi\u0119ki temu mo\u017cna przej\u015b\u0107 przez milion element\u00f3w bez zajmowania pami\u0119ci na milion liczb jednocze\u015bnie. W C i C++ nie istnieje dok\u0142adnie taka sama funkcja w standardzie proceduralnym, ale idea jest realizowana przez p\u0119tle for, liczniki oraz w\u0142asne generatory. Parametry start stop i step decyduj\u0105 o ca\u0142ym zachowaniu zakresu liczb Najcz\u0119\u015bciej range opiera si\u0119 na trzech parametrach: Najwi\u0119cej pomy\u0142ek dotyczy parametru stop, poniewa\u017c zwykle nie nale\u017cy on do wyniku. Tabela podstawowych zapis\u00f3w i ich interpretacji Zapis Wynik logiczny range(5) 0, 1, 2, 3, 4 range(2, 7) 2, 3, 4, 5, 6 range(1, 10, 2) 1, 3, 5, 7, 9 range(10, 0, -2) 10, 8, 6, 4, 2 Warto zauwa\u017cy\u0107 dwie rzeczy: Po pierwsze, brak start oznacza automatycznie pocz\u0105tek od zera. Po drugie, je\u015bli krok jest dodatni, a start &gt; stop, zakres b\u0119dzie pusty. Program nie zg\u0142osi b\u0142\u0119du logicznego, tylko po prostu nic nie wykona. To cz\u0119sto prowadzi do trudnych do zauwa\u017cenia problem\u00f3w. Tabela prostych zale\u017cno\u015bci matematycznych Zagadnienie Wz\u00f3r Liczba element\u00f3w dla kroku dodatniego n = ceil((stop &#8211; start) \/ step) Warunek poprawno\u015bci kroku step \u2260 0 Zakres malej\u0105cy step &lt; 0 Zakres rosn\u0105cy step &gt; 0 Krok r\u00f3wny zero jest niedozwolony. Taki przypadek nie ma sensu, bo iterator nigdy nie przesuwa\u0142by si\u0119 dalej. Range \u2013 generuje sekwencj\u0119 liczb ca\u0142kowitych podczas pracy z p\u0119tlami i indeksami tablic Najbardziej klasyczne u\u017cycie dotyczy p\u0119tli. Programista nie chce pisa\u0107: \u201ewykonaj operacj\u0119 pi\u0119\u0107 razy\u201d tylko: \u201edla i od 0 do 4 wykonaj operacj\u0119\u201d. To jest czytelniejsze i pozwala u\u017cywa\u0107 zmiennej steruj\u0105cej jako indeksu. Tabela przyk\u0142ad\u00f3w w Pythonie Przyk\u0142ad Kod Prosta p\u0119tla python\\nfor i in range(5):\\n print(i)\\n Iteracja od 1 do 10 python\\nfor i in range(1, 11):\\n print(i)\\n Co drugi element python\\nfor i in range(0, 20, 2):\\n print(i)\\n P\u0119tla malej\u0105ca python\\nfor i in range(10, 0, -1):\\n print(i)\\n W praktyce indeksowanie tablic bardzo cz\u0119sto wygl\u0105da tak: Tabela przyk\u0142adu indeksowania J\u0119zyk Kod Python python\\ndane = [10, 20, 30, 40]\\n\\nfor i in range(len(dane)):\\n print(i, dane[i])\\n Dzisiaj cz\u0119\u015bciej u\u017cywa si\u0119 konstrukcji bezpo\u015bredniej iteracji po elementach, ale znajomo\u015b\u0107 indeks\u00f3w nadal jest obowi\u0105zkowa przy algorytmach sortowania, grafach i dynamic programming. Odpowiedniki w C i C++ nie s\u0105 funkcj\u0105 range ale realizuj\u0105 dok\u0142adnie t\u0119 sam\u0105 ide\u0119 W j\u0119zyku C programista sam kontroluje licznik. Tabela przyk\u0142ad\u00f3w w C Przypadek Kod Zakres rosn\u0105cy c\\n#include &lt;stdio.h&gt;\\n\\nint main() {\\n int i;\\n for(i = 0; i &lt; 5; i++) {\\n printf(\\&#8221;%d\\\\n\\&#8221;, i);\\n }\\n return 0;\\n}\\n Zakres malej\u0105cy c\\n#include &lt;stdio.h&gt;\\n\\nint main() {\\n int i;\\n for(i = 10; i &gt; 0; i&#8211;) {\\n printf(\\&#8221;%d\\\\n\\&#8221;, i);\\n }\\n return 0;\\n}\\n W C++ mo\u017cna pisa\u0107 podobnie proceduralnie: Tabela przyk\u0142ad\u00f3w w C++ Przypadek Kod Klasyczny for cpp\\n#include &lt;iostream&gt;\\nusing namespace std;\\n\\nint main() {\\n for(int i = 1; i &lt;= 5; i++) {\\n cout &lt;&lt; i &lt;&lt; endl;\\n }\\n return 0;\\n}\\n R\u00f3\u017cnica polega na tym, \u017ce Python dostarcza gotowy obiekt zakresu, a C\/C++ pozostawia pe\u0142n\u0105 kontrol\u0119 programi\u015bcie. To daje wi\u0119ksz\u0105 elastyczno\u015b\u0107, ale te\u017c wi\u0119cej okazji do b\u0142\u0119d\u00f3w typu: Range \u2013 generuje sekwencj\u0119 liczb ca\u0142kowitych r\u00f3wnie\u017c w zadaniach algorytmicznych i analizie danych W zadaniach akademickich range pojawia si\u0119 stale: Przyk\u0142ad: suma liczb od 1 do N. Tabela przyk\u0142adu algorytmicznego w Pythonie Zadanie Kod Suma od 1 do N python\\nn = 100\\nsuma = 0\\n\\nfor i in range(1, n + 1):\\n suma += i\\n\\nprint(suma)\\n Formalnie mo\u017cna to policzy\u0107 szybciej: Tabela wzoru matematycznego Problem Wz\u00f3r Suma liczb od 1 do n S = n(n + 1) \/ 2 Ale w realnych programach cz\u0119sto nie sumujemy prostych liczb, tylko warto\u015bci wynikaj\u0105ce z warunk\u00f3w, filtr\u00f3w i oblicze\u0144 po\u015brednich. Wtedy iteracja jest konieczna. Typowe pu\u0142apki kt\u00f3re zabieraj\u0105 czas i powoduj\u0105 b\u0142\u0119dy trudne do znalezienia Najcz\u0119stszy b\u0142\u0105d to niezrozumienie granicy ko\u0144cowej. Programista oczekuje: 1 do 10 a pisze: range(1, 10) i dostaje tylko do 9. To klasyczny problem. Druga pu\u0142apka to krok ujemny. Je\u015bli kto\u015b zapisze: range(10, 1) otrzyma pusty wynik, poniewa\u017c Python zak\u0142ada krok dodatni. Trzeba jawnie poda\u0107: range(10, 1, -1) Trzecia pu\u0142apka to niepotrzebna konwersja do listy. Tabela nieefektywnych i poprawnych zapis\u00f3w Wersja Kod Gorsza pami\u0119ciowo python\\nlista = list(range(1000000))\\n Lepsza przy iteracji python\\nfor i in range(1000000):\\n pass\\n Tworzenie ogromnej listy bez potrzeby potrafi niepotrzebnie zwi\u0119kszy\u0107 zu\u017cycie pami\u0119ci i spowolni\u0107 program. Uwagi praktyczne z pracy nad kodem kt\u00f3ry ma dzia\u0142a\u0107 d\u0142ugo a nie tylko przej\u015b\u0107 jeden test Je\u017celi zakres steruje indeksem tablicy, zawsze warto jeszcze raz sprawdzi\u0107: W zadaniach rekrutacyjnych i na egzaminach bardzo du\u017co b\u0142\u0119d\u00f3w nie wynika z trudnego algorytmu, tylko w\u0142a\u015bnie z niepoprawnie ustawionego zakresu. Druga rzecz: przy du\u017cych danych lepiej my\u015ble\u0107 o iteratorach ni\u017c o gotowych listach. To szczeg\u00f3lnie wa\u017cne w Pythonie. Trzecia rzecz: warto \u015bwiadomie wybiera\u0107 mi\u0119dzy iteracj\u0105 po indeksach a iteracj\u0105 po elementach. Je\u015bli indeks nie jest potrzebny, prostszy kod zwykle jest lepszy. FAQ Czy warto\u015b\u0107 ko\u0144cowa w range jest wliczana? Najcz\u0119\u015bciej nie. stop oznacza granic\u0119 wy\u0142\u0105czn\u0105. range(1, 5) daje 1, 2, 3, 4. Dlaczego krok nie mo\u017ce by\u0107 r\u00f3wny zero? Bo iterator nie przesuwa\u0142by si\u0119 dalej i prowadzi\u0142by do logicznie niesko\u0144czonego dzia\u0142ania. Taki zapis jest b\u0142\u0119dem. Czy range w Pythonie tworzy pe\u0142n\u0105 list\u0119 liczb? Nie. Tworzy obiekt iterowalny, kt\u00f3ry generuje warto\u015bci w trakcie dzia\u0142ania programu. To oszcz\u0119dza pami\u0119\u0107. Kiedy lepiej u\u017cywa\u0107 indeks\u00f3w ni\u017c bezpo\u015bredniej iteracji po elementach? Gdy potrzebny jest numer pozycji, por\u00f3wnywanie s\u0105siednich element\u00f3w, modyfikacja konkretnego indeksu albo implementacja algorytmu tablicowego. Czy w C istnieje funkcja identyczna jak Pythonowe range? Nie w standardowej formie. Najcz\u0119\u015bciej u\u017cywa si\u0119 klasycznej p\u0119tli for, kt\u00f3ra realizuje t\u0119 sam\u0105 ide\u0119. Dlaczego range(10, 0) nic nie zwraca? Bo domy\u015blny krok jest dodatni. Dla zakresu malej\u0105cego trzeba jawnie poda\u0107 krok ujemny, na przyk\u0142ad range(10, 0, -1). Zakres liczb ca\u0142kowitych wydaje si\u0119 drobiazgiem, dop\u00f3ki nie zaczyna sterowa\u0107 wa\u017cnym fragmentem algorytmu. Wtedy okazuje si\u0119, \u017ce poprawnie ustawione granice p\u0119tli decyduj\u0105 o poprawno\u015bci ca\u0142ego programu. To jedna z tych prostych konstrukcji, kt\u00f3re trzeba rozumie\u0107 dok\u0142adnie, a nie tylko \u201emniej wi\u0119cej\u201d. \u0179r\u00f3d\u0142o Foto: Freepik<\/p>\n","protected":false},"author":1,"featured_media":1524,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[27],"tags":[],"class_list":["post-1523","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\/1523","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=1523"}],"version-history":[{"count":1,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1523\/revisions"}],"predecessor-version":[{"id":1525,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1523\/revisions\/1525"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/media\/1524"}],"wp:attachment":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/media?parent=1523"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/categories?post=1523"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/tags?post=1523"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}