Du er ikke logget inn. Så lenge du ikke er logget inn går du glipp av muligheten for å holde styr på din egen progresjon.

Logg inn

Valgte tags:

Filtrering:

Skriv ut:

Funksjoner 2: Lambda-uttrykk

I IN1140 er det hovedsakelig som input til defaultdict at vi bruker lambda-uttrykk, men i disse oppgavene kan du lære å bruke dem litt mer.

Oppgave 1

Skriv en funksjon som tar inn en annen funksjon og ei liste. Kall den "alle". Funksjonen du skriver skal returnere ei ny liste der hvert element er resultatet av å kalle funksjonen som blir sendt inn som argument på hvert element i lista. For eksempel kan vi ha ei liste lista = [1,2,3], og en funksjon pluss1 som legger til 1 til et tall (den tar bare inn ett tall om gangen). alle(pluss1,liste) gir oss da lista [2,3,4]. Det er altså funksjonen alle som skal sørge for at den anonyme funksjonen brukes på hvert element.

Så skal du kalle på funksjonen din med tre anonyme funksjoner (se under) ved å bruke lambda-uttrykk når du kaller på den.

Lista du skal bruke er:

liste = [4,6,8,10,12,14,16]

Skriv ut alle resultatene til terminalen.

a) Bruk en anonym funksjon som ganger et tall med 8
b) Bruk en anonym funksjon som opphøyer et tall i andre
c) Bruk en anonym funksjon som gjør om tallet til en streng
d) Bruk en anonym funksjon som repeterer sifrene i tallet (f.eks: 42 -> 4242)

Oppgave 2

Lag en ny funksjon som igjen skal ta inn en annen funksjon og ei liste. La funksjonen hete "noen". Denne nye funksjonen skal også lage ei ny liste, men denne gangen skal den anonyme funksjonen returnere en boolsk verdi som bestemmer om elementet skal med i den nye lista eller ikke. Funksjonen noen returnerer altså en delmengde av den opprinnelige lista, basert på den anonyme funksjonen.

Bruk denne lista:

liste2 = ['datamaskin', 'kalkulator', 'telefaks', 'telefon', 'fonologi', 'logisk', 'logo', 'telehiv', 'brunost']

Skriv ut alle resultatene til terminalen.

a) Bruk en anonym funksjon som returnerer True hvis ordet inneholder "fon".
b) Bruk en anonym funksjon som returnerer True hvis ordet ikke inneholder "log".
c) Bruk en anonym funksjon som returnerer True hvis den første bokstaven i ordet er "t".
d) Bruk en anonym funksjon som returnerer True hvis ordet er lengre enn 7 bokstaver.

Vis løsningsforslag

Løsningsforslag:

Oppgave 1

def alle(funksjon, liste):
    ny = []
    for e in liste:
        ny.append(funksjon(e))
    return ny
print(alle(lambda x: x * 8,liste))
print(alle(lambda x: x ** 2,liste))
print(alle(lambda x: str(x),liste))
print(alle(lambda x: str(x) + str(x),liste))

Disse oppgavene er ikke nødvendigvis den mest effektive måten å gjøre dette på. Et godt eksempel er oppgaven der vi kaller på str-funksjonen inne i den anonyme funksjonen. Siden str er en funksjon i seg selv (samme med int, list,dict, osv.), så kan vi sende den som den er:

print(alle(str,liste))

Det er det vi ofte gjør når vi bruker defaultdict.

Utskrift:

[32, 48, 64, 80, 96, 112, 128]
[16, 36, 64, 100, 144, 196, 256]
['4', '6', '8', '10', '12', '14', '16']
['44', '66', '88', '1010', '1212', '1414', '1616']

Oppgave 2

def noen(funksjon, liste):
    ny = []
    for e in liste:
        if funksjon(e):
            ny.append(e)
    return ny

Funksjonskall:

print(noen(lambda x: "fon" in x,liste2))
print(noen(lambda x: "log" not in x,liste2))
print(noen(lambda x: x[0] == "t",liste2))
print(noen(lambda x: len(x) > 7,liste2))

Hvis du hadde True if først i de anonyme funksjonene her så gir det det samme resultatet, men det er ikke nødvendig, siden de boolske uttrykkene alene gir oss True/False.

Utskrift:

['telefon', 'fonologi']
['datamaskin', 'kalkulator', 'telefaks', 'telefon', 'telehiv', 'brunost']
['telefaks', 'telefon', 'telehiv']
['datamaskin', 'kalkulator', 'telefaks', 'fonologi']

Det dere egentlig har laget her er en mapping-funksjon (alle) og en filtering-funksjon (noen). Mapping-funksjonen kjører samme operasjon i en mengde, og filter "filtrerer ut" elementene vi vil ha/ikke ha. Disse funksjonene er i seg selv ikke i IN1140-pensum, men dere kommer til å møte på dem senere, og de er enkle nok å øve på :D Lykke til videre med oppgaveløsing!