Curso Avanzado de Desarrollo en Python
Capítulo
>
Nivel
Funciones Avanzadas
Clausuras
Objetivo
Regular el suministro de agua en la granja configurando y usando clausuras.
Hay cuatro tanques de agua diseñados para regar los terrenos circundantes, ya es hora de cambiarlos para asegurarse de que la cantidad correcta de agua se distribuya a los lugares adecuados. Para lograr esto, podemos facilitar mucho el trabajo utilizando clausuras.
Las clausuras son funciones anidadas diseñadas para encapsular datos, lo que reduce la cantidad de variables que necesitas usar y oculta los datos dentro de la función para que no puedan ser manipulados externamente, en otras palabras, cerrando la función.
Para regular el agua en los tanques, crearemos una función anidada que funcione como multiplicador. Esta función opera de la misma manera que un bucle: la función externa llamada multiplier_of() tiene un argumento que se multiplica por el argumento de su función interna llamada multiplier().
# Nested Function
def multiplier_of(n):
def multiplier(number):
return number*n
return multiplier
Una vez configurada, necesitamos encapsular la función estableciendo clausuras, lo que evita el acceso a sus valores y solidifica su 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]
La clausura anterior se llama multiply_by_2() y utiliza la función anidada que creamos con un argumento establecido, que es 2, el cual es el número por el que la clausura está configurada para multiplicar. Como resultado, cualquier número que agreguemos como argumento se multiplicará por dos (2) y este atributo no se puede cambiar debido a que está encapsulado.
Pasando a regular los tanques de agua, configura tres (3) clausuras: multiply_by_2, multiply_by_3 y multiply_by_5. Configura manualmente cada una de ellas utilizando el mismo formato empleado en el ejemplo proporcionado anteriormente, de esta manera: multiply_by_2 = multiplier_of(2).
Hay una constante de diccionario en este nivel llamada tanks, la cual, como índice, contiene seis (6) colores: “red", “blue", “orange", “purple", “yellow" y “green". Cada índice contiene un número que representa la cantidad de agua que fluye a través del flanco de un tanque; este número se utilizará para regular el tanque mediante las clausuras "multiply_by" mencionadas anteriormente.
Para facilitar esto, se configurará una función en el editor llamada regulate_water(), que toma dos argumentos: el color, que representa los índices descritos anteriormente, y el multiplicador, que representa la clausura multiplicadora a usar. Un ejemplo de la función en uso es el siguiente: regulate_water(“red" , multiply_by_2 ).
Camina hacia las marcas X oscuras sobre las alfombras de colores y enfréntate a los tanques; usa la función regulate_water() y establece el color de la alfombra como el primer argumento y la clausura multiplicadora adecuada como el segundo. Los multiplicadores a usar en cada alfombra de color son los siguientes:
multiply_by_2 - "red" and "green" multiply_by_3 - "blue" and "purple" multiply_by_5 - "orange" and "yellow"
Regula el agua en cada uno de los flancos del tanque para completar el nivel.