Python: Функция range()
Встроенная функция range() удобна в тех случаях, когда нужно повторить действие определённое количество раз.
Можно вызвать разными способами.
range(stop)
Функция с одним аргументом. Числа начинаются с 0 и идут до указанного числа, которое не учитывается. Шаг 1.
for i in range(3): print(i)
0 1 2
range(start, stop)
Функция с двумя аргументами. Указываем начальное и конечные значения (не входит в диапазон). Шаг 1.
# выводим значения от 1 до 5 for i in range(1, 6): print(i)
1 2 3 4 5
range(start, stop, step)
Функция с тремя аргументами. Третий аргумент задаёт шаг между соседними числами.
for i in range(10, 27, 5): print(i)
10 15 20 25
Для шага можно использовать отрицательные значения, чтобы пойти в обратную сторону.
for i in range(10, 5, -2): print(i)
10 8 6
Можно позвать на помощь функцию reversed(), чтобы выводить последовательность в обратном порядке.
for i in reversed(range(6)): print(i)
5 4 3 2 1 0
Проверим следующее выражение. Увидим, что имеем дело с классом range.
print(type(range(6)))
Можно получить доступ к объектам по индексу, как в списке:
print(range(3)[1])
Функция часто используется в циклах.
Операторы цикла
Как правило, циклы for используются либо для повторения какой-либо последовательности действий заданное число раз, либо для изменения значения переменной в цикле от некоторого начального значения до некоторого конечного.
Для повторения цикла некоторое заданное число раз n можно использовать цикл for вместе с функцией range:
for i in range(n):
Тело цикла
В качестве n может использоваться числовая константа, переменная или произвольное арифметическое выражение (например, 2 ** 10). Если значение n равно нулю или отрицательное, то тело цикла не выполнится ни разу.
Если задать цикл таким образом:
for i in range(a, b):
Тело цикла
то индексная переменная i будеть принимать значения от a до b — 1, то есть первый параметр функции range, вызываемой с двумя параметрами, задает начальное значение индексной переменной, а второй параметр — значение, которая индексная переменная принимать не будет. Если же b≥a, то цикл не будет выполнен ни разу. Например, для того, чтобы просуммировать значения чисел от 1 до n можно воспользоваться следующей программой:
sum = 0
for i in range(1, n + 1):
sum += i
В этом примере переменная i принимает значения 1, 2, . n, и значение переменной sum последовательно увеличивается на указанные значения.
Наконец, чтобы организовать цикл, в котором индексная переменная будет уменьшаться, необходимо использовать функцию range с тремя параметрами. Первый параметр задает начальное значение индексной переменной, второй параметр — значение, до которого будет изменяться индексная переменная (не включая его!), а третий параметр — величину изменения индексной переменной. Например, сделать цикл по всем нечетным числам от 1 до 99 можно при помощи функции range(1, 100, 2), а сделать цикл по всем числам от 100 до 1 можно при помощи range(100, 0, -1).
Более формально, цикл for i in range(a, b, d) при d > 0 задает значения индексной переменной i = a, i = a + d, i = a + 2 * d и так для всех значений, для которых i < b. Если же d >0, то переменная цикла принимает все значения i > b.
Описание функции range с примерами для Python 3
Если вы опытный разработчик, или даже новичок, вы, несомненно, слышали о функции Python range() . Но что же она делает? В двух словах, она генерирует список чисел, который обычно используется для работы с циклом for . Существует много вариантов использования. Зачастую, ее используют, когда нужно выполнить действие X раз, где вы можете использовать индекс. В других случаях вам, возможно, понадобится сделать итерацию по списку (или по другому итерируемому объекту), имея доступ к индексу.
Функция range() имеет небольшие отличия в работе на версии Python 2.x и 3.x , тем не менее у них остается одинаковая концепция. К этому вопросу мы доберемся немного позже.
Параметры range: star, stop, шаг
Функция range() принимает три параметра, например:
range(stop)
- stop: количество целых чисел для генерации, начиная с нуля. Например, range(3) == [0, 1, 2] .
range([start], stop[, step])
- start: число начала последовательности.
- stop: генерирует число до данного числа, но не включая его.
- step: разница между каждым числом из последовательности.
- Все параметры должны быть целыми числами.
- Каждый из параметров может быть положительным или отрицательным.
- range() (и Python в целом) основана на индексе 0, означая, что список индексов начинается с 0, а не 1, например. Синтаксис, предоставляющий доступ к первому элементу в списке — mylist[0] . Поэтому, последнее целое число, сгенерированное функцией range() зависит от stop , но не будет включать его. Например, range(0, 5) генерирует целые числа 0, 1, 2, 3, 4, но не включая 5.
Примеры функции range()
Простое применение с циклом for:
>>> # 5 чисел начиная с 0 >>> for i in range(5): print(i) 0 1 2 3 4 >>> # числа с 3 до 6 (не включая его) >>> for i in range(3, 6): print(i) 3 4 5 >>> # числа с 4 до 10 (не включая его) с шагом 2 >>> for i in range(4, 10, 2): print(i) 4 6 8 >>> # числа с 0 до -10 (не включая его) с шагом -2 >>> for i in range(0, -10, -2): print(i) 0 -2 -4 -6 -8А это пример итерации по списку.
>>> my_list = ['один', 'два', 'три', 'четыре', 'пять'] >>> my_list_len = len(my_list) >>> for i in range(0, my_list_len): print(my_list[i]) один два три четыре пятьВ качестве параметра stop мы передали длину списка (5).
Range полезна в итерации с условиями. Рассмотрим примере песни “99 Bottles of Beer on the Wall…” со следующим кодом:
for i in range(99, 0, -1): if i == 1: print('1 bottle of beer on the wall, 1 bottle of beer!') print('So take it down, pass it around, no more bottles of beer on the wall!') elif i == 2: print('2 more bottles of beer on the wall, 2 more bottles of beer!') print('So take one down, pass it around, 1 more bottle of beer on the wall!') else: print(' bottles of beer on the wall, bottles of beer!'.format(i)) print('So take it down, pass it around, more bottles of beer on the wall!'.format(i - 1))Мы получаем следующий результат:
99 bottles of beer on the wall, 99 bottles of beer! So take one down, pass it around, 98 more bottles of beer on the wall! 98 bottles of beer on the wall, 98 bottles of beer! So take one down, pass it around, 97 more bottles of beer on the wall! 97 bottles of beer on the wall, 97 bottles of beer! So take one down, pass it around, 96 more bottles of beer on the wall! . 3 bottles of beer on the wall, 3 bottles of beer! So take one down, pass it around, 2 more bottles of beer on the wall! 2 more bottles of beer on the wall, 2 more bottles of beer! So take one down, pass it around, 1 more bottle of beer on the wall! 1 bottle of beer on the wall, 1 bottle of beer! So take it down, pass it around, no more bottles of beer on the wall!Прекрасно! Наконец-то вы видите настоящую силу Python. Если вы еще немного в замешательстве, рекомендую прочитать статью 99 бутылок пива (Википедия).
range против функций xrange в python
Вы должно быть слышали о функции, известной как xrange() . Эта функция представлена в Python 2.x, и была переименована в range() в Python 3.x. Так в чем же разница? В Python 2.x range() создавала список, а xrange() возвращала итератор — объект последовательности. Мы можем увидеть это в следующем примере:
# Python 3.x >>> range(1) range(0, 1) >>> type(range(1)) range'> # Python 2.x >>> range(1) [0] >>> type(range(1)) list'>В Python 3.x. у функции range() есть свой собственный тип. Говоря языком простых терминов, если вы хотите воспользоваться range() в цикле for , вы сделаете это с легкостью. Однако вы не можете использовать его как объект списка. Например, вы не можете разбить на срезы тип range .
Когда вы используете итератор, каждый цикл оператора for выдает мгновенно последующий номер на лету. В то время как исходная функция range() производит все числа мгновенно, прежде чем цикл for начнет выполняться.
Проблема с исходной функцией range() (в Python 2.x) заключалась в том, что она требовала очень большой объем памяти при создании большого количества чисел. Однако в нем, как правило, можно работать быстрее с небольшим количеством чисел.
Обратите внимание, что в Python 3.x вы все равно можете создать список, передав генератор, возвращенный функции list() . Следующим образом:
Урок 4.1. Знакомство с функцией "range()"
В рамках данного урока вы научитесь создавать свой первый цикл с оператором for, и этот навык вам пригодится в дальнейшей работе не раз. Это также поможет вам лучше понять преимущества использования циклов в программах.
Вы научитесь:
- Использовать функцию range()
- Использовать in для проверки принадлежности числа к диапазону значений
- Создавать цикл с оператором for
1.Функция range() является встроенной функцией в программировании на языке Python. Она используется для создания последовательности чисел. В данном уроке вы будете применять функцию range() для создания цикла с оператором for.
Откройте приложение Shell в вашем документе Python. Вы можете легко найти его через меню: ctrl+doc > Add Python > Shell.
Введите диапазон значений с помощью оператора присваивания:
r = range(10,20,2)
Функцию range() можно найти в меню: menu > Built-ins > Lists.
Теперь используйте оператор in, чтобы проверить, являются ли те или иные значения частью диапазона, например, 5 in r.
Обратите внимание на то, что результат будет показан в виде слова Верно или Неверно (True или False).
Попробуйте ввести другие значения, как показано в примере. Сама функция range() не содержит числа, а создает их при необходимости. При попытке отобразить функцию range() с помощью выражения print, она отобразится как есть.
2. Не выходите из приложения Shell, так как здесь удобно проверять работу некоторых функций, и при этом не нужно писать всю программу целиком.
Если вы введете r enter или print(r) enter, все, что вы получите в результате, будет значение диапазона range(. ).
Чтобы увидеть все значения диапазона range(), используйте оператор for:
Откройте следующие пункты меню: menu > Built-ins > Control и выберите:
for index in range(start, stop, step)

3. Просмотрите доступные подсказки (нажмите на tab, чтобы переходить от одной подсказке к другой):
index замените на i
start, stop, step замените на 10,20,2
block замените на print(i)
Посмотрите на рисунок. Обратите внимание на структурирование выражения print().

4. Нажмите на enter несколько раз, пока не запустится команда. После чего вы увидите ряд чисел: 10, 12, 14, 16 и 18. Число 20 не отображается.

Примечание для учителя: Функция range() является частью программирования на языке Python, и она используется только для создания последовательности чисел по запросу и с применением внутренних функций. Поэтому выражение print(range(5)) выдаст ответ range(5), а не числа, например, 0. 4. Далее, в этом блоке уроков мы будем подробнее рассматривать механизм создания списков с помощью функции range().
5. Напишите программу, используя оператор for. Для этого необходимо создать новый файл Python и добавить в него простое выражение с оператором for:
for index in range(size)
Сам оператор можно найти в меню: menu > Built-ins > Control.
Замените три подсказки (области, которые можно корректировать) на данные своего кода известным вам способом (size - это только одно значение). Попробуйте выполнить это самостоятельно.

6. Проверьте, похож ли ваш код на тот, что показан в примере на рисунке.
i может быть любой переменной, size может быть любым натуральным числом, а блок (block) можно представить в виде любого фрагмента кода. Попробуйте ввести print("hello"), например.

7. Запустите программу. В результате должны отобразиться несколько целых чисел.
Если начальное значение не задано, то цикл начинается с 0. Цикл завершается на значении на единицу меньше заданного вами значения size (в примере size равен 10). Значение size - это верхний предел диапазона, но он не является его частью.
Если величина шага не задана, то по умолчанию она будет равна 1.

Примечание для учителя: Попробуйте подольше поэкспериментировать с разными вариантами циклов для закрепления навыков.
8. Существуют еще два варианта циклов с оператором for, в которых также используется функция range(). Их можно найти в пункте меню Control.
Сможете ли вы создать цикл обратного отсчета, который будет отображать цифры от 10 до 0 с шагом, равным 1? Попробуйте сделать это самостоятельно, прежде чем перейти к выполнению следующего шага.

9. У вас получилось примерно так, как показано в примере ниже?
Цикл останавливается на единице (это соответствует значению на 1 меньше, чем стоп-значение).
Подсказка: Такой разделенный экран можно сделать, если нажать на ctrl+4 (Сгруппировать) в редакторе Editor. История приложения Shell будет очищена. Для того чтобы снова запустить программу, нажмите ctrl+R в редакторе Editor.
Еще раз напомним, что стоп-значение цикла не включено в тело самого цикла (блок/block).

Примечание для учителя: Группировка и Разделение: В языке программирования TI-Nspire комбинация клавиш ctrl+4 позволяет объединить на одной странице приложения с разных страниц (с текущей и со следующей). Комбинация ctrl+6 их разъединяет.
Эту функцию также можно найти в следующих пунктах меню: doc > Page Layout:

10. Напишите программу, которая отображает квадрат чисел между (и включительно) двумя введенными числами с помощью функции input().
В новом документе запишите два выражения, чтобы ввести нижний и верхний предел диапазона.
Затем добавьте цикл с оператором for, используя шаблон start, stop (начальное и конечное значение).
Блок (block) цикла должен отображать только число и его квадрат с помощью выражения print.
Сравните свою программу с тем примером, который показан в следующем шаге.

11. Вы допустили ту же самую ошибку, что и мы? Два конечных значения, верхнее значение и его квадрат (10 и 100, соответственно) не включены в результат.
Выражение range() должно быть в следующем виде:
range(lower, upper + 1)
Вы использовали выражения num*num или num**2 в примере?
Не забудьте сохранить свою работу!

Примечание для учителя: Выражения num*num и num**2 нужны для возведения числа в квадрат. Сложнее всего в выражении for i in range() - это понять, что стоп-значение не обрабатывается. Это как в цикле с оператором while, где используется знак < вместо знака
В программировании на большинстве других языков (особенно Basic) стоп-значение включено в цикл. Но это не распространяется на язык Python.Циклы с оператором for в языке Python также имеют выражение else, которое выполняется после того, как цикл завершается обычным образом. То есть не прерывается с помощью оператора выхода из цикла break.
