Продвинутый курс разработки на Python
Глава
>
Уровень
Продвинутые функции
Замыкания
Цель
Регулировать подачу воды на ферму с помощью замыканий.
Существует четыре водяных бака, предназначенных для орошения окружающих сельскохозяйственных угодий, и пришло время их настроить так, чтобы правильное количество воды распределялось по нужным направлениям. Для этого мы можем значительно упростить задачу, используя замыкания.
Замыкания — это вложенные функции, предназначенные для инкапсуляции данных. Это уменьшает количество переменных, которые вам нужно использовать, и скрывает данные внутри функции, чтобы они не могли быть изменены извне, другими словами, закрывая функцию.
Для регулирования воды в баках мы создадим вложенную функцию, которая будет работать как умножитель. Эта функция работает так же, как цикл: внешняя функция с именем multiplier_of() имеет аргумент, который умножается на аргумент её внутренней функции с именем multiplier().
# Nested Function
def multiplier_of(n):
def multiplier(number):
return number*n
return multiplier
После настройки нам нужно закрыть функцию, создав замыкание, чтобы предотвратить доступ к её значениям и зафиксировать их использование.
# Set up Closure that multiplies any number by 2 multiply_by_2 = multiplier_of(2) # Uses closure to display a number on screen player.speak( multiply_by_2(4) ) # The number displayed is 8, the formula is [2 x 4 = 8]
Вышеуказанное замыкание называется multiply_by_2() и использует вложенную функцию, которую мы создали с заданным аргументом, а именно 2, то есть число, на которое замыкание умножает. В результате любое число, которое мы добавим в качестве аргумента, будет умножаться на два (2), и этот параметр нельзя изменить, поскольку он инкапсулирован.
Приступая к регулированию водопроводных баков, создайте три (3) замыкания: multiply_by_2, multiply_by_3 и multiply_by_5. Настройте каждое из них вручную, используя тот же формат, что и в приведенном ранее примере, например: multiply_by_2 = multiplier_of(2).
В этом уровне имеется константный словарь с именем tanks, который в качестве индекса содержит шесть (6) цветов: "red", "blue", "orange", "purple", "yellow" и "green". Каждый индекс хранит число, представляющее количество протекающей через боковую стенку бака воды, это число будет использоваться для регулирования бака с помощью вышеупомянутых замыкающих функций "multiply_by".
Для удобства в редакторе будет настроена функция с именем regulate_water(), которая принимает два аргумента: цвет, представляющий указанные выше индексы, и умножитель, представляющий используемое замыкание умножения. Пример использования функции выглядит следующим образом: regulate_water("red", multiply_by_2).
Подойдите к тем местам, отмеченным темными крестами, расположенным на цветных коврах, и встаньте перед баками. Используйте функцию regulate_water(), установив цвет ковра в качестве первого аргумента и соответствующее замыкание умножения — в качестве второго. Замыкания, которые необходимо применить для каждого цветного ковра, распределены следующим образом:
multiply_by_2 - "red" и "green" multiply_by_3 - "blue" и "purple" multiply_by_5 - "orange" и "yellow"
Отрегулируйте подачу воды на каждой боковой стенке бака, чтобы завершить уровень.