Curso Avançado de Desenvolvimento Python
Capítulo
>
Nível
Funções Avançadas
Fechamentos
Objetivo
Regular o abastecimento de água na fazenda configurando e utilizando closures.
Existem quatro tanques de água projetados para irrigar as plantações ao redor, está na hora de alterná-los para garantir que a quantidade correta de água seja distribuída para os locais certos. Para fazer isso, podemos facilitar muito o trabalho utilizando Closures.
Closures são funções aninhadas criadas para encapsular dados, isso reduz a quantidade de variáveis que você precisa usar e esconde os dados dentro da função para que não possam ser manipulados externamente; em outras palavras, fechando a função.
Para regular a água nos tanques, criaremos uma função aninhada que funciona como multiplicador. Essa função funciona da mesma forma que um loop, a função externa chamada multiplier_of() tem um argumento que é multiplicado pelo argumento de sua função interna chamada multiplier().
# Nested Function
def multiplier_of(n):
def multiplier(number):
return number*n
return multiplier
Uma vez configurado, precisamos encapsular a função criando closures, o que impede o acesso aos seus valores e solidifica seu uso.
# 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]
O closure acima é chamado multiply_by_2() e utiliza a função aninhada que criamos com um argumento definido, que é 2, que é o número pelo qual o closure está configurado para multiplicar. Como resultado, qualquer número que adicionarmos como argumento será multiplicado por dois (2) e esse atributo não pode ser alterado por estar encapsulado.
Passando para a regulação dos tanques de água, configure três (3) closures: multiply_by_2, multiply_by_3 e multiply_by_5. Configure cada um deles manualmente utilizando o mesmo formato usado no exemplo fornecido anteriormente, assim: multiply_by_2 = multiplier_of(2).
Há uma constante dicionário neste nível chamada tanks, que, como índice, possui seis (6) cores: "red", "blue", "orange", "purple", "yellow" e "green". Cada índice contém um número representando quanta água está fluindo pelo flanco de um tanque; esse número será utilizado para regular o tanque usando os closures "multiply_by" discutidos anteriormente.
Para facilitar isso, uma função será configurada no editor chamada regulate_water(), que recebe dois argumentos: a cor, que representa os índices descritos acima, e o multiplicador, que representa o closure multiplicador a ser utilizado. Um exemplo do uso da função é o seguinte: regulate_water("red" , multiply_by_2).
Caminhe até os X escuros que marcam os tapetes coloridos e encare os tanques, use a função regulate_water() e defina a cor do tapete como o primeiro argumento e o closure multiplicador adequado como o segundo. Os multiplicadores a serem usados em cada tapete colorido são os seguintes:
multiply_by_2 - "red" and "green" multiply_by_3 - "blue" and "purple" multiply_by_5 - "orange" and "yellow"
Regule a água em cada um dos flancos dos tanques para completar o nível.