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)]

Zadnja sprememba: torek, 28. september 2021, 14.58