Python как работает range

Range в Python: как работает, функции, генерация и индексация

Range в Python: как работает, функции, генерация и индексация

Числовой диапазон (range) — упорядоченная последовательность целых чисел с заданным шагом.

Синтаксис функции range выглядит так:

start — число начала последовательности (по умолчанию 0).
stop — число конца последовательности.
step — шаг между каждым числом последовательности.

Параметры start и step — не обязательные, если их не указывать, то последовательность будет создаваться от 0 до stop с шагом 1.

Также следует помнить, что:

  • Все параметры функции range должны быть целыми числами.
  • Параметры могут быть отрицательными числами.
  • Если шаг step отрицательный, нужно помнить, что значение start должно быть больше значения stop .
  • Параметр stop не включается в последовательность.

Генерация списка с помощью range

Для генерации будем использовать различные комбинации:

my_list = list(range(10)) print(my_list) #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
my_list = list(range(5, 10)) print(my_list) #[5, 6, 7, 8, 9]
my_list = list(range(5, 10, 2)) print(my_list) #[5, 7, 9]
my_list = list(range(0, -10, -1)) print(my_list) #[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]

Генерация списка в цикле с помощью range

nums = [n for n in range(1, 11)] print(nums) #[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Использование числового диапазона range в циклах

Несколько простых примеров:

for i in range(5): print(i) #0 #1 #2 #3 #4
for i in range(5, 10): print(i) #5 #6 #7 #8 #9
for i in range(2, 10, 2): print(i) #2 #4 #6 #8

Функция range для обратного порядка:

for i in range(-2, -10, -2): print(i) #-2 #-4 #-6 #-8

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

Индексация range

Тут все стандартно, как и в списках и в кортежах, индексация начинается 0.

Обращение к элементу диапазона:

data = range(1, 10) print(data[0]) print(data[5]) print(data[-1]) #1 #6 #9

Срезы в range

Синтаксис срезов [I:J:Step] .
С I до смещения J , не включая его.

data = range(1, 10) print(data[1:4]) print(data[:4]) print(data[3:]) #range(2, 5) #range(1, 5) #range(4, 10)

Основные операции с числовым диапазоном range

Длина диапазона: len(r)

data = range(10) print(len(data)) #10

Минимальный элемент диапазона: min(r)

data = range(10) print(min(data)) #0

Максимальный элемент диапазона: max(r)

data = range(10) print(max(data)) #9

Индекс числа в диапазоне: range.index(x[, start[, end]])
Необязательные аргументы start и end , указывают на промежуток поиска:

data = range(10) print(data.index(5)) #5
data = range(2, 10) print(data.index(5)) #3

Примеры работы range в задачах

Найти сумму чисел от 1 до 10.

Читайте также:  Http letobank test73 newcontact su out dev index php action products

Создадим переменную s , в которую будем записывать сумму чисел. И присвоим ей значение 0.
Создадим числовой диапазон от 1 до 11 (т.к. range не включает последнее число в последовательность)
Создадим цикл for в котором будем перебирать в диапазоне цифры от 1 до 10.
Внутри цикла будем записывать в переменную s сумму с каждым числом из диапазона.

s = 0 for i in range(1, 11): s = s + i print(s) #55

Найти сумму четных чисел от 1 до 10.

Делаем, все тоже самое, что и в первой задаче, но в range делаем начало диапазона 0 и шаг 2, таким образом, получаем все четные числа от 0 до 10.

s = 0 for i in range(0, 11, 2): s = s + i print(s) #30

Вывести все буквы строки отдельно.

Создаем цикл длина диапазона, которого равна длине строки.
С помощью индексации выводим каждый элемент строки в цикле.

s = 'abcdef' for i in range(len(s)): print(s[i]) #a #b #c #d #e #f

Частая ошибка index out of range

Это ошибка возникает довольно часто, если не внимательно относиться к границам диапазона.

Допустим, есть список чисел от 1 до 10, нужно оставить в этом списке только числа, которые делятся на 2.

nums = [n for n in range(1, 11)] #генерируем список с числами о 1 до 10 for i in range(len(nums)): #перебераем все числа if nums[i] % 2 != 0: #находим числа, которые не делятся на 2 del nums[i] #удаляем такие числа print(nums) #builtins.IndexError: list assignment index out of range

В итоге вместо результата, получаем ошибку.

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

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

nums = [n for n in range(1, 11)] #генерируем список с числами о 1 до 10 fin_nums = [] #создаем пустой список for i in range(len(nums)): #перебираем все числа if nums[i] % 2 == 0: #находим числа, которые делятся на 2 fin_nums.append(nums[i]) #добавляем в наш новый список print(fin_nums) #[2, 4, 6, 8, 10]

Атрибуты и методы в Python: определение, использование и примеры

Атрибуты и методы в Python: определение, использование и примеры

Функция next() в Python: синтаксис и примеры использования

Функция next() в Python: синтаксис и примеры использования

Виртуальное окружение (venv) в Python: создание, активация и управление

Виртуальное окружение (venv) в Python: создание, активация и управление

Преобразование списка в обратный список в Python: методы и приемы

Преобразование списка в обратный список в Python: методы и приемы

Создание словарей в Python с помощью генераторов

Создание словарей в Python с помощью генераторов

Читайте также:  Java implode array to string

XOR в Python: что это и как использовать

XOR в Python: что это и как использовать

Источник

Описание функции range с примерами для Python 3

Если вы опытный разработчик, или даже новичок, вы, несомненно, слышали о функции Python range() . Но что же она делает? В двух словах, она генерирует список чисел, который обычно используется для работы с циклом for . Существует много вариантов использования. Зачастую, ее используют, когда нужно выполнить действие X раз, где вы можете использовать индекс. В других случаях вам, возможно, понадобится сделать итерацию по списку (или по другому итерируемому объекту), имея доступ к индексу.

Функция range() имеет небольшие отличия в работе на версии Python 2.x и 3.x , тем не менее у них остается одинаковая концепция. К этому вопросу мы доберемся немного позже.

Параметры range: star, stop, шаг

Функция range() принимает три параметра, например:

range([start], stop[, step])
  1. start: число начала последовательности.
  2. stop: генерирует число до данного числа, но не включая его.
  3. 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() . Следующим образом:

Источник

Оцените статью