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