Avansert Pythonutviklingskurs
Kapittel
>
Nivå
Avanserte funksjoner
Lukninger
Mål
Reguler vannforsyningen på gården ved å sette opp og bruke closures.
Det finnes fire vanntanker designet for å irrigere det omkringliggende jordbruksland, og det er på tide å bytte dem ut for å sikre at riktig mengde vann distribueres til de rette stedene. For å gjøre jobben mye enklere kan vi bruke closures.
Closures er nestede funksjoner designet for å innkapsle data; dette reduserer antallet variabler du trenger å bruke og skjuler dataene innenfor funksjonen slik at de ikke kan manipuleres eksternt, med andre ord at funksjonen lukkes.
For å regulere vannet i tankene vil vi lage en nestet funksjon som fungerer som en multiplikator. Denne funksjonen fungerer på samme måte som en løkke; den ytre funksjonen, kalt multiplier_of(), har et argument som multipliseres med argumentet til dens indre funksjon kalt multiplier().
# Nested Function
def multiplier_of(n):
def multiplier(number):
return number*n
return multiplier
Når den er satt opp, må vi innkapsle funksjonen ved å sette opp closures. Dette hindrer tilgang til verdiene deres og sikrer at de brukes på riktig måte.
# 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]
Closure-en ovenfor heter multiply_by_2() og bruker den nestede funksjonen vi opprettet med et fastsatt argument, nemlig 2, som er tallet som closure-en skal multiplisere med. Som et resultat vil ethvert tall vi legger til som et argument bli multiplisert med to (2), og denne egenskapen kan ikke endres fordi den er innkapslet.
Når det gjelder regulering av vanntankene, sett opp tre (3) closures: multiply_by_2, multiply_by_3 og multiply_by_5. Sett opp hver av dem manuelt ved å bruke samme format som i eksempelet ovenfor, slik: multiply_by_2 = multiplier_of(2).
Det finnes en ordbokskonstant på dette nivået kalt tanks, som som indeks inneholder seks (6) farger: "red", "blue", "orange", "purple", "yellow" og "green". Hver indeks holder på et tall som representerer hvor mye vann som strømmer gjennom en tanks side, og dette tallet vil bli brukt til å regulere tanken ved hjelp av de tidligere nevnte “multiply_by”-closures.
For å legge til rette for dette vil en funksjon bli opprettet i editoren kalt regulate_water(). Den tar to argumenter: fargen som representerer indeksene nevnt ovenfor, og multiplikatoren som representerer den multiplier-closure som skal brukes. Et eksempel på funksjonen i bruk er som følger: regulate_water("red", multiply_by_2).
Gå til de mørke X-markeringene over de fargede teppene og vend deg mot tankene. Bruk regulate_water()-funksjonen, og sett teppets farge som det første argumentet og den riktige multiplier-closure som det andre. Multiplikatorene som skal brukes for hvert farget teppe er som følger:
multiply_by_2 - "red" and "green" multiply_by_3 - "blue" and "purple" multiply_by_5 - "orange" and "yellow"
Reguler vannet på hver av tankens sider for å fullføre nivået.