Помните, как в предыдущей части инструкции if в Python сравнивались с тем, как принимает решения мозг человека, основываясь на неких условиях в повседневной жизни? В случае с циклами for ситуация та же. Человек перебирает весь список покупок, пока не купит все, что в нем указано. Дилер раздает карты до тех пор, пока каждый игрок не получит 5 штук. Спортсмен делает отжимания, пока не доберется до сотни… Циклы повсюду. Касательно циклов for в Python — они нужны для выполнения повторяющихся задач. В этот статье вы узнаете все, что нужно знать об этих циклах: синтаксис, логику и лучшие примеры.
Это практическое руководство!
Желательно повторять те части, где нужно писать код, и решать задачи в конце статьи! Также рекомендуется вернуться к прошлым материалам, если вы еще не ознакомились с ними.
- #1 Python для Data Science – Руководство для начинающих
- #2 Python для Data Science — Структуры данных
- #3 Python для Data Science — встроенные функции и методы Python
- #4 Python для Data Science — инструкции if в Python
Циклы for в Python — два простых примеры
Перво-наперво: циклы for нужны для перебора (итерации) итерируемых объектов. В большинстве случаев ими будут выступать уже знакомые списки, строки и словари. Иногда это могут быть объекты range()
(об этом в конце статьи).
Начнем с простейшего примера — списка!
В прошлых руководствах неоднократно использовался пес Фредди. И вот он снова здесь для иллюстрации примера. Создадим список:
dog = ['Freddie', 9, True, 1.1, 2001, ['bone', 'little ball']]
Теперь, когда есть готовый список, можно перебрать все его элементы, выводя их один за одним с помощью простейшего цикла for:
for i in dog:
print(i)
Результатом будут элементы списка, выведенные один за одним на разных строках:
Freddie
9
True
1.1
2001
['bone', 'little ball']
Но в чем преимущество такого способа? Используем другой пример — список чисел:
numbers = [1, 5, 12, 91, 102]
Предположим, что нужно возвести в квадрат каждое из них.
Примечание: к сожалению, формула
numbers * numbers
не сработает… Это кажется логичным, но, узнав Python лучше, станет понятно, что это совсем не логично.
Нужно сделать следующее:
for i in numbers:
print(i * i)
Результат будет такой:
Вот что происходит по шагам:
- Есть список (
numbers
) с 5 элементами. - Берем первый элемент (из-за индексации с нуля, это будет 0 (нулевой) элемент) списка (
1
) и сохраняем его в переменнуюi
. - Исполняем функцию
print(i * i)
, которая возвращает значение1
в квадрате. Это1
. - Затем весь процесс начинается заново…
- Берем новый элемент и присваиваем его переменной
i
. - Снова исполняем функцию
print (i * i)
и получаем значение второго элемента в квадрате:25
- Повторяем процесс…
… пока не получим последний элемент, возведенный в квадрат.
Это базовый пример работы цикла в Python, но сильно сложнее он не будет становиться — только комплекснее.
Логика, лежащая в основе циклов for в Python
Теперь, когда стала понятна польза циклов for, нужно разобраться с логикой в их основе.
Примечание: это одна из важнейших частей руководства. Многие люди без проблем используют базовые циклы, но затрудняются применять те что посложнее. Проблема в том, что они изучают синтаксис, но забывают разобраться в логике. Поэтому желательно перечитывать этот раздел до тех пор, пока не станет понятно что к чему. В будущем вы поблагодарите себя за то, что когда-то потратили на это время.
Это блок-схема с визуализацией процесса работы цикла:
Разобьем ее и изучим все в деталях. В качестве примера будем использовать предыдущий код со списком numbers
и их значениями, возведенными в квадрат:
numbers = [1, 5, 12, 91, 102]
for i in numbers:
print(i * i)
- Определяем итерируемый объект (то есть, уже имеющийся список
numbers = [1, 5, 12, 91, 102]
). - При создании цикла for первая строка всегда будет выглядеть как-то так:
for i in numbers:
for
иin
— это ключевые слова Python, аnumber
— название списка. Но куда важнее переменнаяi
. Это «временная» переменная, и ее единственная роль заключается в хранении конкретного элемента списка, который будет работать в момент каждой отдельной итерации цикла. Хотя в большинстве случаев эта переменная обозначается какi
(в онлайн-курсах и даже книгах), важно знать, что можно выбрать любое имя. Это может быть не толькоi
(for i in numbers
), но, напримерx
(for x in numbers
) илиhello
(for hello in numbers
). Или любое другое значение. Суть в том, что это переменная и нужно не забывать ссылаться на нее внутри цикла. - Продолжаем использовать числа в качестве примеров. Берем первый элемент итерируемого объекта (технически, из-за индексации с нуля — это 0 (нулевой) объект. Запустится первая итерация цикла. Нулевой элемент — это
1
. Значением переменнойi
будет1
. - Функция в цикле была
print(i * i
). Поскольку i = 1, результатомi * i
будет1
.1
выведется на экран. - Цикл начинается заново.
- Берется следующий элемент, и начинается вторая итерация цикла. Первый элемент
number
— это5
. i
равняется5
. Снова запуститсяprint(i * i)
, а на экран выведется25
.- Цикл начнется заново. Следующий элемент.
- Еще один элемент. Это уже третья итерация. Второй элемент —
12
. print(i * i)
выведет144
.- Цикл стартует заново. Следующий элемент присутствует. Новая итерация.
- Третий элемент —
91
. Значение в квадрате —8281
. - Цикл стартует заново. Следующий элемент присутствует. Новая итерация.
i
равняется102
. Значение в квадрате —10404
.- Цикл стартует заново. Но «следующего элемента» нет. Цикл завершается.
Это очень-очень подробное объяснение третьей строки. Но такой разбор нужен лишь первый раз. Уже в следующий раз вся логика будет у вас в голове. Но важно было рассмотреть все таким вот образом, потому что у начинающих специалистов именно этой логики и не достает, а такой недостаток прямо влияет на качество кода.
Итерация по строкам
Для цикла можно использовать и другие последовательности, а не только списки. Попробуем строку:
my_list = "Hello World!"
for i in my_list:
print(i)
Все просто. Буквы выводятся одна за одной. Важно запомнить, что строки всегда обрабатываются как последовательности символов, поэтому цикл for и работает с ними так же, как и со списками.
Итерация по объектам range()
range()
— это встроенная функция Python и она используется почти всегда только в циклах for. Но для чего? Если говорить простым языком — она генерирует список чисел. Вот как это работает:
my_list = range(0,10)
for i in my_list:
print(i)
Она принимает три аргумента:
- the first element: первый элемент диапазона
- the last element: можно было бы предположить, что это последний элемент диапазона, но это не так. На самом деле здесь определяется элемент, который будет идти после последнего. Если ввести 10, то диапазон будет от 0 до 9. Если 11 — от 0 до 10 и так далее.
- the step: это разница между элементами диапазона. Если это 2, то будет выводиться только каждый второй элемент.
Можете теперь угадать, каким будет результат диапазона сверху?
Вот он:
Примечание: атрибуты first element и step опциональны. Если их не определить, тогда первым элементом будет 0, а шаг по умолчанию — это 1. Попробуйте следующее в Jupyter Notebook и проверьте результат:
my_list = range(10)
for i in my_list:
print(i)
Зачем нужна range()
? В двух случаях:
- Необходимо перебрать числа. Например, нужно возвести в куб нечетные числа между 1 и 9. Без проблем:
my_list = range(1, 10, 2) for i in my_list: print(i * i * i)
- Необходимо перебрать список, сохранив индексы элементов.
my_list = [1, 5, 12, 91, 102] my_list_length = len(my_list) for i in range(0,my_list_length): print(i, my_list[i] * my_list[i])
В этом случае
i
— это индекс, а элементами списка будутmy_list[i]
.
В любом случае, range()
упростит работу с циклами в Python.
Лучшие примеры и распространенные ошибки
- Циклы for — это не самая простая тема для начинающих. Чтобы работать с ними, нужно алгоритмическое мышление. Но с практикой понимание приходит… Если же попалась действительно сложна задача, лучше нарисовать схему а бумаге. Просто пройти первые итерации на бумаге и записать результаты. Так будет понятнее.
- Как и в случае с инструкциями if, нужно быть внимательными с синтаксисом. Двоеточие обязательно в конце строки
for
. А перед строкой в теле цикла должны быть 4 отступа. - Нельзя выводить строки и числа в функции
print()
с помощью знака+
. Это больше особенность функцииprint
, а не цикла for, но чаще всего такая проблема будет встречать в циклах. Например:
Если встречается такое, лучше всего превратить числа в строки с помощью функции str()
. Вот предыдущий пример с правильным синтаксисом:
Вот и все. Пришло время упражнений.
Проверьте себя
Вот отличное упражнение для цикла for:
Возьмите переменную и присвойте ей случайную строку.
Затем выведите пирамиду из элементов строки как в этом примере:
my_string = "python"
Вывод:
p
py
pyt
pyth
pytho
python
pytho
pyth
pyt
py
p
Напишите код, который бы делал подобное для любого значения my_string
.
Решение
Примечание: есть несколько способов решения этой задачи. Дальше будет относительно простое, но вы можете использовать и посложнее.
my_string = "python"
x = 0
for i in my_string:
x = x + 1
print(my_string[0:x])
for i in my_string:
x = x - 1
print(my_string[0:x])
Решение говорит само за себя. Единственная хитрость заключается в использовании переменной-счетчика «x», которая показывает количество символов, необходимых для вывода в этой итерации. В первом цикле for значение увеличивается, пока не доберется до значения количества символов в слове. Во втором — опускается до нуля, пока на экране не останется ни одного символа.
Итого
Циклы for в Python очень важны. Они широко используются в data science. Синтаксис довольно простой, но для понимания логики нужно постараться. Этой статьи должно быть достаточно, чтобы разобраться в основах, поэтому все, что остается, — практиковаться.
В следующем материале вы узнаете, как объединять циклы for между собой и циклы for с инструкциями if.