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

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

Функция range() имеет несколько отличий в разных версиях Python. Но концепция не отличается. Разберемся в особенностях использования этой функции более подробно.

Сегодня вы узнаете:

  1. Особенности использования функции Range в целом.
  2. Отличия функции Range во второй и третьей версиях Python. 
  3. Отдельные аспекты использования функции Range на примерах.
  4. Обходить некоторые ограничения функции Rage().

Понятие циклов в Python

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

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

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

Кстати, слово «итерация» означает одно повторение команд, прописанных в теле цикла.

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

Если говорить о реальных примерах использования цикла for в Python, то он следующий: 

captains = ['Janeway', 'Picard', 'Sisko']




for captain in captains:

    print(captain)

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

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 и выдает результат до тех пор, пока не будут перебраны все значения.

После того, как мы выполним приведенный выше код, получим следующий вывод интерпретатора. 

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. Такую последовательность вовсе не обязательно записывать самостоятельно. Можно просто воспользоваться функцией range(), чтобы ее сгенерировать. И сегодня разберемся в том, как это сделать.

Этот же самый цикл можно было бы записать в более простом виде.  

for i in range(3, 16, 3):

    quotient = i / 3

    print(f"{i} делится на 3, результат {int(quotient)}.")

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

Основные параметры функции

Функция range() имеет три основные параметра:

  • start. Число начала последовательности. 
  • stop. Генерирует числа вплоть до значения, указанного в этом аргументе (не включительно).
  • step – шаг чисел последовательности.

Обратите внимание на следующие нюансы:

  1. Параметры могут быть только целочисленными значениями. 
  2. Параметры могут быть или положительными, или отрицательными. 
  3. В основе range находится индекс 0. То есть, первое число последовательности кодируется индексом 0. Собственно, как и в языке Python в целом.

Примеры использования функции

Например, если мы используем в качестве аргументов функции range значения 0 и 5, то будет сгенерирована последовательность чисел от 0 до 4. При этом число 0 будет иметь индекс 0. 

Приведем пример одного приложения. 

>>> # 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).

Особенно полезно использование функции в итерации с условиями. Давайте приведем пример приложения, которое пишет текст песни «99 Bottles of Beer on the Wall», который будет задействовать функцию range в комбинации с условным оператором. 

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('{0} bottles of beer on the wall, {0} bottles of beer!'.format(i))

print('So take it down, pass it around, {0} 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!

К слову, это популярная американская и канадская песня, которая активно используется в обучении программированию. Дело в том, что в предпоследнем цикле необходимо изменять слово «bottles» на «bottle», и нередко ставится задача автоматизировать изменение слова программными методами. 

Но мы упростили задачу и просто написали код.

Range и Xrange в Python: особенности

Возможно, вы уже слышали о функции xrange(). Эта функция использовалась во второй версии Пайтона, а в третьей была просто переименована в range(). Разница между ними во второй версии языка в том, что с помощью xrange() мы получали объект последовательности. Для наглядности приведем фрагмент кода. 

# Python 2.x

>>> range(1)

[0]

>>> type(range(1))

<class 'list'>




# Python 3.x

>>> range(1)

range(0, 1)

>>> type(range(1))

<class 'range'>

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

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

ОК, а как же выкручиваться тогда? Ведь список может понадобиться в этом случае. Для этого необходимо использовать генератор в качестве аргумента функции list(). Как в этом примере.  

>>> list_of_ints = list(range(3))

>>> list_of_ints

[0, 1, 2]

Функция range и числа с плавающей точкой: совместимы ли?

Как говорилось выше, нет. Но почти любое ограничение в Python можно обойти. Это мы и попытаемся сделать.

Вот один из способов, позволяющих сделать это. 

>>> # все аргументы обязательны

>>> def frange(start, stop, step):

    i = start

    while i < stop:

        yield i

        i += step




>>> for i in frange(0.5, 1.0, 0.1):

    print(i)




0.5

0.6

0.7

0.8

0.9

1.0

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

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

Если же в качестве шага ввести отрицательное значение, то тогда будет осуществляться декрементация.

Вот пример декрементации в Python. 

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

    print(i)




А вот – пример инкрементации.




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

    print(i)

Выводы

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

Теперь давайте немного суммируем знания. Попробуйте ответить, какое из следующих утверждений НЕ верно?

  1. Невозможно получить последовательность 24, 18, 12, 6 с использованием функции range().
  2. В качестве параметров функции range() могут использоваться отрицательные целые числа.
  3. Первый индекс функции range – нулевой.
  4. В цикле for i in range(4) переменная i будет 0,1,2,3,4.
  5. Невозможно получить последовательность 6, 12, 18, 24 с использованием функции range().

Успехов вам в освоении всех тонкостей языка Python.

ОфисГуру
Adblock
detector