Avanceret Python Udviklingskursus
Kapitel
>
Niveau
Avancerede funktioner
Lukninger
Mål
Regulér vandforsyningen på gården ved at opsætte og bruge lukninger.
Der er fire vandtanke designet til at vande den omkringliggende jordbrugsjord, og det er på tide, at de omrokkeres for at sikre, at den rette mængde vand fordeles til de rette steder. For at gøre dette kan vi gøre opgaven meget nemmere ved at bruge lukninger.
Lukninger er indlejrede funktioner designet til at indkapsle data, hvilket reducerer antallet af variabler, du skal bruge, og skjuler dataene inde i funktionen, så de ikke kan manipuleres udefra – med andre ord, lukker funktionen.
For at regulere vandet i tankene opretter vi en indlejret funktion, der fungerer som en multiplikator. Denne funktion virker på samme måde som en løkke; den ydre funktion med navnet multiplier_of() har et argument, der multipliceres med argumentet for dens indre funktion med navnet multiplier().
# Nested Function
def multiplier_of(n):
def multiplier(number):
return number*n
return multiplier
Når den er sat op, skal vi indkapsle funktionen ved at oprette lukninger, hvilket forhindrer adgang til deres værdier og forstærker deres anvendelse.
# 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]
Lukningen ovenfor hedder multiply_by_2() og benytter den indlejrede funktion, vi oprettede med et fast argument, nemlig 2, hvilket er tallet, som lukningen er sat til at multiplicere med. Som resultat vil ethvert tal, vi tilføjer som argument, blive multipliceret med to (2), og denne egenskab kan ikke ændres, da den er indkapslet.
Når det kommer til regulering af vandtankene, skal du oprette tre (3) lukninger: multiply_by_2, multiply_by_3 og multiply_by_5. Opsæt dem manuelt ved hjælp af samme format, som i det tidligere givne eksempel, f.eks.: multiply_by_2 = multiplier_of(2).
Der findes en ordbogs-konstant på dette niveau kaldet tanks, som som indeks indeholder seks (6) farver: “red", “blue", “orange", “purple", “yellow" og “green". Hvert indeks indeholder et tal, der repræsenterer, hvor meget vand der strømmer gennem en tanks flank, og dette tal vil blive brugt til at regulere tanken ved hjælp af de tidligere diskuterede "multiply_by"-lukninger.
For at lette dette vil der blive oprettet en funktion i editoren kaldet regulate_water(), som tager to argumenter: farven, der repræsenterer de ovennævnte indeks, og multiplikatoren, som repræsenterer den multiplikator-lukning, der skal bruges. Et eksempel på funktionen i brug er som følger: regulate_water(“red" , multiply_by_2 ).
Gå hen til de mørke X-mærker over de farvede tæpper og vend dig mod tankene. Brug funktionen regulate_water() og angiv tæppets farve som det første argument og den korrekte multiplikator-lukning som det andet. Multiplikatorerne, der skal bruges for hvert farvet tæppe, er som følger:
multiply_by_2 - "red" and "green" multiply_by_3 - "blue" and "purple" multiply_by_5 - "orange" and "yellow"
Regulér vandet på hver af tankens flanker for at fuldføre niveauet.