Перейти к содержанию

Циклы for

Для последовательной обработки данных в Python есть специальные языковые конструкции, которые называются циклы. Хотя слово цикл уже вошло в язык, но у английского слова cycle есть перевод, который лучше всего объясняет смысл этой конструкции — круговорот. То есть какой-то блок программы последовательно запускается много раз подряд. Цикл устроен следующим образом:

  • Есть точка входа или определения цикла — это место, в котором описываются условия повторения и обозначается начало конструкции
  • Обычно в точке цикла находится условие цикла, это проверка, которая будет проходить каждый раз, когда цикл будет запускаться заново и определяет стоит ли еще раз выполнять тело цикла
  • Тело цикла — это последовательность команд, которые надо выполнить
  • После того как тело цикла выполнится программа, возвращается к точке входа, где проверяется условие цикла

В некоторых языках программирования есть циклы с предусловием и постусловием, в Python есть только циклы с предусловием. И если честно их вполне хватает.

Чтобы было понятно на примере из реального мира представьте, что вы подготавливаете стол к вечеринке и вам надо сделать вкусные бутерброды, если все ингредиенты уже готовы, то ваша последовательность будет выглядеть приблизительно так:

Пока есть подготовленные ингредиенты выполнять следующие шаги:
   1. Взять кусочек хлеба из подготовленных
   2. Намазать масло или соус на кусочек хлеба в руке
   3. Положить овощи (если это не сладкий бутерброд)
   4. Положить начинку
   5. Красиво выложить готовый бутерброд на блюдо

Как видите циклы достаточно естественны для реального мира. Мы, люди, берем какое-то дело разбиваем на одинаковые части и многократно повторяем. В программировании циклы позволяют одну и ту же часть кода повторить множество раз последовательно.

В Python есть только два вида циклов: for и while. for подходит для тех случаев, когда у вас есть какое-то исчислимое множество элементов, которые вам надо обработать. while — когда надо работать до тех пор, пока не поменяются условия и исчезнет необходимость выполнять повторения, например пока не будет сделана какая-то работа.

Примеры из реальной жизни:

  • for вам надо присесть определенное количество раз, чтобы выполнить упражнение
  • while вы не знаете сколько конкретно надо сделать шагов, но надо бежать пока не пробежите 15 минут

Циклы for

Сейчас мы познакомимся с циклами for. Уникальная особенность цикла заключается в том, что он позволяет по очереди обработать множества и умеет создавать специальные переменные цикла. При каждом прохождении цикла будет браться следующий элемент (или элементы) множества и присваиваться переменной цикла. Лучше всего это объяснить на примере:

items = ['apple', 'gold', 'wood']
for i in items:
    # body of the loop
    print(i)

Разберем построчно:

  • Строка 1: Объявляется переменная items, это список, а списки, как и другие множества позволяют работать поэлементно.
  • Строка 2: Объявление цикла, которое говорит, что надо обработать каждый элемент изitems. И пока цикл будет проходить по множеству, то он будет брать по очереди элемент и класть его в переменную цикла i (краткое от item).
  • Строка 4: Функция print выводит на печать значение переменной цикла i.

Переменная i меняется после каждого раза, когда заканчивается выполнение тела цикла. Вы можете менять ее значение внутри тела как вам хочется, если это, конечно, не усложнит чтение кода. Но каждый раз, когда тело цикла и код вернется к началу цикла то ей будет присвоено новое значение.

Работа с типами с помощью цикла for

Бывает, что множество возвращает сразу несколько элементов. Тогда можно объявить сразу несколько переменных цикла. Это прекрасно работает со словарями, у которых есть специальный метод .items(). Который возвращает попарно сразу же и ключ словаря, и его значение:

guild = {
    "Codex": "Priest",
    "Zaboo": "Warlock",
    "Vork": "Warrior",
    "Bladezz": "Rogue",
    "Clara": "Mage",
    "Tinkerballa": "Ranger",
}

for nickname, role in guild.items():
    print(f"{nickname} is {role}")

Вызов guild.items() возвращает список, состоящий из кортежей из двух элементов которые раскрываются в переменные nickname и role.

>>> guild.items()
dict_items([('Codex', 'Priest'), ('Zaboo', 'Warlock'), ('Vork', 'Warrior'),
('Bladezz', 'Rogue'), ('Clara', 'Mage'), ('Tinkerballa', 'Ranger')])

Еще очень удобно работать с функцией enumerate, которая возвращает пару — номер элемента и сам элемент:

guild = {
    "Codex": "Priest",
    "Zaboo": "Warlock",
    "Vork": "Warrior",
    "Bladezz": "Rogue",
    "Clara": "Mage",
    "Tinkerballa": "Ranger",
}

for number, name in enumerate(guild.keys(), start=1):
    print(f"{number}. {name}")

Выражение в строке 10 получает список ключей словаря, и создает из них последовательность, состоящую из кортежей из двух элементов, где первый это номер созданный enumerate, а второй ключ словаря:

>>> list(enumerate(guild.keys(), start=1))
[(1, 'Codex'), (2, 'Zaboo'), (3, 'Vork'), (4, 'Bladezz'),
(5, 'Clara'), (6, 'Tinkerballa')]

Если просто необходимо сделать определенное количество повторов (итераций) цикла, то прекрасно подходит уже известная функция range:

>>> for i in range(1, 6):
...     print("Повтор", i)
...
Повтор 1
Повтор 2
Повтор 3
Повтор 4
Повтор 5

А еще можно последовательно обрабатывать строки, потому что строка тоже ведет себя как список:

>>> for n, c in enumerate("Python", 1):
...     print(n, c)
...
1 P
2 y
3 t
4 h
5 o
6 n

Для обработки в циклах подходят и все остальные типы множеств: кортежи (tuple), множества (set и frozenset), списки (list), строки (str).


Циклы for

Цикл for хорош тогда, когда до входа в цикл Вы понимаете сколько раз он должен быть выполнен.

Сегодня будет не самое обычное задание - немного финансовой грамотности, немного интересной истории и, конечно же, Ваши знания Python.

Сначала о сути. У финансистов есть такие понятия - "сложный процент" и "простой процент". Подробно об этом [вот тут][1]. На самом деле - все очень просто: если у Вас сложный процент, то по истечении срока вклада (например - год), начисленные проценты добавляются к сумме вклада ("капитализируются"), и в следующем периоде проценты начисляются на "вклад+проценты за предыдущий период". А если у Вас простой процент - то начисленные за период проценты выводятся на другой счет (например - на Вашу банковскую карточку) и Вы можете их использовать. А в расчете процентов в следующем периоде принимает участие только основная сумма вклада, без добавленных процентов. Сегодня мы будем сравнивать эти варианты вкладов.

Теперь об истории. Слышали фразу - "внес свою лепту"? Сегодня наша задача будет об этом) Есть такая библейская история - о ["лепте вдовицы"][2]. Подробности Вы можете прочитать ссылке, а суть в том, что Иисус увидел, как вдова пожертвовала 2 лепты (лепта в то время была самой мелкой монетой в Иерусалиме) на строительство храма. И оценил вклад ее гораздо значимее, чем значительно большие пожертвования богатых людей. Потому что это были все ее деньги.

Мы же сегодня оценим - как бы изменилось состояние этой вдовы, если бы она тогда положила эти деньги в банк в 0 году нашей эры (да, это условность), и они были сняты со счета 1 января 2021 года ее потомками. Сравним два варианта - используется сложный процент - начисленные за каждый год проценты капитализируются к сумме основного вклада каждый год и участвуют в начислении процентов в дальнейшем, и простой процент - в конце каждого года начисленные проценты перечисляются на карточку и их можно тратить. Сумма вклада остается прежней.

Используйте следующие переменные:

  1. interest_rate # процентная ставка по депозиту.
  2. start_deposit # число, соотвествущее первоначальному вкладу
  3. list_current_deposit_compoud_interest # список, который содержит суммы депозита в начале каждого года. current_deposit_compoud_interest[0] - сумма депозита в 0 году н.э., current_deposit_compoud_interest[2021] - сумма депозита в 2021 году. Для сложного процента.
  4. card_sum # сумма на карточке, на которую каждый год переводятся проценты при использовании схемы "простого процента". Считаем, что деньги с карточки не тратятся, а накапливаются.
  5. result_for_compound_interest # после всех расчетов в этой переменной должна оказаться сумма текущего состояния потомков вдовы в 2021 году, если бы деньги лежали на депозите по схеме "сложный процент"
  6. result_for_simple_interest # - переменная, в которой после исполнения всех расчетов должно находиться значение всего капитала потомков вдовы по состоянию на 1 января 2021 года (не забудьте про первоначальную сумму вклада)

1 2

Загрузка тренажера...

image