#5 Python для Data Science — разбор цикла for

Помните, как в предыдущей части инструкции if в Python сравнивались с тем, как принимает решения мозг человека, основываясь на неких условиях в повседневной жизни? В случае с циклами for ситуация та же. Человек перебирает весь список покупок, пока не купит все, что в нем указано. Дилер раздает карты до тех пор, пока каждый игрок не получит 5 штук. Спортсмен делает отжимания, пока не доберется до сотни… Циклы повсюду. Касательно циклов for в Python — они нужны для выполнения повторяющихся задач. В этот статье вы узнаете все, что нужно знать об этих циклах: синтаксис, логику и лучшие примеры.

Это практическое руководство!
Желательно повторять те части, где нужно писать код, и решать задачи в конце статьи! Также рекомендуется вернуться к прошлым материалам, если вы еще не ознакомились с ними.

  1. #1 Python для Data Science – Руководство для начинающих
  2. #2 Python для Data Science — Структуры данных
  3. #3 Python для Data Science — встроенные функции и методы Python
  4. #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)

Результат будет такой:

Возводим в квадрат каждое число списка.

Вот что происходит по шагам:

  1. Есть список (numbers) с 5 элементами.
  2. Берем первый элемент (из-за индексации с нуля, это будет 0 (нулевой) элемент) списка (1) и сохраняем его в переменную i.
  3. Исполняем функцию print(i * i), которая возвращает значение 1 в квадрате. Это 1.
  4. Затем весь процесс начинается заново…
  5. Берем новый элемент и присваиваем его переменной i.
  6. Снова исполняем функцию print (i * i) и получаем значение второго элемента в квадрате: 25
  7. Повторяем процесс…
    … пока не получим последний элемент, возведенный в квадрат.

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

Логика, лежащая в основе циклов for в Python

Теперь, когда стала понятна польза циклов for, нужно разобраться с логикой в их основе.

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

Это блок-схема с визуализацией процесса работы цикла:

Логика циклов for в Python

Разобьем ее и изучим все в деталях. В качестве примера будем использовать предыдущий код со списком numbers и их значениями, возведенными в квадрат:

numbers = [1, 5, 12, 91, 102]
for i in numbers:
    print(i * i)
  1. Определяем итерируемый объект (то есть, уже имеющийся список numbers = [1, 5, 12, 91, 102]).
  2. При создании цикла 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). Или любое другое значение. Суть в том, что это переменная и нужно не забывать ссылаться на нее внутри цикла.

  3. Продолжаем использовать числа в качестве примеров. Берем первый элемент итерируемого объекта (технически, из-за индексации с нуля — это 0 (нулевой) объект. Запустится первая итерация цикла. Нулевой элемент — это 1. Значением переменной i будет 1.
  4. Функция в цикле была print(i * i). Поскольку i = 1, результатом i * i будет 1. 1 выведется на экран.
  5. Цикл начинается заново.
  6. Берется следующий элемент, и начинается вторая итерация цикла. Первый элемент number — это 5.
  7. i равняется 5. Снова запустится print(i * i), а на экран выведется 25.
  8. Цикл начнется заново. Следующий элемент.
  9. Еще один элемент. Это уже третья итерация. Второй элемент — 12.
  10. print(i * i) выведет 144.
  11. Цикл стартует заново. Следующий элемент присутствует. Новая итерация.
  12. Третий элемент — 91. Значение в квадрате — 8281.
  13. Цикл стартует заново. Следующий элемент присутствует. Новая итерация.
  14. i равняется 102. Значение в квадрате — 10404.
  15. Цикл стартует заново. Но «следующего элемента» нет. Цикл завершается.

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

Итерация по строкам

Для цикла можно использовать и другие последовательности, а не только списки. Попробуем строку:

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)

Итерация по объектам range()

Она принимает три аргумента:

Как происходит итерация по объектам range()

  • the first element: первый элемент диапазона
  • the last element: можно было бы предположить, что это последний элемент диапазона, но это не так. На самом деле здесь определяется элемент, который будет идти после последнего. Если ввести 10, то диапазон будет от 0 до 9. Если 11 — от 0 до 10 и так далее.
  • the step: это разница между элементами диапазона. Если это 2, то будет выводиться только каждый второй элемент.

Можете теперь угадать, каким будет результат диапазона сверху?


Вот он:

Итерация по объектам range с шагом

Примечание: атрибуты first element и step опциональны. Если их не определить, тогда первым элементом будет 0, а шаг по умолчанию — это 1. Попробуйте следующее в Jupyter Notebook и проверьте результат:

 my_list = range(10)
 for i in my_list:
     print(i)

Зачем нужна range()? В двух случаях:

  1. Необходимо перебрать числа. Например, нужно возвести в куб нечетные числа между 1 и 9. Без проблем:
    my_list = range(1, 10, 2)
    for i in my_list:
        print(i * i * i)
    
  2. Необходимо перебрать список, сохранив индексы элементов.
    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.

Лучшие примеры и распространенные ошибки

  1. Циклы for — это не самая простая тема для начинающих. Чтобы работать с ними, нужно алгоритмическое мышление. Но с практикой понимание приходит… Если же попалась действительно сложна задача, лучше нарисовать схему а бумаге. Просто пройти первые итерации на бумаге и записать результаты. Так будет понятнее.
  2. Как и в случае с инструкциями if, нужно быть внимательными с синтаксисом. Двоеточие обязательно в конце строки for. А перед строкой в теле цикла должны быть 4 отступа.
  3. Нельзя выводить строки и числа в функции print() с помощью знака +. Это больше особенность функции print, а не цикла for, но чаще всего такая проблема будет встречать в циклах. Например:

Если встречается такое, лучше всего превратить числа в строки с помощью функции str(). Вот предыдущий пример с правильным синтаксисом:

Нельзя выводить строки и числа в функции print

Вот и все. Пришло время упражнений.

Проверьте себя

Вот отличное упражнение для цикла 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])

Разбор цикла for — задача

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

Итого

Циклы for в Python очень важны. Они широко используются в data science. Синтаксис довольно простой, но для понимания логики нужно постараться. Этой статьи должно быть достаточно, чтобы разобраться в основах, поэтому все, что остается, — практиковаться.

В следующем материале вы узнаете, как объединять циклы for между собой и циклы for с инструкциями if.