Функция range() в Python

Создаём любые последовательности чисел одним взмахом руки

Функция range() в Python

Рассказываем про ещё один полезный инструмент в Python — функцию range(), которая помогает обрабатывать последовательности пронумерованных чисел и других элементов. Она применяется в работе с циклами, алгоритмами, математическими вычислениями. Главное, чтобы итоговый объект можно было разделить на элементы и присвоить каждому из элементов индекс, то есть целое число.

Напомним: циклы в Python

Range() — это функция, которая генерирует последовательность целых чисел. Эти числа можно использовать для математических операций или в качестве номеров-индексов для доступа к элементам коллекций — других последовательностей, которые группируют элементы несколькими разными способами.

Один из основных способов использования range — при работе с циклами, когда нужно несколько раз повторить один фрагмент кода, поэтому сначала поговорим про обычные циклы. Они нужны, чтобы код был компактнее и читабельнее: когда одна и та же часть программы повторяется несколько раз, её можно зациклить и задать условия для выхода из этого цикла.

Вот несколько примеров, как выглядят и работают циклы.

Пример 1. Берём список чисел и отнимаем от каждого 10. Например, у нас есть время по Омску и нужно узнать, сколько сейчас в Торонто:

# пример цикла 1

# создаём список чисел
numbers = [1, 2, 3, 4, 5]

# создаём пустой список для хранения результатов
results = []

# проходим по каждому числу в списке numbers
for num in numbers:
   # проводим операцию: возводим число в квадрат
   squared = num - 10
   # добавляем результат в список results
   results.append(squared)

# выводим итоговый список результатов
print(results)

На выходе получаем новый список:

[-9, -8, -7, -6, -5]

На часы это пока что не похоже, но можно добавить обработку, чтобы минусовые числа обрабатывались в правильные часы.

Пример 2. Запускаем бесконечный цикл, который прерывается только при появлении нужного числа:

# импортируем модуль random для генерации случайных чисел
import random

# запускаем бесконечный цикл
while True:
   # генерируем случайное число от 1 до 100
   number = random.randint(1, 100)
   # выводим сгенерированное число
   print(f"Сгенерировано число: {number}")

   # проверяем условие: если число равно 42, прерываем цикл
   if number == 42:
       print("Найдено число 42! Цикл завершён.")
       break

Так, с простыми циклами закончили, теперь можно переходить к range().

Синтаксис и параметры функции range

Функция может принимать 3 аргумента:

  • start — точка начала отсчёта;
  • stop — точка окончания;
  • step — шаг отсчёта.

Вызывать в Python range() можно тремя способами, передавая от 1 до 3 аргументов.

Range(stop). Генерирует последовательность чисел от 0 до stop - 1, включая эти числа. Например, range(10) даст последовательность от 0 до 9.

Это самая простая форма использования range(), которая часто применяется в циклах для выполнения повторяющихся задач определённое количество раз.

Пример — последовательность целых чисел:

# создаём последовательность чисел от 0 до 4
numbers = range(5)

# выводим каждое число из последовательности
for num in numbers:
   print(num)

Что выводится при запуске:

0
1
2
3
4

Range(start, stop). Позволяет задать начальное значение последовательности. 

Применяется, если нужно начать не с нуля, а с определённого числа. Например, если требуется обработать данные, начиная с известного индекса, сгенерировать числа в конкретном диапазоне или при работе с временными интервалами, где нужно начать с определённого момента.

Создадим ещё одну последовательность чисел, но начнём с 2:

# создаём последовательность чисел от 2 до 5
numbers = range(2, 6)

# выводим каждое число из последовательности
for num in numbers:
   print(num)

Запускаем код:

2
3
4
5

Range(start, stop, step). Добавляет возможность задать шаг последовательности, что позволяет пропускать определённые значения. 

Эта форма range() полезна в математических и инженерных задачах, где требуется точный контроль над генерацией элементов. Например, так можно создать последовательность только нечётных чисел:

# создаём последовательность чисел от 1 до 10 с шагом 2
numbers = range(1, 11, 2)

# выводим каждое число из последовательности
for num in numbers:
   print(num)

Проверяем результат:

1
3
5
7
9

Циклы с использованием range

Во всех примерах выше мы использовали цикл for. Такие циклы с использованием range() — один из самых простых и распространённых способов итерации по коллекциям чисел.

В реальных задачах такие циклы могут применяться для обработки больших массивов данных, например при анализе статистики или работе с графиками. А при генерации отчётов или тестировании одну задачу часто требуется повторить несколько раз.

Создание списка чисел с помощью range

C помощью range() можно создавать списки целых чисел и использовать их для других задач, например математических вычислений или инициализации данных.

Такое может понадобиться при создании тестовых данных или работе с алгоритмами, которые требуют последовательностей чисел.

Для примера создадим список чисел от 1 до 5:

# создаём список чисел от 1 до 5
list = list(range(1, 6))

# выводим список
print(list)

То, что мы действительно получаем список, можно понять по квадратным скобкам:

[1, 2, 3, 4, 5]

Индексирование и срезы с range

Если индексы — это номера элементов, то срезы — часть последовательности. В срезах, как и в самой функции range(), можно задать начало, конец и шаг фрагмента последовательности по индексам.

В сочетании с range() это может пригодиться, если нужно обработать только часть данных. Например, выбрать только первые 5 элементов последовательности или пропустить определённые значения. Это особенно полезно при обработке больших наборов данных, когда работают только с частью значений для анализа или визуализации.

На практике это может выглядеть так — создаём последовательность через range() и выделяем её часть:

# создаём последовательность чисел от 0 до 9
numbers = range(10)

# получаем срез с индексами от 2 до 5
subset = numbers[2:6]

# выводим срез
print(list(subset))

Получаем срез от 2-го до 5-го элемента:

[2, 3, 4, 5]

Объединение двух функций range

Объединение двух функций range позволяет создавать более сложные последовательности чисел. 

Например, можно объединить две последовательности в одну и использовать её для дальнейшей обработки или создать вложенный цикл.

Один из примеров — вложенный цикл для создания двумерной структуры:

# внешний цикл: итерируемся от 0 до 2
for i in range(3):
   # внутренний цикл: итерируемся от 0 до 2
   for j in range(3):
       # выводим текущие значения i и j
       print(f"i: {i}, j: {j}")

В консоли получаем набор строк, каждая из которых включает номера последовательностей range() из обоих вложенных циклов:

i: 0, j: 0
i: 0, j: 1
i: 0, j: 2
i: 1, j: 0
i: 1, j: 1
i: 1, j: 2
i: 2, j: 0
i: 2, j: 1
i: 2, j: 2

Другой пример — создаём матрицу значений через генератор списков, используя две функции range() с разными настройками параметров:

# создаём список списков с помощью вложенных range
function = [list(range(i, i + 3)) for i in range(0, 9, 3)]

# выводим полученную матрицу
for _ in function:
   print(_)

Запускаем код и выводим матрицу на экран:

[0, 1, 2]
[3, 4, 5]
[6, 7, 8]

Использование отрицательного шага

Если в range() выставить отрицательный шаг, можно сгенерировать последовательность в обратном порядке. Например, так можно перебирать элементы списка с конца.

Иногда при работе с временными данными их нужно обработать от последних к первым. Это могут быть логи событий, финансовая отчётность, данные датчиков. Например, если у нас есть логи ошибок и мы хотим найти последнюю причину поломки на сервере, логичнее начать с конца.

Так можно создать обратную последовательность от 5 до 1:

# создаём последовательность чисел от 5 до 1 с шагом −1
numbers = range(5, 0, -1)

# выводим каждое число из последовательности
for num in numbers:
   print(num)

Выводим на экран:

5
4
3
2
1

Работа с float-значениями в range

Функция range() не поддерживает float-значения с плавающей точкой (проще говоря — дробные числа). Поэтому если нужно работать с научными данными, математическими моделями и выполнять другие задачи с высокой точностью, добавляем numpy:

# импортируем numpy
import numpy as np

# создаём последовательность чисел от 0,0 до 0,5 с шагом 0,1
numbers = np.arange(0.0, 0.5, 0.1)

# выводим каждое число из последовательности
for num in numbers:
   print(num)

Получаем набор дробных чисел. Некоторые из них получаются длиннее остальных из-за особенностей представления в памяти компьютера:

0.0
0.1
0.2
0.30000000000000004
0.4

Использование функции len() вместе с range()

Часто вместе с range() применяют ещё одну функцию — len(), для получения длины объекта и итерации в пределах этой длины.

Длина объекта представляет собой количество элементов, поэтому в программах это может применяться для задач, где требуется выполнить операции над каждым элементом последовательности.В этой программе мы проходим по индексам списка, получая их через len():

# создаём список
number = [10, 20, 30, 40, 50]

# проходим по индексам списка
for i in range(len(number)):
   # выводим индекс и соответствующий элемент
   print(f"Индекс: {i}, Значение: {number[i]}")

Чтобы точно понимать, что происходит в коде, мы добавили в вывод детальное отслеживание — на каждой итерации выводим индекс и значение элемента:

Индекс: 0, Значение: 10
Индекс: 1, Значение: 20
Индекс: 2, Значение: 30
Индекс: 3, Значение: 40
Индекс: 4, Значение: 50

Генерация предложений

Чтобы показать, что функция подходит не только для чисел, но и для других элементов, сделаем такое: напишем программу, которая берёт список из чисел и объединяет их в одно предложение. Range() будет работать в паре с len() и помогать проходить по словам в списке, используя их номера-индексы.

# cоздаём список слов
words = ["sequence", "gt", "used", "generate", "use", "returns", "using"]

# cоздаём пустую строку для формирования предложения
sentence = ""

# используем range() для итерации по индексам списка words
for i in range(len(words)):
    # добавляем текущее слово к предложению
    sentence += words[i]
    # eсли это не последнее слово, добавляем пробел
    if i < len(words) - 1:
        sentence += " "

# выводим итоговое предложение
print(sentence)  # "sequence gt used generate use returns using"

При запуске получаем склеенный текст:

sequence gt used generate use returns using

Сравнение range и xrange в Python 2

В Python 2 и Python 3 функция range() работает немного по-разному. Это потому, что range() во втором Питоне сразу генерировала целый список чисел, которые приходилось держать в памяти и занимать ресурсы машины.

Range() в Python 3 — на самом деле функция xrange() из Python 2, которая генерирует числа лениво: возвращает по одному числу только тогда, когда они действительно нужны в программе.

Поэтому отдельного xrange в Python 3 нет, хотя под капотом это обычный range.

Вам слово

Приходите к нам в соцсети поделиться своим мнением о функции и почитать, что пишут другие. А ещё там выходит дополнительный контент, которого нет на сайте: шпаргалки, опросы и разная дурка. В общем, вот тележка, вот ВК — велком!

Обложка:

Алексей Сухов

Корректор:

Елена Грицун

Вёрстка:

Кирилл Климентьева

Соцсети:

Юлия Зубарева

Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию
А вы читали это?
easy