Vaje
- Napiši funkcijo
min_leto(meritve), ki prejme meritve, kakršne vrne funkcijapreberi_meritve(s prejšnji vaj) ter vrne prvo polno leto obratovanja postaje. Če začne postaja obratovati 1. januarja 1953, vrne 1953. Če začne obratovati 3. februarja 1953, pa vrne 1953.
Rešitev
def min_leto(meritve):
najmanjse_leto = float("inf")
for leto, _, _ in meritve:
if leto < najmanjse_leto:
najmanjse_leto = leto
return najmanjse_leto
- Napiši funkcijo
mesecno_povprecje(leto, mesec, meritve), ki vrne povprečno mesečno temperaturo za podani mesec in leto. Če za ta mesec in leto ni meritev, naj vrneNone.
Rešitev
def mesecno_povprecje(leto, mesec, meritve):
temperature = []
for dan in range(1, 32):
datum = (leto, mesec, dan)
if datum in meritve:
temperature.append(meritve[datum])
if temperature:
return sum(temperature) / len(temperature)
else:
return None
- Napiši funkcijo
izpis_povprecij(meritve), ki prejme meritve in izpiše
1992/01: 7.42 *******
1992/02: 9.80 **********
1992/03: 12.82 *************
1992/04: 17.16 *****************
1992/05: 23.84 ************************
1992/06: 24.43 ************************
1992/07: 28.21 ****************************
1992/08: 31.73 ********************************
1992/09: 24.28 ************************
1992/10: 16.72 *****************
1992/11: 13.35 *************
1992/12: 8.72 *********
1993/01: 7.09 *******
1993/02: 10.79 ***********
1993/03: 12.79 *************
1993/04: 17.87 ******************
1993/05: 24.85 *************************
1993/06: 26.17 **************************
1993/07: 27.31 ***************************
1993/08: 30.06 ******************************
1993/09: 21.78 **********************
1993/10: 18.01 ******************
1993/11: 10.11 **********
1993/12: 9.40 *********
1994/01: 10.46 **********
1994/02: 8.65 *********
1994/03: 16.29 ****************
1994/04: 16.89 *****************
1994/05: 21.67 **********************
1994/06: 26.35 **************************
1994/07: 31.62 ********************************
1994/08: 30.73 *******************************
1994/09: 24.39 ************************
1994/10: 17.74 ******************
1994/11: 14.87 ***************
1994/12: 9.07 *********
... in tako naprej
za vsa leta, odkar deluje postaja. Številke so povprečne temperature za te mesece v tem letu. Zvezdic je toliko, kolikor je zaokrožena povprečna temperatura. (Funkcija round(x) zaokroži x na nabližje celo število. Če je x float, bo rezultat je še vedno float; če potrebujemo int, pišemo int(round(x)).)
Rešitev
def izpis_povprecij(meritve):
zacetno_leto = min_leto(meritve)
for leto in range(zacetno_leto, 2023):
for mesec in range(1, 13):
povprecje = mesecno_povprecje(leto, mesec, meritve)
if povprecje is not None:
zvezdice = "*" * round(povprecje)
print(f"{leto}/{mesec:02}: {povprecje:5.2f} {zvezdice}")
print()
- Napiši funkcijo
mesecna_povprecja(meritve), ki izračuna dolgoletne povprečne mesečne temperature. Konkretno, funkcija naj izračuna povprečje prek vseh temperatur, ki jih za leta delovanja postaje vrača prej napisana funkcijamesecno_povprecje.
Rešitev
def mesecna_povprecja(meritve):
povprecja = {}
najmanjse_leto = min_leto(meritve)
for mesec in range(1, 13):
povprecja_mesec = []
for leto in range(najmanjse_leto, 2023):
povprecje = mesecno_povprecje(leto, mesec, meritve)
if povprecje is not None:
povprecja_mesec.append(povprecje)
povprecja[mesec] = sum(povprecja_mesec) / len(povprecja_mesec)
return povprecja
- Napiši funkcijo
izpis_sprememb(meritve), ki ima podoben izpis kotizpis_povprecij, vendar doda "stolpec", iz katerega je razvidno, za koliko je izpisano povprečje večje ali manjše od dolgoletnega.
2022/01: 9.66 (+1.34) **********
2022/02: 12.22 (+2.00) ************
2022/03: 15.02 (+0.78) ***************
2022/04: 17.68 (-0.81) ******************
2022/05: 25.60 (+2.46) **************************
2022/06: 31.01 (+3.71) *******************************
2022/07: 33.74 (+3.99) **********************************
2022/08: 31.93 (+2.14) ********************************
2022/09: 24.17 (+0.37) ************************
2022/10: 23.16 (+4.05) ***********************
2022/11: 15.03 (+1.36) ***************
2022/12: 9.45 (+0.25) *********
Kako dodati tisti + ali -, najdeš v opisu minijezika za oblikovanje nizov.
Rešitev
def izpis_sprememb(meritve):
zacetno_leto = min_leto(meritve)
poprecja_meseci = mesecna_povprecja(meritve)
for leto in range(zacetno_leto, 2023):
for mesec in range(1, 13):
povprecje = mesecno_povprecje(leto, mesec, meritve)
if povprecje is not None:
zvezdice = "*" * round(povprecje)
odklon = povprecje - poprecja_meseci[mesec]
print(f"{leto}/{mesec:02}: {povprecje:5.2f} ({odklon:+.2f}) {zvezdice}")
print()
- Napiši funkcijo
zadnjih_10(ime_datoteke, meritve), ki v datoteko s podanim imenom zapiše povprečne mesečne (vrstice) temperature za zadnjih deset let (stolpci). Datoteka mora biti takšne oblike:
,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022
1,8.72,8.32,10.68,9.96,8.32,6.38,10.20,7.85,10.70,8.09,9.66
2,6.99,8.36,12.13,10.29,11.23,10.90,7.24,13.85,13.25,11.87,12.22
3,18.71,11.02,17.19,15.00,14.18,17.53,11.32,16.90,14.46,14.83,15.02
4,17.21,18.73,19.80,18.51,19.20,23.14,21.72,18.37,21.01,16.46,17.68
5,23.24,20.74,22.25,23.26,22.49,,25.73,18.93,22.95,20.74,25.60
6,27.77,26.92,27.53,28.10,26.52,,28.09,31.03,25.71,29.59,31.01
7,30.68,32.12,27.45,32.14,30.98,30.28,30.73,30.91,29.49,30.80,33.74
8,32.14,31.06,26.83,30.65,29.71,32.21,32.19,31.01,30.19,29.95,31.93
9,25.43,24.33,23.50,24.22,27.22,21.54,26.93,8.49,25.99,26.61,24.17
10,19.26,18.85,20.39,18.66,17.92,19.71,21.52,20.59,18.90,18.75,23.16
11,14.74,13.94,15.79,14.29,13.39,13.58,14.62,14.90,14.61,14.01,15.03
12,8.13,11.25,9.61,10.46,11.65,8.92,9.54,11.38,10.08,9.32,9.45
Rešitev
def zadnjih_10(ime_datoteke, meritve):
datoteka = open(ime_datoteke, "w")
# pripravimo in zapisemo prvo vrstico z leti
leta = [""]
for leto in range(2012, 2023):
leta.append(str(leto))
datoteka.write(",".join(leta) + "\n")
# pripravimo in zapisemo podatke
for mesec in range(1, 13):
povprecja = [str(mesec)]
for leto in range(2012, 2023):
povprecja.append(f"{mesecno_povprecje(leto, mesec, meritve):.2f}")
datoteka.write(",".join(povprecja) + "\n")
datoteka.close()
Datoteko lahko uvoziš v Excel in narišeš kakšen graf. (Ne vem, kaj je s septembrom 2019. Lahko odkriješ in poročaš.)