Praktikum 13¶
Allolevad ülesanded on kusrsuse "Sissejuhatus programmeerimisse Pythoni baasil" YFX0500 praktikumis koos kursusega ja kodus iseseisvalt lahendamiseks. Kuidas lahendada allolevaid ülesandeid? Uuri ja kasuta loengus kommenteeritud süntaksi näiteid, abiinfot (Pythoni sisseehitatud funktsioon help
, jne.), Internetti ja enda aju. Küsimuste korral, mis tekivad praktikumi ajal, pöördu õppejõu või õppejõudude poole. Iganädalaselt peale praktikumi toimumist avaldatakse ülesannete lahendused kursuse kodulehel.
Ülesanne 1:
Loo klass mis loob kahemõõtmelisi punkte. Defineeri punktide liitmise meetod. Veendu, et objekti esitus sõnena oleks kujul (x, y)
, kus x
ja y
on punkti koordinadid.
Ülesanne 2:
Loo klass Punkt
mis defineerib kahemõõtmelisi punkte $A = (A_x, A_y)$. Kirjuta meetod kaugus_punktist
mis leiab punkti kauguse teisest meelevaldselt valitud punktist. Kahe punkti vahelise vahemaa $D$ leidmiseks kasuta valemit
kus $B = (B_x, B_y)$ on punkt ja kus omakorda $B_x$ ja $B_y$ on punkti koordinaadid. Lisaks loo meetod liiga_ligidal
mis hoiatab kasutajat juhul kui punktid on teineteisele liiga lähedal. Minimaalne lubatud vahemaa edasta meetodile argumendina.
Ülesanne 3:
Muuda allolevas klassis meetod milline
dünaamiliseks klassimuutujaks. Kasuta dekoraatorit @property
.
class Olend:
def __init__(self, jalgu, tiibu):
self.jalgu = jalgu # täisarv
self.tiibu = tiibu # täisarv
def milline(self):
if self.jalgu == 2:
if self.tiibu == 1:
print('Kahejalgne olend kellel on üks tiib.')
elif self.tiibu == 0:
print('Kahejalgne olend kellel pole tiibu.')
else:
print(f'Kahejalgne olend kellel on {self.tiibu} tiiba.')
elif self.jalgu == 4:
if self.tiibu == 1:
print('Neljajalgne olend kellel on üks tiib.')
elif self.tiibu == 0:
print('Neljajalgne olend kellel pole tiibu.')
else:
print(f'Neljajalgne olend kellel on {self.tiibu} tiiba')
else:
if self.tiibu == 1:
print('Mitte kahe- või neljajalgne olend kellele on üks tiib.')
elif self.tiibu == 0:
print('Mitte kahe- või neljajalgne olend kellel pole tiibu.')
else:
print(f'Mitte kahe- või neljajalgne olend kellele on {self.tiibu} tiiba.')
Ülesanne 4:
Uuri alljärgnevat koodi.
class Imetaja:
def __init__(self, nimi):
print(nimi, "on imetaja.")
class OskabLennata(Imetaja):
def __init__(self, oskabLennata_nimi):
print(oskabLennata_nimi, "ei oska lennata.")
super().__init__(oskabLennata_nimi)
class OskabUjuda(Imetaja):
def __init__(self, oskabUjuda_nimi):
print(oskabUjuda_nimi, "ei oska ujuda.")
super().__init__(oskabUjuda_nimi)
class Loom(OskabLennata, OskabUjuda):
def __init__(self, nimi):
super().__init__(nimi)
Tom = Loom("Koer")
Koodi interpreteerimiesel trükitakse konsooli väljund:
Koer ei oska lennata.
Koer ei oska ujuda.
Koer on imetaja.
Miks sellises järjekorras?
Ülesanne 5:
Tutvu alljärgneva klassiga.
class Loomad:
def __init__(self):
self.jalad = 4
self.kodustatud = True
self.saba = True
self.imetaja = True
def on_imetaja(self):
if self.imetaja:
print("On imetaja.")
def on_kodustatud(self):
if self.kodustatud:
print("On kodustatud loom.")
Loo kaks alamklassi, klass Koerad
ja klass Hobused
. Mõlemad klassid peab pärima kogu superklassi Loomad
sisu. Klass Hobused
peab sisaldama, lisaks superklassi meetoditele, ka meetodit mis kontrollib kas loomal on saba ja neli jalga. Peale kontrolli peab meetod väljastama sellekohase teate.
Esita kaks lahendust. Kasuta nii superklassi nime kui ka funktsiooni super
.
Ülesanne 6:
Kasuta eelmises ülesandes kasutatud superklassi Loomad
. Lisa sellele staatiline meetod mis leieab sellele etteantud meelevaldse arvu numbrite summa naturaallogaritmi
kus $\xi$ on etteantud number ja $n$ on nende arv.
Ülesanne 7:
Tutvu klassiga Tudeng
. Klass Tudeng
on kujul:
class Tudeng:
kursus = 'Python YFX0500'
hinne = None
Lisa sellele kaks klassimeetodit. Meetod prindi
mis väljastab konsooli kursuse nime ja meetodi lisahinne
mis omistab klassimuutujale hinne
hinde (arvu) ja väljastab sellekohase teate.
Vihje: Kasuta dekoraatorit @classmethod
.
Ülesanne 8:
Kapselda allolevad koodis kõik peale meetodi data
:
class A:
cls_A_a = 1
cls_A_b = 22
def __init__(self, obj_a, obj_b):
self.obj_a = obj_a
self.obj_b = obj_b
def cls_A_method(self):
return 'obj_a = {} and obj_b = {}.'.format(self.obj_a, self.obj_b)
def data(self): # Avalik meetod.
obj_b_id = id(self.obj_b)
return 'obj_b = {}, obj_b id = {}.'.format(self.obj_b, obj_b_id)
obj = A(3, 44)
print(obj.data())
Ülesanne 9:
Loo klass mis defineerib tudengeid. Tudengiga peavad olema seotud järgmised andmed: nimi, perekonna nimi, sugu, kaal, õppekava ja info selle kohata kas tudeng on HIV positiivne või mitte. Kapselda tudengiga seotus andmed. Tudengi objekti esitus sõnena (meetod __repr__
) peab sõltuma tudengi HIV staatusest:
- HIV negatiivne
Tudeng <nimi> <perekonna nimi> kes kaalub <kaal> kg on jumala ingel.
- HIV positiivne
NB! Tudeng <nimi> <perekonna nimi> on HIV parasiit, ära suru tema kätt! Löö teda!
Ülesanne 10:
Paranda eelmises ülesandes kirjutatud klass. Muuda meetod __repr__
viisakaks, see võiks väljastada sõne kujul: Tudeng <nimi> <perekonna nimi> kes õpib <oppekava> õppekaval.
. Lisaks loo uus meetod mis väljastab sõne mis sõltub tudengi HIV staatusest:
- HIV negatiivne
Tudeng <nimi> <perekonna nimi> kes kaalub <kaal> kg on jumala ingel.
- HIV positiivne
NB! Tudeng <nimi> <perekonna nimi> on HIV parasiit, ära suru tema kätt! Löö teda!
Ülesanne 11:
Täiusta eelmises ülesandes loodud klassi. Muuda HIV staatusest sõltuv meetod privaatseks (kapselda see). Loo uus avalik (kapseldamata) meetod mis väljastab HIV staatusest sõltuva meetodi väljakutse.
Ülesanne 12:
Kirjuta klass Juurjalg
mis loob juurjalgu. Juurjalg on amööb kes saab olla kas punane või roheline. Juurjalg oskab teha ainult kolme asja:
- Toituda mille tulemusena juurjala kehakaal kasvab söödud toidu kaalu võrra. Toitumisele järgneb alati väljaheitmine ja mõnikord juurjalg ka paljuned peale söömist ja väljaheitmist. Paljunemine juhtub kui juurjala kaal saab kolm või rohkem korda suuremaks tema algsest sünnikaalust.
- Väljaheidet tekitades väheneb juurjala kaal näiteks 20% võrra tema kehakaalust.
- Paljunemine tähendab seda, et tekib uus juurjalg kelle sünnikaal on meie just vanemaks saanud juurjala algne kaal ja kelle väljaheite kaalu protsent kehakaalust saab olema vanema omast omakorda 10% suurem. Sündinud juurjala värv on määratud juba olemasolevate juurjalgade värvist. Kui populatsioonis on rohken punaseid siis sünnib alati roheline juurjalg ja vastupidi. Paljunemeise tahajärjel väheneb vanema kaal pooldunud juurjala kaalu võrra ehk vanema või juurjala algse kaalu võrra.
Anna kasutajale juurjalga luues võimalus määrata sellele algne kaal, värvus ja protsentides seda kui palju moodustab ühe väljaheite kaal juurjala kehakaalust.
Ülesanne 13: (vt. vrd. Praktikum 12)
Koosta programm pangakontode loomiseks kasutades Pythoni klassi.
Programmiga peab saama:
- Luua uusi kontosid (objekt), andes kontole nime ja mingi hulga raha
- Kanda kontole raha (meetod)
- Kontole ei saa kanda negatiivset summat
- Võtta kontolt raha (meetod)
- Kontolt ei saa võtta negatiivset summat
- Kontolt ei saa võtta rohkem raha kui kontol on
Ülesanne 14:
Koosta programm pangakontode loomiseks kasutades Pythoni klassi.
Programmiga peab saama (kaldkirjas olev tekst on same mis eelmises ülesandes):
- Luua uusi kontosid (objekt), andes kontole nime ja mingi hulga raha
- Kanda kontole raha (meetod)
- Kontole ei saa kanda negatiivset summat
- Võtta kontolt raha (meetod)
- Kontolt ei saa võtta negatiivset summat
- Kontolt ei saa võtta rohkem raha kui kontol on
- Kanda ühelt kontolt raha teisele
- Kehtivad samad reeglid, mis kontole raha kandmisel ja välja võtmisel
Ülesanne 15:
Lisaks deebetkaardi kontole (eelmised kaks ülesannet) loo krediitkaardi konto. Krediitkaardi kontode loomiseks kasuta uut klassi, mis pärib vajamineva deebetkaardi konto klassist, st. väldi atribuutide ja meetodite ilmutatud kujul dubleerimist.
Krediitkaardi kontoga peab saama:
- Luua uusi kontosid, andes kontole nime ja mingi hulga raha ja valides krediidi koguse (vaikimisi €1000)
- Kanda kontole raha
- Kontole ei saa kanda negatiivset summat
- Võtta kontolt raha
- Kontolt ei saa võtta negatiivset summat
- Kontolt ei saa võtta rohkem raha kui konto jääk + krediit
Kodus¶
Ülesanne 16:
Uuri alljärgnevat lähtekoodi. Püüa aru saada mis toimub.
class ObjectWithWeight:
def __init__(self, weight):
self.weight = weight
class ObjectWithNameAndWeight(ObjectWithWeight):
def __init__(self, name, weight):
ObjectWithWeight.__init__(self, weight)
self.name = name
def __repr__(self):
return '{}({}, {})'.format(type(self).__name__, self.name, self.weight)
class Fruit(ObjectWithNameAndWeight):
def take_a_bite(self, weight):
actual_weight = min(self.weight, weight)
self.weight -= actual_weight
return weight - actual_weight
class Basket(list, ObjectWithWeight):
@property
def weight(self):
return sum(o.weight for o in self)
def take_a_bite(self, weight):
shortage = weight
for o in self:
shortage = o.take_a_bite(shortage)
return shortage
class Animal(ObjectWithNameAndWeight):
def feed(self, food, meal_weight):
shortage = food.take_a_bite(meal_weight)
self.weight += meal_weight - shortage
if shortage > 0:
return 'still hungry'
return 'fed up'
a = Fruit('Apple', 200)
b = Fruit('Banana', 100)
fruits = Basket([a, b])
dog = Animal('Muki', 5000)
print(dog, fruits)
# --> Animal(Muki, 5000) [Fruit(Apple, 200), Fruit(Banana, 100)]
print(dog.feed(fruits, 150))
# --> fed up
print(dog, fruits)
# --> Animal(Muki, 5150) [Fruit(Apple, 50), Fruit(Banana, 100)]