Virus v eni vrstici
S to nalogo se vračamo za dva tedna nazaj. Napisati bo potrebno podobne funkcije, le da je zdaj finta v tem, da funkcije ne vsebujejo drugega kot en sam return. Če mora funkcija vrniti množico nečesa bo videti tako
def funkcija(...argumenti...):
return { ...nekaj pametnega... }
Spet vemo, kdo je bil kje. Na primer takole:
obiski = [("Ana", "kava"), ("Berta", "kava"), ("Cilka", "telovadba"),
("Dani", "zdravnik"), ("Ana", "zdravnik"), ("Cilka", "kava"),
("Ema", "telovadba")]
Toplo priporočam, da se čez takšne sezname odpravite z zanko oblike
for oseba, aktivnost in obiski:
Če boste delali kaj bolj zapletenega, ste si sami krivi za posledice.
Obvezne naloge
Napiši naslednje funkcije.
aktivnosti(obiski)vrne množico vseh aktivnosti. Za gornji primer vrne{"kava", "zdravnik", "telovadba"}.aktivnosti_osebe(oseba, obiski)vrne seznam vseh aktivnosti določene osebe v takšnem vrstnem redu, v kakršnem nastopajo v seznamu. Klicaktivnosti_osebe("Ana", obiski)vrne["kava", "zdravnik"]. Nekatere osebe lahko gredo tudi večkrat na isto aktivnost. V enem od testov Ana dvakrat pije kavo.kdo_tam(kje, obiski)vrne množico vseh oseb, ki so se udeležile določene aktivnosti. Klickdo_tam("kava", obiski)vrne{"Ana", "Berta", "Cilka"}.koliko_tam(kje, obiski)vrne število oseb, ki so bile na določenem kraju. Klickdo_tam("kava", obiski)vrne 3, ker so bile na kavi tri osebe. Izjemoma tu želim, naj funkcija ne kliče funkcij, ki ste si jih napisali prej. Pač pa sme klicati druge Pythonove funkcije, če jih potrebuje.
Dodatne naloge
Niso težke. Za razliko od zadnje obvezne naloge, funkcije tu smejo klicati ena drugo (in tudi funkcije iz obveznega dela). Pravzaprav je to celo zaželeno in priporočljivo.
preberi_aktivnosti(ime_datoteke)dobi datoteko oblikeAna kava Berta kava Cilka telovadba Ana zdravnikin tako naprej. Funkcija vrne seznam obiskov v gornji obliki. Predpostaviti smeš, da so vsa imena oseb in aktivnosti dolga eno besedo (se pravi: imeni osebe in aktivnosti sta ločeni z enim in edinim presledkom).
Datoteka ni priložena testom, temveč jo testi sproti sestavijo kar sami.
slovar_skupin(obiski)naj vrne slovar, katerega ključi so aktivnosti, pripadajoče vrednosti pa množice oseb, ki so se je udeležile. Za gornji primer funkcija vrne slovar{"kava": {"Ana", "Berta", "Cilka"}, "zdravnik": {"Dani", "Ana"}, "telovadba": {"Cilka", "Ema"}}.skupine(obiski)naj vrne isto kot istoimenska funkcija pred dvema tednoma: seznam množic vseh oseb, ki so se srečale na posameznih aktivnostih. V gornjem primeru vrne[{"Ana", "Berta", "Cilka"}, {"Dani", "Ana"}, {"Cilka", "Ema"}]. Vrstni red elementov v seznamu ni pomemben. Če se znajdeš, je funkcija lahko precej trivialna.okuzen(stvari)prejme seznam stvari, ki se jih nekdo dotakne ter vrneTrue, če je ta oseba potem okužena inFalse, če ni. Človek je okužen, če se dotakne kljuke, ne da bi se takoj zatem dotaknil mila. (Izjema je le, če je kljuka zadnja stvar, za katero vemo, da se je je dotaknil. V tem primeru bomo predpostavili, da si je šel nato umit roke, torej ni okužen.) Klicokuzen(["miza", "kljuka", "stol", "milo", "kljuka", "milo"]vrneTrue, ker se je za kljuko dotaknil stola. Klicokuzen(["miza", "kljuka", "milo", "milo", "kljuka", "milo"]vrneFalse, ker si je po vsakem dotikanju kljuke umil roke.
Malo bolj dodatna
Tole ni tako težko, je pa najbolj kul reč v vsej domači nalogi, tako da se splača pogledati.
Preberi si dokumentacijo funkcije reduce iz modula functools.
Potem ko to razumeš, smeš vedeti, tole. Recimo, da imamo s = [{1, 2, 3}, {1, 5}, {2, 6, 10}]. Če pokličemo reduce(set.union, s) dobimo unijo vseh množic iz s. Če ne veš, zakaj, ponovno preberi dokumentacijo reduce.
Napiši funkcijo okuzeni(skupine, kuzni), ki počne isto kot pred dvema tednoma. Prejme torej seznam skupin, kakršnega vrača prejšnja funkcija, in množico vseh, ki so okuženi z virusom. Vrniti mora množico vseh, ki so bili vsaj enkrat v stiku s kom, ki je bil okužen.
Klic okuzeni([{"Ana", "Berta", "Cilka"}, {"Dani", "Ana"}, {"Cilka", "Ema"}], {"Ema", "Dani"}) vrne {"Ana", "Cilka", "Dani", "Ema"}, saj Ema in Dani okužita Cilko in Dani.