Ogrevalna naloga

V ogrevalni nalogi si predstavljajmo, da imamo enega smučarja. Njegove točke v različnih disciplinah shranjujemo v (globalni) spremenljivki primernega tipa. Kakšen tip bi to bil, odkrijte sami; upoštevajte, da imena disciplin niso podana vnaprej, temveč si jih lahko izmišljamo sproti (v testih je neka disciplina "velesmuk" in disciplina, katere ime je naključna črka, ki si jo izmislijo testi).

Napišite funkciji dodaj(disciplina, tocke), ki prišteje podano število točk pri podani disciplini, in tock(disciplina), ki vrne podano število točk.

Funkciji bi se lahko uporabljali takole.

>>> dodaj("slalom", 15) >>> dodaj("slalom", 3) >>> dodaj("smuk", 8) >>> tock("slalom") 18 >>> tock("smuk") 8 >>> dodaj("slalom", 4) >>> tock("slalom") 22 >>> tock("veleslalom") 0

Bodite pozorni na zadnji izpis: funkcija tock vrne 0 točk, če gre za disciplino, v kateri tekmovalec še ni dobil nobene točke.

Rešitev

V rešitvi bomo naredili nekaj, kar se ne sme - uporabljali globalne spremenljivke. Ne tako grdo, da bi morali uporabiti celo global, a vseeno - to se ne dela. Namen te ogrevalne naloge je tudi, da se potem v obvezni nalogi pokaže, kako te stvari delati pravilneje.

Če vemo za slovarje s privzetimi vrednostmi, je življenje lahko.

from collections import defaultdict tocke = defaultdict(int) def dodaj(disciplina, tock): tocke[disciplina] += tock def tock(disciplina): return tocke[disciplina]

Brez njih se je potrebno nekoliko bolj potruditi, saj moramo tako od dodajanju elementov kot ob njihovem iskanju preverjati, ali jih že imamo v slovarju.

tocke = {} def dodaj(disciplina, tock): if disciplina not in tocke: tocke[disciplina] = tock else: tocke[disciplina] += tock def tock(disciplina): if disciplina not in tocke: return 0 return tocke[disciplina]

V drugi funkciji nam muke nekoliko skrajša get:

def tock(disciplina): return tocke.get(disciplina, 0)

Obvezna naloga

Zdaj pa ista reč, a za več smučarjev. Definirajte razred Smucar, ki bo imel metodi dodaj(self, disciplina, tocke) in tock(self, disciplina); prvi prišteje temu smučarju podano število točk v podani disciplini, druga vrne število točk, ki jih je ta smučar doslej dosegel v tej disciplini.

>>> ana = Smucar() >>> ana.dodaj("slalom", 15) >>> ana.dodaj("slalom", 3) >>> berta = Smucar() >>> ana.dodaj("smuk", 8) >>> berta.dodaj("slalom", 4) >>> ana.tock("slalom") 18 >>> ana.tock("smuk") 8 >>> berta.tock("slalom") 4 >>> berta.tock("smuk") 0 >>> ana.tock("veleslalom") 0

Spomnite se, kako sem na predavanjih rekel nekaj v slogu, da je objekt svet zase; tisto, kar bi bilo brez objektov globalna spremenljivka, je tu "spremenljivka" znotraj selfa.

Rešitev

Vse je isto, le da tocke ni več globalna spremenljivka, temveč pripada razredu Smucar in se imenuje self.tocke. Nastavimo jo v konstruktorju. Funkciji dodaj in tock postaneta metodi in dobita argument self.

class Smucar: def __init__(self): self.tocke = collections.defaultdict(int) def dodaj(self, disciplina, tock): self.tocke[disciplina] += tock def tock(self, disciplina): return self.tocke[disciplina]
Última modificación: viernes, 22 de mayo de 2015, 22:58