Naloge - funkcije funkcij
Lambde
Napišite funkcijo najvecji_seznam(seznami)
, ki sprejme seznam seznamov in vrne tistega z največjo vsoto elementov. Nalogo rešite z uporabo funkcije max
s primernim key
argumentom (lambda funkcijo).
>>> najvecji_seznam([[2, 6], [9], [1, 3, 6, 7], [1, 1, 1, 1, 1]])
[1, 3, 6, 7]
Rešitev
def najvecji_seznam(s):
return max(s, key=lambda x: sum(x))
Spremenljivki medalje
priredite pravo vrednost (lambda funkcijo), da jo bomo lahko uporabljali kot kriterij za urejanje držav glede na število prejetih medalj na tekmovanju. Urejali bomo sezname terk, ki vsebujejo število zlatih, srebrnih in bronastih medalj. Terke želimo urediti primarno glede na skupno število medalj, enake pa naprej glede na število zlatih, srebrnih in bronastih.
>>> sorted([(1,0,2), (2,0,1), (1,2,0), (0,4,0)], key=medalje)
[(0,4,0), (2,0,1), (1,2,0), (1,0,2)]
Rešitev
medalje = lambda x: (-sum(x), -x[0], -x[1], -x[2])
Sprejemanje funkcij
Napišite funkcijo obdrzi(seznam, pogoj)
, ki sprejme seznam in funkcijo. Vrne naj nov seznam samo tistih elementov, za katere prejeta funkcija vrne True
.
>>> obdrzi([1, 2, 3, 4, 5], lambda x: x % 2 == 0)
[2, 4]
Rešitev
def obdrzi(seznam, pogoj):
rez = []
for x in seznam:
if pogoj(x):
rez.append(x)
return rez
ali krajše
def obdrzi(seznam, pogoj):
return [x for x in seznam if pogoj(x)]
Podana je funkcija zdruzi(sez, f)
, ki postopoma združi elemente seznama sez
z uporabo podane funkcije f
v končen rezultat. Funkcija f
sprejme dva argumenta: trenutni združen rezultat in nov element.
def zdruzi(sez, f):
rez = None
for x in sez:
rez = f(rez, x)
return rez
Napišite funkcijo oddaljena
, ki jo bomo lahko uporabili s funkcijo zdruzi
za iskanje najbolj oddaljene točke od izhodišča koordinatnega sistema.
>>> zdruzi([(12,1), (0,-11), (7,10), (8,8)], oddaljena)
(7,10)
Rešitev
def oddaljena(rez, x):
if rez is None: return x
elif x[0]**2 + x[1]**2 > rez[0]**2 + rez[1]**2: return x
else: return rez
Napišite funkcijo razlicni
, ki jo bomo lahko uporabili s funkcijo zdruzi
za izločanje zaporednih enakih elementov v seznamu.
>>> zdruzi([1,2,2,2,3,1,1,3,3], razlicni)
[1,2,3,1,3]
Rešitev
def razlicni(rez, x):
if rez is None: return [x]
elif rez[-1] == x: return rez
else: return rez + [x]
Vračanje funkcij
V modulu math
imamo na voljo funkcijo log(x, base)
, ki izračuna logaritem števila x
z osnovo base
oz. naravni logaritem, če ta argument ni podan. Na voljo sta tudi pogosto uporabljeni log2
in log10
za logaritme z dvojiško in desetiško osnovo. Včasih pa bi nam prav prišel še kakšen tak specializiran logaritem. Napišite funkcijo logaritem(osnova)
, ki naj vrne funkcijo, ki bo računala logaritem s podano osnovo.
>>> l3 = logaritem(3)
>>> l3(81)
4
Napišite tudi funkcijo logaritmi(n)
, ki bo vrnila kar cel seznam funkcij, ki računajo logaritme z osnovami od 0
do n-1
. Prvi (logaritem z osnovo 0) bo povsem neuporaben, pa nič za to.
>>> l = logaritmi(10)
>>> l2, l3 = l[2], l[3]
>>> l2(1024)
10
>>> l3(9)
2
Rešitev
def logaritem(osnova):
def f(x):
return log(x, osnova)
return f
def logaritmi(n):
tab = []
for i in range(n):
tab.append(logaritem(i))
return tab
oz. krajše
def logaritem(osnova):
return lambda x: log(x, osnova)
def logaritmi(n):
return [logaritem(i) for i in range(n)]