Цикл 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.
У нас есть список и для того, чтобы не обращаться к каждому элементу по отдельности, мы можем воспользоваться циклом for . В следующем примере переберем список с брендами автомобилей.
>>> cars = [‘ford’, ‘opel’, ‘audi’, ‘land rover’, ‘bmw’]
>>> for brend in cars :
. print(brend) # отступ в 4 пробела
.
ford
opel
audi
land rover
bmw
Во второй строке кода определяется цикл for . Python берет каждую торговую марку из списка и сохраняет его в переменной brend. После двоеточия код на следующей строке должен начинается с 4 пробелами. С помощью функции print, название марки выводится в переменной brand. Затем код повторяется до тех пор, пока не закончатся элементы в списке.
1.2. Аргумент end фунции print .
Функция print выводит свой аргумент, после чего курсор перемещает на следующую строку, но при большом количестве элементов в списке, не всегда это удобно. Можно воспользоваться аргументом end, записав его после переменной.
>>> cars = [‘ford’, ‘opel’, ‘audi’, ‘land rover’, ‘bmw’]
>>> for brend in cars :
. print(brend, end=’ ‘) # отступ в 4 пробела
.
ford opel audi land rover bmw
Аргумент end записывается в виде end= ‘ ‘ . Какое количество пробелов вы укажите, такое и будет после выводится между переменными.
1.3. Действия во время выполнения цикла for .
Во время цикла for помимо вывода элементов, с ними можно выполнять различные действия. К примеру, можно выводить сообщения с каждым проходом цикла, для этого воспользуемся f-строками.
>>> cars = [‘ford’, ‘opel’, ‘audi’, ‘land rover’, ‘bmw’]
>>> for brend in cars :
. print(f»Автомобили торговой марки очень надежные»)
.
Автомобили торговой марки Ford очень надежные
Автомобили торговой марки Opel очень надежные
Автомобили торговой марки Audi очень надежные
Автомобили торговой марки Land Rover очень надежные
Автомобили торговой марки Bmw очень надежные
Со строками цикл for работает также как и со списком.
>>> mesage = ‘Hello World!’
>>> for i in mesage :
. print(i * 5, end=’ ‘)
.
HHHHH eeeee lllll lllll ooooo WWWWW ooooo rrrrr lllll ddddd .
1.4. Основные ошибки с циклом 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 пробела. В основном, если вы работаете в любом современном текстовом редакторе, то после двоеточия он сам поставит отступы на следующей строке.
- Лишний отступ.
- Пропущенное двоеточие.
2. 1. Встроенная функция range .
Встроенная функция 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
2.2. Создание числового списка с помощью функции range .
- С помощью функции range удобно строить числовые списки.
>>> 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]
- Функция range может создавать последовательности, пропуская числа в заданном диапазоне. Например, приведем пример построения списка от 0 до 100, с шагом 15.
>>> numbers = list( range(0, 100, 15) )
>>> print(numbers)
[0, 15, 30, 45, 60, 75, 90]
- С помощью цикла for и функции range можно создавать практически любой числовой список. К примеру, создадим список квадратов всех числе от 1 до 10. Операция возведения в степень обозначается двумя звездочками ( ** ).
>>> 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]
В начале определим длину списка с помощью функции len . Затем это значение передается функции range . В нашем примере длина списка равна 6. С каждым проходом цикла for, index принимает значения от 0 до 6 (не включая 6). В теле цикла мы вызываем список list_1 и обращаемся к элементам списка по индексам, равные значению переменной index . Каждое значение индекса мы увеличивает на 100. Затем с помощью функции print выводим список на экран и видим что все значения увеличены на 100.
С помощью индексов и функции 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
В результате получили общие данные на экране.
Аналогично можно создавать новые списки из двух или трех списков. Приведем пример перемножения трех списков:
>>> list_1 = [1, 3, 5, 10, 12, 20]
>>> list_2 = [20, -9, 42, 10, 755, 12]
>>> list_3 = [12, 85, 96, 155, 235, 12]
>>> list_new = []
>>> for index in range ( len (list_1)):
. list_new.append(list_1[ index ] * list_2[ index ] * list_3[ index ])
.
>>> print(list_new)
[240, -2295, 20160, 15500, 2129100, 2880]
В начале мы создадим пустой новый список вне цикла, куда будем добавлять результат с помощью функции append. В результате мы получим новый список с результатом перемножения предыдущих списков по индексам.
Важно помнить, что программа будет работать, если вы уверены, что списки одинаковой длины. Проверить это вы всегда можете с помощью встроенной функции len .
3. Генераторы списков в Python .
Состоящий выше пример построения квадратов чисел в разделе 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]
В результате получился аналогичный список.
Цикл «for» в Python — универсальная управляющая конструкция
Циклы являются мощнейшим инструментом, предоставляемым высокоуровневыми языками программирования. Эти управляющие конструкции позволяют многократно выполнять требуемую последовательность инструкций. Циклы в языке Python представлены двумя основными конструкциями: while и for .
Подробнее о циклах while вы можете прочитать здесь:
Применение циклов
Концепция циклов — это не просто очередная абстрактная выдумка программистов. Повторяющиеся раз за разом операции окружают нас и в реальной жизни:
добавление щепотки приправ в варящийся бульон и помешивание его до тех пор, пока пакетик специй не закончится.
следование строгому расписанию каждый будний день, пока не наступят долгожданные выходные.
даже банальная смена времён года.
— всё это циклы, и представить нормальную жизнь без них попросту невозможно.
Впрочем, то же касается и программирования. Представьте, что вам нужно последовательно напечатать числа от 1 до 9999999999. В отсутствии циклов, эту задачу пришлось бы выполнять ручками, что потребовало бы колоссального количества кода и огромных временных затрат:
print(1) print(2) print(3) # . # 9999999995 строк # . print(9999999998) print(9999999999)
Циклы же позволяют уместить такую многокилометровую запись в изящную и простую для понимания конструкцию, состоящую всего из двух строчек:
for i in range(1, 10000000000): print(i)
Смысл её крайне прост. В основе цикла for лежат последовательности, и в примере выше это последовательность чисел от 1 до 9999999999. for поэлементно её перебирает и выполняет код, который записан в теле цикла. В частности, для решения данной задачи туда была помещена инструкция, позволяющая выводить значение элемента последовательности на экран.
Итерации
- Итерация (Iteration) — это одно из повторений цикла (один шаг или один «виток» циклического процесса). К примеру цикл из 3-х повторений можно представить как 3 итерации.
- Итерируемый объект (Iterable) — объект, который можно повторять. Проще говоря это объект, который умеет отдавать по одному результату за каждую итерацию.
- Итератор (iterator) — итерируемый объект, в рамках которого реализован метод __next__, позволяющий получать следующий элемент.
Чтобы выполнить итерацию, Python делает следующее:
- Вызывает у итерируемого объекта метод iter() , тем самым получая итератор.
- Вызывает метод next() , чтобы получить каждый элемент от итератора.
- Когда метод next возвращает исключение StopIteration , цикл останавливается.
Пример создания итерируемого объекта Для того чтобы создать собственный класс итерируемого объекта, нужно всего лишь внутри него реализовать два метода: __iter__() и __next__() :
- внутри метода __next__ () описывается процедура возврата следующего доступного элемента;
- метод __iter__() возвращает сам объект, что даёт возможность использовать его, например, в циклах с поэлементным перебором.
Создадим простой строковый итератор, который на каждой итерации, при получении следующего элемента (т.е. символа), приводит его к верхнему регистру:
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
Если последовательность collection состоит, скажем, из 10 элементов, for будет поочерёдно обходить их, храня значение текущего элемента в переменной item .
Принцип работы for максимально схож с таковым у циклов foreach , применяемых во многих других высокоуровневых языках.
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:
- range(stop) ;
- range(start, stop) ;
- range(start, stop, step) .
Здесь start — это первый элемент последовательности (включительно), stop — последний (не включительно), а step — разность между следующим и предыдущим членами последовательности.
# 0 — начальный элемент по умолчанию for a in range(3): print(a) > 0 1 2 # два аргумента for b in range(7, 10): print(b) > 7 8 9 # три аргумента for c in range(0, 13, 3): print(c) > 0 3 6 9 12
Подробнее о функции range тут:
Чрезвычайно полезная функция enumerate() определена на множестве итерируемых объектов и служит для создания кортежей на основании каждого из элементов объекта. Кортежи строятся по принципу (индекс элемента, элемент) , что бывает крайне удобно, когда помимо самих элементов требуется ещё и их индекс.
# заменим каждый пятый символ предложения, начиная с 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
Два похожих оператора, которые можно встретить и в других языках программирования.
- 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 происходит похожая ситуация, только прерывается лишь одна итерация, а сам же цикл продолжается.
else
Если два предыдущих оператора можно часто встречать за пределами Python, то else , как составная часть цикла, куда более редкий зверь. Эта часть напрямую связана с оператором break и выполняется лишь тогда, когда выход из цикла был произведен НЕ через break .
group_of_students = [21, 18, 19, 21, 18] for age in group_of_students: if age < 18: break else: print('Всё в порядке, они совершеннолетние') >Всё в порядке, они совершеннолетние
Best practice
Цикл по списку
Перебрать list в цикле не составляет никакого труда, поскольку список — объект итерируемый:
# есть список entities_of_warp = [«Tzeench», «Slaanesh», «Khorne», «Nurgle»] # просто берём список, «загружаем» его в цикл и без всякой задней мысли делаем обход for entity in entities_of_warp: print(entity) > Tzeench Slaanesh Khorne Nurgle
Так как элементами списков могут быть другие итерируемые объекты, то стоит упомянуть и о вложенных циклах. Цикл внутри цикла вполне обыденное явление, и хоть количество уровней вложенности не имеет пределов, злоупотреблять этим не следует. Циклы свыше второго уровня вложенности крайне тяжело воспринимаются и читаются.
strange_phonebook = [ [«Alex», «Andrew», «Aya», «Azazel»], [«Barry», «Bill», «Brave», «Byanka»], [«Casey», «Chad», «Claire», «Cuddy»], [«Dana», «Ditrich», «Dmitry», «Donovan»] ] # это список списков, где каждый подсписок состоит из строк # следовательно можно (зачем-то) применить тройной for # для посимвольного чтения всех имён # и вывода их в одну строку for letter in strange_phonebook: for name in letter: for character in name: print(character, end=») > A l e x A n d r e w A y a A z a z e l B a r .
Цикл по словарю
Чуть более сложный пример связан с итерированием словарей. Обычно, при переборе словаря, нужно получать и ключ и значение. Для этого существует метод .items() , который создает представление в виде кортежа для каждого словарного элемента.
Цикл, в таком случае, будет выглядеть следующим образом:
# создадим словарь top_10_largest_lakes = < "Caspian Sea": "Saline", "Superior": "Freshwater", "Victoria": "Freshwater", "Huron": "Freshwater", ># обойдём его в цикле for и посчитаем количество озер с солёной водой и количество озёр с пресной salt = 0 fresh = 0 # пара «lake, water», в данном случае, есть распакованный кортеж, где lake — ключ словаря, а water — значение. # цикл, соответственно, обходит не сам словарь, а его представление в виде пар кортежей for lake, water in top_10_largest_lakes.items(): if water == ‘Freshwater’: fresh += 1 else: salt += 1 print(«Amount of saline lakes in top10: «, salt) print(«Amount of freshwater lakes in top10: «, fresh) > Amount of saline lakes in top10: 1 > Amount of freshwater lakes in top10: 3
Цикл по строке
Строки, по сути своей — весьма простые последовательности, состоящие из символов. Поэтому обходить их в цикле тоже совсем несложно.
word = ‘Alabama’ for w in word: print(w, end=» «) > A l a b a m a
Как сделать цикл for с шагом
Цикл for с шагом создается при помощи уже известной нам функции range , куда, в качестве третьего по счету аргумента, нужно передать размер шага:
# выведем числа от 100 до 1000 с шагом 150 for nums in range(100, 1000, 150): print(nums) > 100 250 400 550 700 850
Обратный цикл for
Если вы еще не убедились в том, что range() полезна, то вот ещё пример: благодаря этой функции можно взять и обойти последовательность в обратном направлении.
# выведем числа от 40 до 50 по убыванию # для этого установим step -1 for nums in range(50, 39, -1): print(nums) > 50 49 48 47 46 45 44 43 42 41 40
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 в Python
В уроке познакомимся с циклом for в Python. Выполним задание «По элементам» на основе изученного материала.
Цикл for в Python
Неудобно писать один и тот же код, если нам надо повторить его действия. Для решения этой задачи используется цикл for, который работает заданное число раз. Работа происходит с помощью итератора.
Для работы с циклом нам пригодится функция range(). Range() создаёт ряд чисел для работы в диапазоне, например:
range(5) #[0, 1, 2, 3, 4] for i in range(5): #i 0 #i 1 #i 2 #i 3 #i 4
Теперь рассмотрим пример с использованием текста для вывода:
for i in range(5): print(i,"Hello")
Результатом работы такой программы будет:
0 Hello 1 Hello 2 Hello 3 Hello 4 Hello
В данном случае итерируемый объект i (счетчик), был пройден 5 раз. Шаг от нуля до пяти составляет единицу, этот параметр задается в range().
Функция range() задает границы и шаг. Правую границу пользователь обязательно должен указать. Если не указывать остальные значения, то по умолчанию левая граница будет равна нулю, шаг — единице.
>>> print(range(5)) range(0, 5)
Давайте зададим программе «нестандартные» числа диапазона:
for i in range (5,12,2): print(i,"Hello")
5 Hello 7 Hello 9 Hello 11 Hello
В качестве range можно сразу указывать строку:
S = "Hello world" for i in S: print(i)
H e l l o w o r l d
В данном случае итератором является элемент строки.
Задание «По элементам»
Необходимо составить программу с использованием цикла for. На вход программа получает строку символов и отдельный символ, производит сравнение символов в строке и введенного символа. В конце выводит результат.
S = input("Введи строку: ") c = input("Введи символ: ") if S.count(c)>0: for i in S: if(i==c): print(i,"<-",c) else: print(i) else: print("Нет искомого символа")
Введи строку: Hello world Введи символ: w H e l l o w
Введи строку: Hello world Введи символ: z Нет искомого символа
Курсы Робикс, в которых изучается этот материал.
- Программирование на Python в Minecraft
- Duckietown робот с системой Автопилота
Цикл for в Python
Цикл for в Python используется для перебора последовательностей (списков, кортежей, строк) и других итерируемых объектов. Перебор последовательности называется обходом.
Синтаксис цикла
for значение in последовательность:
Тело цикла for
Цикл продолжается до тех пор, пока мы не достигнем последнего элемента последовательности. Тело цикла for является отдельным блоком кода и отделяется отступом.
Блок-схема цикла
Пример цикла
# Программа находит сумму элементов последовательности # Список чисел numbers = [6, 5, 3, 8, 4, 2, 5, 4, 11] # Переменная, в которой хранится сумма sum = 0 # Итерация цикла for value in numbers: sum = sum+value print("Сумма равна", sum)
Вывод:
Сумма равна 48
Функция range()
С помощью функции range() мы можем сгенерировать последовательность чисел. range(10) , к примеру, сгенерирует числа от 0 до 9 (всего 10 чисел).
Мы также можем определить начало, конец и размер шага — range(начало, конец, размер_шага) . Если не указать шаг (размер_шага), то по умолчанию он будет равен 1.
Объект range в некотором смысле «ленивый». Когда мы вызываем этот объект, он не генерирует все числа, которые он «содержит». Но это и не итератор — он поддерживает операции in , len и __getitem__ .
Эта функция не хранит все значения в памяти — это неэффективно. Для нее важны лишь начало, конец и размер шага — генерация следующего числа происходит на ходу.
Для вывода всех элементов следует воспользоваться функцией list() .
Наглядный пример
print(range(10)) print(list(range(10))) print(list(range(2, 8))) print(list(range(2, 20, 3)))
Вывод:
range(0, 10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[2, 3, 4, 5, 6, 7]
[2, 5, 8, 11, 14, 17]
Функцию range() можно использовать для перебора последовательности чисел в цикле for . Индексация реализуется при комбинации с функцией len() . Пример:
# Программа для итерации списка с использованием индексации genre = ['поп', 'рок', 'джаз'] # проходимся по циклу, используя индекс i for i in range(len(genre)): print("Мне нравится", genre[i])
Вывод:
Мне нравится поп
Мне нравится рок
Мне нравится джаз
Цикл for с блоком else
В цикле for может быть дополнительный блок else . Блок else выполняется, если элементы последовательности закончились.
Для остановки цикла for используется ключевое слово break . В этом случае выполнение цикла останавливается.
Следовательно, блок else выполняется только в том случае, если выполнение цикла не было прервано оператором break.
Наглядный пример
digits = [0, 1, 5] for i in digits: print(i) else: print("Элементов в списке не осталось.")
Вывод:
0
1
5
Элементов в списке не осталось.
В этом примере цикл for печатает элементы списка до тех пор, пока он не закончится. После завершения цикла выполняется блок else , который печатает сообщение Элементов в списке не осталось .
Оператор for. else можно использовать так: блок else выполнится только в том случае, если не выполнится оператор break .
Пример
# Программа выводит на экран оценку студента student_name = 'Артем' marks = for student in marks: if student == student_name: print(marks[student]) break else: print('Студент не найден.')
Вывод:
