Функция range в Python
Синтаксис
Функцию range() можно использовать с одним или несколькими параметрами. В документации Pyton синтаксис выглядит следующим образом:
class range(stop) # с одним параметров class range(start, stop[, step]) # с несколькими параметрами
У функции 3 параметра:
Функция range() возвращает объект класса range :
☝️ При работе с range() важно помнить следующее:
📃 Более подробное описание функции можно посмотреть в официальной документации или через help(«range») :
for i in range
Основной кейс — выполнение цикла N-раз:
for i in range(3): print(f»iteration #«) > iteration #1 > iteration #2 > iteration #3
С помощью range() можно перебрать все значения в последовательности:
str = ‘abcdef’ for i in range(len(str)): print(str[i], end=’ ‘) > a b c d e f
Или найти сумму первых 10-ти целых чисел.
s = 0 for i in range(11): # от 0 до 9 (11 не входит в последовательность) s += i print(s) > 55
А так можно перебрать значения последовательности через одного:
s = ‘a1b2c3d4e5f6g7h8′ for i in range(0, len(s), 2): print(s[i], end=’ ‘) > a b c d e f g h
С помощью функции range() можно организовать сдвиг букв в слове на одну позицию и получить все возможные варианты такого сдвига:
s = ‘питон’ for i in range(len(s)): s = s[1:] + s[:1] print(s, end=’ ‘) > итонп тонпи онпит нпито питон
Или получить все числа из заданного диапазона, делящиеся на любое нужное. Например, напечатаем таблицу умножения на 8:
count = 1 for i in range(8, 80, 8): print(count, ‘ * 8 = ‘, i) count += 1 > 1 * 8 = 8 > 2 * 8 = 16 > 3 * 8 = 24 > 4 * 8 = 32 > 5 * 8 = 40 > 6 * 8 = 48 > 7 * 8 = 56 > 8 * 8 = 64 > 9 * 8 = 72
Операции с range
Объект range поддерживает все операции, доступные последовательностям (кроме сложения и умножения):
>>> numbers = range(13) >>> numbers[3] # обращение к конкретному элементу 3 >>> 3 in numbers # проверка на вхождение в диапазон True >>> numbers[:4] # срез диапазона range(0, 4) >>> len(numbers) # длина диапазона 13 >>> min(numbers) # минимальный элемент диапазона 0 >>> max(numbers) # максимальный элемент диапазона 12 >>> numbers = range(0, 13, 2) >>> numbers.index(6) # индекс (позиция) числа в диапазоне 3
Также объект range можно привести к списку ( list ) или множеству ( set ):
>>> numbers = range(13) >>> numbers_list = list(numbers) >>> type(numbers_list) >>> numbers_list [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] >>> numbers_set = set(numbers) >>> type(numbers_set) >>> numbers_set
range и тип float
По умолчанию функция range() позволяет использовать только целые числа в качестве параметров. Если вы передадите значение с плавающей точкой, то Python вызовет исключение TypeError :
numbers = range(1.5) print(numbers) > Traceback (most recent call last): File «test.py», line 1, in numbers = range(1.5) TypeError: ‘float’ object cannot be interpreted as an integer
import numpy as np float_numbers = np.arange(4.6, 5.8, 0.3) print(float_numbers) > [4.6 4.9 5.2 5.5 5.8]
Если вы не хотите устанавливать библиотеку NymPy, то можно написать собственную функцию, например так:
def f_range(start, stop, step): while start [4.6, 4.9, 5.2, 5.5, 5.8]
Отличия между range в python2 и python3
Range() в Python2 и Python3 — это разные функции, которые отличаются друг от друга.
Функция xrange() в Python2 и range() в Python3 не генерируют вся последовательность чисел сразу, а выдают нужные значения по мере необходимости, при переходе к следующей итерации цикла.
Таким образом, xrange() используемая в Python2 и range() в Python3 являются аналогами.
Best Practices
range в обратном порядке (python reverse range)
Получить последовательность в обратном порядке можно с помощью отрицательного аргумента step :
range включительно
По умолчанию, значение из переменной stop не входит в последовательность. Чтобы это исправить, к stop прибавьте step :
step = 2 numbers = range(2, 10 + step, step) for i in numbers: print(i, end=’ ‘) > 2 4 6 8 10
range до бесконечности
Но это можно сделать через itertools :
Или через бесконечный цикл while :
range → в список (list) или множество (set)
С помощью range можно сгенерировать список ( list ):
num_set = list(range(1, 11, 2)) # список целых чисел print(num_set) > [1, 3, 5, 7, 9]
Или сгенерировать множество ( set ):
natural_num_set = set(range(1, 11)) # множество натуральных чисел от 1 до 10 print(natural_num_set) >
Цикл «for» в Python — универсальная управляющая конструкция
Применение циклов
Концепция циклов — это не просто очередная абстрактная выдумка программистов. Повторяющиеся раз за разом операции окружают нас и в реальной жизни:
🥣 добление щепотки приправ в варящийся бульон и помешивание его до тех пор, пока пакетик специй не закончится,
🕙 следование строгому расписанию каждый будний день, пока не наступят долгожданные выходные,
🌄 даже банальная смена времён год,
— всё это циклы, и представить нормальную жизнь без них попросту невозможно.
Впрочем, то же касается и программирования. Представьте, что вам нужно последовательно напечатать числа от 1 до 9999999999. В отсутствии циклов, эту задачу пришлось бы выполнять ручками, что потребовало бы колоссального количества кода и огромных временных затрат:
Циклы же позволяют уместить такую многокилометровую запись в изящную и простую для понимания конструкцию, состоящую всего из двух строчек:
for i in range(1, 10000000000): print(i)
Смысл её крайне прост. В основе цикла for лежат последовательности, и в примере выше это последовательность чисел от 1 до 9999999999. for поэлементно её перебирает и выполняет код, который записан в теле цикла. В частности, для решения данной задачи туда была помещена инструкция, позволяющая выводить значение элемента последовательности на экран.
Итерации
👉 Чтобы выполнить итерацию, Python делает следующее:
Пример создания итерируемого объекта Для того чтобы создать собственный класс итерируемого объекта, нужно всего лишь внутри него реализовать два метода: __iter__() и __next__() :
Создадим простой строковый итератор, который на каждой итерации, при получении следующего элемента (т.е. символа), приводит его к верхнему регистру:
class ToUpperCase: def __init__(self, string_obj, position=0): «»»сохраняем строку, полученную из конструктора, в поле string_obj и задаём начальный индекс»»» self.string_obj = string_obj self.position = position def __iter__(self): «»» возвращаем сам объект «»» return self def __next__(self): «»» метод возвращает следующий элемент, но уже приведенный к верхнему регистру «»» if self.position >= len(self.string_obj): # исключение StopIteration() сообщает циклу for о завершении raise StopIteration() position = self.position # инкрементируем индекс self.position += 1 # возвращаем символ в uppercase-e return self.string_obj[position].upper() low_python = «python» high_python = ToUpperCase(low_python) for ch in high_python: print(ch, end=»») > PYTHON
Синтаксис for
Как было замечено, цикл for python — есть средство для перебора последовательностей. С его помощью можно совершать обход строк, списков, кортежей и описанных выше итерируемых объектов.
В простейшем случае он выглядит так:
for item in collection: # do something
aliceQuote = «The best way to explain it is to do it.» # с помощью цикла for посчитаем количество символов (с пробелами) в строке # зададим счетчик count = 0 # будем посимвольно обходить весь текст for letter in aliceQuote: # на каждой новой итерации: # в переменной letter будет храниться следующий символ предложения; # увеличиваем счетчик на 1; count += 1 print(count) > 39
range() и enumerate()
Вы уже наверняка запомнили, что for работает с последовательностями. В программировании очень часто приходится повторять какую-то операцию фиксированное количество раз. А где упоминается «количество чего-то», существует и последовательность, числовая.
👉 Для того чтобы выполнить какую-либо инструкцию строго определенное число раз, воспользуемся функцией range() :
# скажем Миру привет целых пять раз! for i in range(5): print(«Hello World!») > Hello World! Hello World! Hello World! Hello World! Hello World!
range() можно представлять, как функцию, что возвращает последовательность чисел, регулируемую количеством переданных в неё аргументов. Их может быть 1, 2 или 3:
Здесь start — это первый элемент последовательности (включительно), stop — последний (не включительно), а step — разность между следующим и предыдущим членами последовательности.
# заменим каждый пятый символ предложения, начиная с 0-го, на * text = «Это не те дроиды, которых вы ищете» new_text = «» for char in enumerate(text): if char[0] % 5 == 0: new_text += ‘*’ else: new_text += char[1] print(new_text) > *то н* те *роид*, ко*орых*вы и*ете
break и continue
Два похожих оператора, которые можно встретить и в других языках программирования.
Здесь видно, как цикл, дойдя до числа 45 и вернув истину в условном выражении, прерывается и заканчивает свою работу.
# continue for num in range(40, 51): if num == 45: continue print(num) > 40 41 42 43 44 46 47 48 49 50
В случае continue происходит похожая ситуация, только прерывается лишь одна итерация, а сам же цикл продолжается.
group_of_students = [21, 18, 19, 21, 18] for age in group_of_students: if age Всё в порядке, они совершеннолетние
Best practice
Цикл по списку
Перебрать list в цикле не составляет никакого труда, поскольку список — объект итерируемый:
# есть список entities_of_warp = [«Tzeench», «Slaanesh», «Khorne», «Nurgle»] # просто берём список, «загружаем» его в цикл и без всякой задней мысли делаем обход for entity in entities_of_warp: print(entity) > Tzeench Slaanesh Khorne Nurgle
Так как элементами списков могут быть другие итерируемые объекты, то стоит упомянуть и о вложенных циклах. Цикл внутри цикла вполне обыденное явление, и хоть количество уровней вложенности не имеет пределов, злоупотреблять этим не следует. Циклы свыше второго уровня вложенности крайне тяжело воспринимаются и читаются.
Цикл по словарю
Цикл, в таком случае, будет выглядеть следующим образом:
Цикл по строке
Строки, по сути своей — весьма простые последовательности, состоящие из символов. Поэтому обходить их в цикле тоже совсем несложно.
word = ‘Alabama’ for w in word: print(w, end=» «) > A l a b a m a
Как сделать цикл for с шагом
# выведем числа от 100 до 1000 с шагом 150 for nums in range(100, 1000, 150): print(nums) > 100 250 400 550 700 850
Обратный цикл for
Если вы еще не убедились в том, что range() полезна, то вот ещё пример: благодаря этой функции можно взять и обойти последовательность в обратном направлении.
for в одну строку
Крутая питоновская фишка, основанная на так называемых list comprehensions или, по-русски, генераторов. Их запись, быть может, несколько сложнее для понимания, зато очевидно короче и, по некоторым данным, она работает заметно быстрее на больших массивах данных.
В общем виде генератор выглядит так:
[результирующее выражение | цикл | опциональное условие]
Приведем пример, в котором продублируем каждый символ строки inputString :
# здесь letter * 2 — результирующее выражение; for letter in inputString — цикл, а необязательное условие опущено double_letter = [letter * 2 for letter in «Banana»] print(double_letter) > [‘BB’, ‘aa’, ‘nn’, ‘aa’, ‘nn’, ‘aa’]
Другой пример, но теперь уже с условием:
# создадим список, что будет состоять из четных чисел от нуля до тридцати # здесь if x % 2 == 0 — необязательное условие even_nums = [x for x in range(30) if x % 2 == 0] print(even_nums) [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28]
Питонистический подход к циклам for: range() и enumerate()
Автор заметки, перевод которой мы сегодня публикуем, хочет рассказать о некоторых особенностях использования циклов for в Python.
Цикл for — это один из краеугольных камней программирования. С этими циклами будущие программисты знакомятся в самом начале учёбы и, после первого знакомства, пользуются ими постоянно.
Если вы занялись разработкой на Python, имея опыт работы с другим популярным языком программирования, вроде PHP или JavaScript, то вам знакома методика применения переменной-счётчика, хранящей, например, индекс текущего элемента массива, обрабатываемого в цикле. Вот пример работы с циклом, написанный на JavaScript:
Работая с циклами for очень важно понимать то, что эти циклы не перебирают массивы. Они лишь дают программисту механизм для работы с переменной-счётчиком, которая используется для обращения к элементам обрабатываемых массивов.
Старый (неудачный) способ работы с массивами
В результате вы можете обнаружить функцию range() и написать на Python нечто подобное следующему:
Проблема этого цикла заключается в том, что он не очень хорошо соответствует идеологии Python. В нём мы не перебираем список, а, вместо этого, используем вспомогательную переменную i для обращения к элементам списка.
Использование функции enumerate()
Эта функция принимает два аргумента: итерируемый объект и необязательное начальное значение счётчика.
Такой код получился гораздо чище кода из предыдущего примера. Мы ушли от работы со списком индексов, мы перебираем сами значения, получая к ним прямой доступ в цикле for, и видим значения, с которыми работаем, в объявлении цикла.
Итоги
Надеюсь, этот небольшой рассказ о циклах for в Python позволил вам узнать что-то новое об этом языке.
Цикл for и функция range в Python
В программирование часто сталкиваются с вопросом перебрать весь список и извлечь из него необходимые данные. Цикл for позволяет перебрать любой итерируемый объект, то есть объект, из которого команда for сможет брать элементы по одному, пока не будет обработан последний элемент, не зависимо от его длины.
| Содержание страницы: |
|---|
| 1.1. Цикл for в Python |
| 1.2. Аргумент end фунции print |
| 1.3. Действия во время выполнения цикла for |
| 1.4. Основные ошибки с циклом for |
| 2.1. Встроенная функция range |
| 2.2. Создание числового списка с помощью функции range |
| 2.4. Перебор списка по индексам с помощью функции range |
| 3. Генераторы списков |
1. Цикл for в Python.
>>> cars = [‘ford’, ‘opel’, ‘audi’, ‘land rover’, ‘bmw’]
>>> for brend in cars :
. print(brend) # отступ в 4 пробела
.
ford
opel
audi
land rover
bmw
Функция print выводит свой аргумент, после чего курсор перемещает на следующую строку, но при большом количестве элементов в списке, не всегда это удобно. Можно воспользоваться аргументом end, записав его после переменной.
>>> cars = [‘ford’, ‘opel’, ‘audi’, ‘land rover’, ‘bmw’]
>>> for brend in cars :
. print(brend, end=’ ‘) # отступ в 4 пробела
.
ford opel audi land rover bmw
Во время цикла for помимо вывода элементов, с ними можно выполнять различные действия. К примеру, можно выводить сообщения с каждым проходом цикла, для этого воспользуемся f-строками.
>>> cars = [‘ford’, ‘opel’, ‘audi’, ‘land rover’, ‘bmw’]
>>> for brend in cars :
. print(f»Автомобили торговой марки
.
Автомобили торговой марки Ford очень надежные
Автомобили торговой марки Opel очень надежные
Автомобили торговой марки Audi очень надежные
Автомобили торговой марки Land Rover очень надежные
Автомобили торговой марки Bmw очень надежные
Со строками цикл for работает также как и со списком.
В Python связь одной строки кода с предшествующей строкой обозначается отступами. В больших программах встречаются блоки кода с отступами в несколько разных уровней. Благодаря отступам, сильно упрощается чтение кода. Основные ошибки как раз и складываются из ошибок в пропущенных или лишних отступах.
>>> mesage = ‘Hello World!’
>>> for i in mesage :
. print(i * 5, end=’ ‘) # нет отступа в 4 пробела
File » «, line 2
print(i * 5, end=’ ‘)
^
IndentationError: expected an indented block
Для устранения этой ошибки, достаточно поставить в следующей строке после команды for 4 пробела. В основном, если вы работаете в любом современном текстовом редакторе, то после двоеточия он сам поставит отступы на следующей строке.
Встроенная функция range() используется для построения числовых последовательностей. В примере используем команду for и функцию range для выполнения ровно 10 итераций с выводом значения от 0 до 10.
>>> for x in range(10) :
. print(x, end=’ ‘)
.
0 1 2 3 4 5 6 7 8 9
При передаче только одного аргумента, последовательность будет начинаться с 0 и до значения аргумента (10), не включая его. Одна из самых распространённых ошибок, это когда разработчик предполагает, что значение аргумента функции range включается в сгенерированную последовательность.
Приведем пример с двумя аргументами. Выведем последовательность от 20 до 30.
>>> for x in range(20, 30) :
. print(x, end=’ ‘)
.
20 21 22 23 24 25 26 27 28 29
>>> numbers = list( range(5, 25) )
>>> print(numbers)
[5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24]
>>> numbers = list( range(0, 100, 15) )
>>> print(numbers)
[0, 15, 30, 45, 60, 75, 90]
>>> a = []
>>> for i in range(1, 11) :
. a.append(i**2)
.
>>> print(a)
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
На каждом цикле переменная возводится в квадрат и добавляется в список.
2.4. Перебор списка по индексам с помощью функции range
С помощью цикла for и функции range список можно перебирать по индексам и с каждым значением в списки, производить любые операции. Приведем пример, перебора списка по индексам, с помощью функции range и функции len, которая определяет длину списка.
>>> list_1 = [1, 3, 5, 10, 12, 20]
>>> for index in range ( len (list_1)):
. list_1[ index ] += 100
.
>>> print(list_1)
[101, 103, 105, 110, 112, 120]
С помощью индексов и функции range мы можем объединять информацию из разных списков. В примере ниже мы имеем список с именами, а второй список с фамилиями. Выведем на экран имя и фамилию:
>>> list_4 = [‘Artem’, ‘Serg’, ‘Georgy’, ‘Petr’]
>>> list_5 = [‘Ivanov’, ‘Petrov’, ‘Sidorov’, ‘Ulyanov’]
>>> for index in range ( len (list_4)):
. print(list_4[ index ], list_5[ index ])
.
Artem Ivanov
Serg Petrov
Georgy Sidorov
Petr Ulyanov
В результате получили общие данные на экране.
Аналогично можно создавать новые списки из двух или трех списков. Приведем пример перемножения трех списков:
В начале мы создадим пустой новый список вне цикла, куда будем добавлять результат с помощью функции append. В результате мы получим новый список с результатом перемножения предыдущих списков по индексам.
Состоящий выше пример построения квадратов чисел в разделе 2.2 состоял из нескольких строк кода. Генератор списка позволяет сгенерировать тот же список, но всего в одной строке. Определите название списка, после откройте квадратные скобки. Запишите выражение для значений, в нашем случает i ** 2. Затем напишите цикл for для генерирования чисел, которые будут передаваться выражению и закройте квадратные скобки.
>>> a = [i ** 2 for i in range(1,11)]
>>> print(a)
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
Python: функция range()
Функция range является одной из встроенных функций, доступных в Python. Он генерирует серию целых чисел, от значения start до stop, указанного пользователем. Мы можем использовать его для цикла for и обходить весь диапазон как список.
Функция range() принимает один обязательный и два необязательных параметра. Это работает по-разному с различными комбинациями аргументов. В этом руководстве мы познакомим вас со всеми возможностями данной функции Python, чтобы вы могли легко использовать ее в своих задачах.
Существует два варианта функции range() в Python 3. Давайте проверим их синтаксис по одному.
Range(Stop)
Это самая основная форма range(). Требуется один аргумент для указания исключительного (Stop) верхнего предела.
«0» становится отправной точкой для генерации чисел. Смотрите пример ниже.
Посмотрите другой пример. Диапазон со стоп-значением «0» генерирует пустой диапазон, то есть нулевые элементы.
Если вы предоставляете нецелочисленное значение остановки, тогда оно вызывает ошибку TypeError.
Range(Start, Stop[, Step])
Это немного сложная форма функции range. Здесь вы можете создать серию чисел с общей разницей по вашему выбору.
Вы можете передать следующие три аргумента:
Обратите внимание на следующие моменты при использовании range() с вышеуказанной подписью.
Обратите внимание, что функция range принимает только целочисленные аргументы. Чтобы создать диапазон с плавающей точкой, следуйте данному руководству: Генерация плавающего диапазона в Python
Функция Python Range() с примерами
Посмотрите примеры кода ниже, чтобы понять эту функцию немного глубже:
Использование параметров Start, Stop и Step
Использование отрицательных значений start, stop и step
Мы можем передавать отрицательные значения для всех параметров диапазона, таких как аргументы start, stop и step.
В приведенном ниже примере мы предоставляем отрицательное значения для stop и step, чтобы выполнить цикл в обратном направлении.
Генерация диапазона как арифметический ряд
Давайте создадим арифметический ряд (i = 10, n = 100, d = 10), используя метод range().
Объект range() работает как генератор. Следовательно, мы преобразовали его в список, чтобы мы могли распечатать значения.
Перебор списка с использованием range()
Мы можем использовать функцию Python range() для обхода списка. Смотрите пример ниже.
Преобразовать диапазон в список
Python 3 range() создает объект типа генератора. По ходу цикла он выбирает значения одно за другим, а не получает их все сразу.
В действительности выходные данные функции range() представляют собой неизменяемую последовательность целых чисел. Следовательно, мы можем преобразовать то же самое в список Python. Мы будем использовать конструктор списка для преобразования вывода диапазона в список.
Смотрите пример ниже.
Верхний предел range включительно
По умолчанию Python range() по умолчанию исключает последнее число. Следовательно, он всегда игнорирует верхний предел своего вывода.
Однако мы можем внести следующие изменения в наш код, чтобы разрешить это.
После внесения вышеуказанных изменений, давайте посмотрим, что происходит:
Range Python против Xrange
Мы изложили несколько отличий и некоторые ключевые факты о функциях range и xrange.
В Python 2.x было две функции диапазона: range() и xrange()
В Python 3.x у нас есть только одна функция range(). Это реализация xrange() из версии 2.x.
Использование индекса с результатом работы range Python
Да, range() возвращает уникальный объект, который обладает свойствами, подобными списку и генератору.
Поскольку он действует как последовательность, мы можем получить доступ к его элементам, используя индексы. Он допускает как положительные так и отрицательные значения индекса.
Объединить вывод двух функций range()
В Python нет встроенной функции для объединения результатов двух результатов range(). Тем не менее, мы все еще можем сделать это.
Существует модуль с именем ‘itertools’, который имеет функцию chain() для объединения двух объектов диапазона.
Смотрите пример ниже.
В заключение
Вот несколько важных фактов о функции Python range():







