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

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

  1. Понимать принцип работы этой функции.
  2. Поймете, как отличаются разные реализации этой функции для Python 2 и третьей версии.
  3. Увидите ряд наглядных примеров работы с этой функцией.
  4. Сможете работать с учетом ограничений range().

История range()

Несмотря на то, что эта функция в Python 2 и 3 имеет одинаковое название, все же эти функции отличаются принципиальным образом у этих версий языка программирования. Фактически range() в Python 3 – это просто переименованная функция xrange(), которая есть в Python 2 версии. 

Изначально, и range() и xrange() приводили числа, которые можно повторить с помощью цикла for. Тем не менее первая функция генерировала список этих чисел, учитывая все за раз. В то же время, вторая не так активно это делала. Простыми словами, каждое число возвращалось само по себе каждый раз, когда они нужны.

Наличие гигантских списков занимает память. Так что нет ничего удивительного в том, что xrange() заменила range(), ее имя и все остальное. Вы можете почитать больше о данном решении и предыстории xrange() и range() в PEP 3100.

Что означает аббревиатура PEP? Python Enhancement Proposal. Это документы, покрывающие большое количество тем, включая недавно представленные новые функции, стили, философию и руководства.

Итак, давайте начинать.

Циклы

Перед тем, как мы ознакомимся с тем, как работает функция range(), нам необходимо посмотреть на то, как работают циклы. Вообще, без циклов невозможно представить компьютерную науку. Если вы желаете развиваться в сфере разработки программ, умение работать с циклами – это очень важно.

Итак, давайте рассмотрим пример цикла for в Python: 

captains = ['Janeway', 'Picard', 'Sisko']
for captain in captains:
    print(captain)

Выдача выглядит так:

Janeway

Picard

Sisko

Как вы видите, цикл for дает возможность выполнить определенные части кода такое количество раз, которое нужно. В данном примере мы зациклили список капитанов и вывели имена каждого из них.

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

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

numbers_divisible_by_three = [3, 6, 9, 12, 15]
for num in numbers_divisible_by_three:
    quotient = num / 3
    print(f"{num} делится на 3, результат {int(quotient)}.")

Выдача цикла будет следующей:

3 делится на 3, результат 1.

6 делится на 3, результат 2.

9 делится на 3, результат 3.

12 делится на 3, результат 4.

15 делится на 3, результат 5.

Это та выдача, которая требуется. Так что можем сделать вывод, что цикл сработал отлично. Тем не менее есть еще один метод, позволяющий получить такой же самый результат – это использование range().

Учтите то, что последний пример кода содержит определенное форматирование строк. Если вы еще не изучали тему F-строк, это обязательно нужно сделать.

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

Введение в range()

Итак, по какому принципу работает функция range()? Проще говоря, range() дает возможность генерировать ряд чисел в рамках определенного диапазона. В зависимости от количества аргументов, передаваемых функции, вы можете решить, где этот ряд чисел начинается и закончится. Также будет понятно, насколько большая разница между этими двумя числами.

Приведем небольшой пример работы с функцией range(): 

for i in range(3, 16, 3):
    quotient = i / 3
    print(f"{i} делится на 3, результат {int(quotient)}.")

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

Учтите то, что в этом примере демонстрируется надлежащее использование range(). Но если слишком часто приводят для использования циклах.

Так, такое использование range() можно лишь с натяжкой назвать Питоническим. То есть, так лучше не писать: 

captains = ['Janeway', 'Picard', 'Sisko'] 
for i in range(len(captains)):
    print(captains[i])

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

Вообще, есть три варианта, как осуществлять вызов range() на практике:

  • range(стоп) использует один аргумент.
  • range(старт, стоп) использует два аргумента.
  • range(старт, стоп, шаг), соответственно, – три аргумента.

Если мы вызываем range() с одним аргументом, то получаем набор чисел, которые начинаются с нуля и включают каждое из чисел до, но не включая число, которое было обозначено, как конечное (стоп).

Как это выглядит на практике? 

for i in range(3):
    print(i)

Выдача цикла будет такой:

0

1

2

Давайте выполним проверку: у нас имеются все числа от 0 до, но не включая 3. Ведь последнее число было указано нами, как конечное.

range(старт, стоп)

Когда вы вызываете версию range() с двумя аргументами, необходимо определить не только место, в котором числовой ряд должен остановиться, но и место его начала. Так что у вас не будет необходимости начинать каждый раз с нуля. Вы можете использовать range() для того, чтобы генерировать ряд чисел, начиная А и заканчивая Б. Соответственно, диапазон будет в скобках (А, Б). Давайте теперь поймем, каким образом осуществляется генерация диапазона, который начинается с единицы.

Давайте попробуем вызвать range() с двумя аргументами: 

for i in range(1, 8):
    print(i)

Выдача будет такой:

1

2

3

4

5

6

7

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

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

range с тремя аргументами

Если мы вызываем range() с тремя аргументами, то можно не только задать место начала и конца, но и то, насколько будет большая разница между соседними числами в ряду. Если вы не задаете значение этого «шага», то range() будет автоматически вести себя таким образом, как если бы шаг был равен единице.

Учтите то, что шаг может быть как положительным, так и отрицательным. Но при этом не может быть равным нулю.

>>> range(1, 4, 0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: range() arg 3 must not be zero

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

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

for i in range(3, 16, 3):
    quotient = i / 3
    print(f"{i} делится на 3, результат {int(quotient)}.")

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

3 делится на 3, результат 1.

6 делится на 3, результат 2.

9 делится на 3, результат 3.

12 делится на 3, результат 4.

15 делится на 3, результат 5.

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

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

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

for i in range(3, 100, 25):
    print(i)

Если шаг равняется 25, то выдача цикла будет такой:

3

28

53

78

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

Декрементация с range()

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

Давайте попробуем использовать шаг -2. Это означает, что декрементация будет равняться двум для каждого числа: 

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

Выдача декрементирующего числа будет такой:

10

8

6

4

2

0

-2

-4

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

Самый верный метод создания диапазона для декрементации – применение функции range(старт, стоп, шаг). При этом у Python есть противоположная функция, которая прямо встроена в этот язык программирования. Если вы завернете range() в reversed(), то можно будет выводить целые числа в обратном порядке.

Давайте попробуем: 

for i in reversed(range(5)):
    print(i)

Вы получите такой результат:

4

3

2

1

0

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

Учтите и то, что reversed() – это функция, которая может использоваться и со строками.

Углубляемся в range()

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

Обычно range применяется в таких ситуациях:

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

Первое использование можно назвать наиболее простым, и вы можете сделать так, чтобы itertools дал более эффективный метод работы с итерациями по сравнению с функцией range().

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

>>> type(range(3))

<class 'range'>

Вы можете получить доступ к объектам range() по индексу, как если бы вы имели дело со списком: 

print(range(3)[1])
# Результат: 1
print(range(3)[2])
# Результат: 2

Также в range() можно использовать срез. Правда, выдача будет несколько странной: 

print(range(6)[2:5])

# Результат: range(2, 5)

Float

В Python, в случае, если число не является целым, оно автоматически считается числом с плавающей точкой. Между целыми числами и числами с плавающей точкой есть ряд принципиальных отличий.

Целое число:

  1. Это целое число.
  2. Не содержит десятичной точки.
  3. Может быть или нулем, или положительным, или отрицательным.

Десятичное число (тип float) в Python имеет следующие особенности:

  1. Может выступать любым числом, в которое входит десятичная точка.
  2. Может быть положительным и отрицательным.

Попробуйте вызвать range() с десятичным числом.

ОфисГуру
Adblock
detector