1 2 3 4 5 |
|
Fold (også kalt reduce) er en operator som kombinerer en funksjon med en liste elementer. Dette kan brukes til å lage en verdi som "oppsummerer" lista. F.eks. vanlig summasjon i matematikk er en fold:
er (nesten) det samme som foldl (+) 0 [1..10]
i språk som Haskell, reduce(+, 1:10)
i Julia eller reduce(add, range(1, 10+1), 0)
i Python. Nullen i de to uttrykkene betegner start-leddet, dvs. en tom sum er alltid null. Det er likevel en liten forskjell: dette er egentlig en left fold, altså vi antar venstre-assosiativitet, så vi regner egentlig ut
Men siden addisjon er assosiativ, får vi samme svar. Dette er tanken bak funksjonaliteten til følgende kode
1 2 3 4 |
|
add
-funksjonen kan også importeres fra operator
-biblioteket som følger med Python. Her kan det være greit å poengtere at dette kan gjøres med vanlige for-løkker:
men det ville jo ikke vært like gøy ...
1 2 |
|
Her kan vi også importere mul
fra operator
istedenfor å lage denne selv. Python har to andre innebygde funksjoner som er basert på fold-mønsteret. Dette er all
og any
, som har tilsvarende implementasjon.
1 2 |
|
1 2 |
|
Med matematisk terminologi har vi en binær funksjon og en (endelig) ordnet liste (samt en mulig startverdi ). En venstrefold blir da
En høyrefold blir tilsvarende
filter
er en funksjon som filtrerer ut elementer ut ifra ett sannhets-kriterie. Den tar inn en unær boolsk funksjon og en liste.
Igjen, dette kan også skrives med vanlige for-løkker og if-setninger
Men fordi vi bare bruker oddetall i løkka, kan det være greit å filtrere bort partallene fra lista, istedenfor å sjekke dette i løkka.
Det var alt for denne gang. Nå blir det nok 4 måneder til neste blogginnlegg.
28.09.18