CINXE.COM
range Python с нуля до бесконечности
<!DOCTYPE html> <html lang="ru"> <head> <meta charset="utf-8"> <link rel="stylesheet" href="/pyplanet_tmpl/fonts/style.css"> <link rel="stylesheet" href="/pyplanet_tmpl/css/new_style.css"> <title>range Python с нуля до бесконечности</title> <meta name="description" content='Изучение объекта range в Python. Создание последовательностей чисел, использование в циклах и примеры применения.'> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="apple-touch-icon" sizes="76x76" href="/apple-touch-icon.png"> <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"> <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png"> <link rel="manifest" href="/site.webmanifest"> <link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5"> <meta name="msapplication-TileColor" content="#da532c"> <meta name="theme-color" content="#f5f5f5"> <script type="text/javascript" > (function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)}; m[i].l=1*new Date(); for (var j = 0; j < document.scripts.length; j++) {if (document.scripts[j].src === r) { return; }} k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)}) (window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym"); ym(97429815, "init", { clickmap:true, trackLinks:true, accurateTrackBounce:true, webvisor:true }); </script> <noscript><div><img src="https://mc.yandex.ru/watch/97429815" style="position:absolute; left:-9999px;" alt="" /></div></noscript> <script>window.yaContextCb=window.yaContextCb||[]</script> <script src="https://yandex.ru/ads/system/context.js" async></script> </head> <body> <header> <div class="logo"><a href="/"><img src="/pyplanet_tmpl/img/python-3.png"></a></div> <div class="logo-letters"><a href="/">Pyplanet — Python с нуля до бесконечности</a></div> </header> <div class="category-menu"> <a href="/category/osnovy.html">Основы</a> <a href="/category/enhanced.html">Продвинутый</a> <a href="/category/guidebook.html">Справочник</a> <a href="/pages/tutorials.html">Руководства</a> <a href="/pages/books.html">Книги</a> <a href="/pages/courses.html">Курсы</a> </div> <div class="main-content"> <div class="content"> <article class="post"> <h1>range</h1> <div class="text-block"> <div id="yandex_rtb_R-A-9079088-3" style="max-height: 10%"></div> <div id="content_top" style="display: none"> <a target="_blank" href="https://zallj.com/g/qqb62fps0r99b979a60661cec322b98fba714163/?erid=5jtCeReNwxHpfQTDve31wmc"> <img src="/pyplanet_tmpl/img/content_top.png"> </a> </div> <script> window.yaContextCb.push(() => { Ya.Context.AdvManager.render({ "blockId": "R-A-9079088-3", "renderTo": "yandex_rtb_R-A-9079088-3" }); }) setTimeout( function () { if (document.getElementById("yandex_rtb_R-A-9079088-3").clientHeight === 0) { document.getElementById("content_top").style.display = 'block'; } }, 500); </script> <p>Например, дана задача: в массиве чисел к каждому элементу прибавить его индекс. Можно эту задачу решить через цикл while, но всё же хотелось бы через for.</p> <p>Вот пример решения через цикл for:</p> <div class="highlight"><pre><span></span><span class="n">array</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="o">-</span><span class="mi">2</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="p">]</span> <span class="n">index</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">for</span> <span class="n">element</span> <span class="ow">in</span> <span class="n">array</span><span class="p">:</span> <span class="nb">print</span><span class="p">(</span><span class="n">element</span> <span class="o">+</span> <span class="n">index</span><span class="p">)</span> <span class="n">index</span> <span class="o">=</span> <span class="n">index</span> <span class="o">+</span> <span class="mi">1</span> </pre></div> <p>Нам понадобилась дополнительная переменная для хранения текущего индекса. Но хочется иметь способ сделать наоборот: брать индексы, а по ним иметь доступ к элементам. И желательно без дополнительной переменной.</p> <p>В Python так можно. А чтобы брать индексы, и в принципе последовательности чисел, есть функция <tt class="docutils literal">range</tt>:</p> <div class="highlight"><pre><span></span><span class="n">array</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="o">-</span><span class="mi">2</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="p">]</span> <span class="k">for</span> <span class="n">index</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">array</span><span class="p">)):</span> <span class="nb">print</span><span class="p">(</span><span class="n">index</span> <span class="o">+</span> <span class="n">array</span><span class="p">[</span><span class="n">index</span><span class="p">])</span> </pre></div> <p>Что же делает функция <tt class="docutils literal">range</tt>? Она, будучи вызвана с одним аргументом, возвращает объект, поддерживающий протокол итерирования, который "пробегает" значения от нуля до этого аргумента (<strong>не включая</strong> значение самого аргумента), с шагом 1.</p> <div class="note docutils container"> <p>Что такое "объект, поддерживающий протокол итерирования"? Это как список, или массив, но <strong>только</strong> для нужд цикла for. Если попробовать распечатать <tt class="docutils literal">range</tt>, то мы увидим не список значений:</p> <div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="nb">print</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="mi">10</span><span class="p">))</span> <span class="go">range(0, 10)</span> </pre></div> <p>Но в цикле for этот объект ведёт себя также, как и массив с числами от 0 до 10. И объект занимает меньше места в памяти, чем массив.</p> </div> <p>Если она вызвана с двумя аргументами, то возвращаемый объект "пробегает" значения от первого аргумента до второго.</p> <div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mi">8</span><span class="p">):</span> <span class="gp">... </span> <span class="nb">print</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="gp">...</span> <span class="go">5</span> <span class="go">6</span> <span class="go">7</span> </pre></div> <p>Если же функция <tt class="docutils literal">range</tt> вызвана с тремя аргументами, то третий аргумент - это шаг изменения значения. Он может быть и отрицательным:</p> <div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="o">-</span><span class="mi">2</span><span class="p">):</span> <span class="gp">... </span> <span class="nb">print</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="gp">...</span> <span class="go">8</span> <span class="go">6</span> </pre></div> <div id="yandex_rtb_R-A-9079088-1" style="max-height: 25%"></div> <div id="content_bottom" style="display: none"> <a target="_blank" href="https://zallj.com/g/qqb62fps0r99b979a60661cec322b98fba714163/?erid=5jtCeReNwxHpfQTDve31wmc"> <img src="/pyplanet_tmpl/img/content_bottom.png"> </a> </div> <script> window.yaContextCb.push(() => { Ya.Context.AdvManager.render({ "blockId": "R-A-9079088-1", "renderTo": "yandex_rtb_R-A-9079088-1" }); }) setTimeout( function () { if (document.getElementById("yandex_rtb_R-A-9079088-3").clientHeight === 0) { document.getElementById("content_bottom").style.display = 'block'; } }, 1000); </script> <nav class="nav-cycle"> <div> <a href="/article/for.html">← Предыдущая часть</a> </div> <div> <a href="/category/osnovy.html">В категорию "Основы Python"</a> </div> <div> <a href="/article/slice-object.html">Следующая часть →</a> </div> </nav> </div> </article> </div> <div class="sidebar"> <div class="sticky"> <div class="button-group"> <a target="_blank" href="https://t.me/pyplanet"><button class="telegram-button">✈ Telegram</button></a> <a target="_blank" href="https://www.tinkoff.ru/cf/6xIycbvJQF9"><button class="tinkoff-button">❤️ Поддержать</button></a> <a target="_blank" href="https://forms.gle/Trx4h8zZwKyBpsyY6"><button class="ask-button">❓ Задать вопрос</button></a> </div> <div class="latest-articles"> <h3>Популярные статьи</h3> <div class="article"> <h4><a href="https://pyplanet.ru/article/range-object.html">Объект range</a></h4> <p>Изучение объекта range в Python. Создание последовательностей чисел, использование в циклах и примеры применения.</p> </div> <div class="article"> <h4><a href="https://pyplanet.ru/article/pep-0257.html">PEP 257 - соглашения для строк документации (docstrings)</a></h4> <p>Целью данного PEP является стандартизация структуры строк документации: что они должны содержать и что должны объяснять.</p> </div> <div class="article"> <h4><a href="https://pyplanet.ru/pages/courses-free.html">Бесплатные курсы Python</a></h4> <p>Обзор бесплатных курсов, обучающих видео по языку программирования Python</p> </div> </div> </div> </div> </div> <footer> <p>© 2025 <a href="https://pyplanet.ru/">pyplanet - Python с нуля до бесконечности</a></p> </footer> </body> </html>