Laboration 5 - Funktioner av högre ordningen
Syftet med denna laboration är att ni ska lära er abstrahera problem till en sådan nivå att ni kan återanvända funktioner och kodstycken till snarlika uppgifter. På så vis kommer ni spendera mindre tid till att kopiera och klistra in och desto mer tid till att faktiskt programmera, det kommer även resultera i en mindre kodbas vilket alltid är bra ifall ni måste underhålla den kod ni skrivit.
Inlämningsuppgifter
Uppgift 5a - Tillbaka till Laboration 1
Det är dags att reflektera över vad ni har lärt er under kursens gång och se ifall det finns utrymme att förbättra era tidigare lösningar. I laboration 1 skrev ni två olika funktioner för att få summan av ett intervall och en annan funktion för att få produkten av ett intervall. Ni skrev även en funktion för att hitta det minsta talet som är delbart med samtliga tal från 1 till och med 13.
Er uppgift är att skriva om uppgift 1a och 1b så att ni kan lösa båda problemen med hjälp av en gemensam funktion och ett lambdauttryck per delproblem. Lambdauttrycket skall alltså skickas med som en parameter till funktionen
Uppgift 5b - Företagsdatabasen
En databas över personer som arbetar på ett företag definieras som en lista med tabeller. Skriv en funktion som söker i databasen. Första argumentet till funktionen är databasen som ska genomsökas, andra argumentet anger vilket fält matchningen ska ske emot och tredje argumentet anger vilket värde det fältet ska ha. Returvärdet ska vara en lista med de poster i databasen som matchar sökningen.
Körexempel:
>>> db = [
{'name': 'Jakob', 'position': 'assistant'},
{'name': 'Åke', 'position': 'assistant'},
{'name': 'Ola', 'position': 'examiner'},
{'name': 'Henrik', 'position': 'assistant'}
]
>>> dbsearch(db, 'position', 'examiner')
[{'position': 'examiner', 'name': 'Ola'}]
Uppgift 5c - Needles and haystacks
Skriv en funktion som tar reda på om en viss lista innehåller ett visst element. Du får inte använda dig av Pythons in-operator! (nyckelordet in används i flera sammanhang än som en operator, det är ok att ha med nyckelordet för att skapa en for-loop, men du får inte använda det för att kontrollera om ett viss element finns i listan).
Körexempel:
>>> haystack = 'Can you find the needle in this haystack?'.split()
>>> contains('find', haystack)
True
>>> contains('needle', haystack)
True
>>> contains('haystack', haystack)
False
Uppgift 5d - Kommandoskal
Den här uppgiften går ut på att konstruera ett simpelt kommando-system där användaren presenteras med en kommandoprompt och kan skriva in kommandon som sedan tolkas och anropar lämpliga funktioner. Systemet ska vara ganska likt en terminal, fast begränsat. Notera att även detta är en interpretator likt uppgift 4b och även om uppgifterna till en början förefaller helt olika varandra kommer ni snart märka att skillnaderna är väldigt små. Observera att detta kan och skall utföras helt med hjälp av Pythons standardbibliotek, inte med hjälp av anrop till terminalen.
Följande kommandon ska finnas tillgängliga:
pwd | Skriv ut nuvarande arbestkatalog. |
---|---|
cd | Byt nuvarande arbetskatalog. |
ls | Lista innehållet i nuvarande arbetskatalog |
cat | Skriv ut innehållet i en fil |
Körexempel:
command> ls
core.py
interpretor.py
command> cd ..
command> pwd
/home/pyuser/code/python/
command> ls
command_system/
README
web-project/
command> cat README
These are my Python projects.
command_system - A simple interpreter based on a callback system.
web-project - A site where I can display my projects.
command> cd web-project
command> ls
index.py
command>
Uppgift 5e - generate_list
Skriv en listgenererande funktion, generate_list. Funktionen ska ta en funktion som första argument och ett heltal som andra argument. Funktionen som angetts som första argument ska ta ett siffervärde som enda argument och skall anropas så många gånger som heltalet anger, med ett ökande siffervärde varje gång. Resultatet av funktionen ska läggas i en lista som slutligen returneras från generate_list.
Körexempel:
>>> def mirror(x): return x
>>> generate_list(mirror, 4)
[1, 2, 3, 4]
>>> def stars(n): return '*' * n
>>> generate_list(stars, 5)
['*', '**', '***', '****', '*****']
Uppgift 5f - partial
Skriv en funktion partial som tar en annan funktion och ett värde som indata. Partial ska returnera en ny funktion som gör samma sak som den angivna funktionen men där första argumentet till den angivna funktionen är bundet till det värde som angavs som andra argument till partial.
Körexempel:
>>> def add(n, m): return n + m
...
>>> add_five = partial(add, 5)
>>> add_five(3)
8
>>> add_five(16)
21
Uppgift 5g - compose
Skriv en funktion compose som tar två funktioner som argument, vi kallar dem F_a och F_b, och returnerar en funktion, F_res, som innebär att utdata från den andra funktionen blir indata till den första, dvs F_res(x) = F_a(F_b(x)).
Körexempel:
>>> def multiply_five(n):
... return n * 5
...
>>> def add_ten(x):
... return x + 10
...
>>> composition = compose(multiply_five, add_ten)
>>> composition(3)
65
>>> another_composition = compose(add_ten, multiply_five)
>>> another_composition(3)
25
Uppgift 5h - Filter the mapped result
Skriv en funktion make_filter_map som tar en filter-funktion och en map-funktion som argument. Funktionen ska returnera en funktion som tar en lista som argument och applicerar map-funktionen på varje element i listan som filter-funktionen är sann för. make_filter_map ska använda funktionerna partial och compose från tidigare uppgifter för att sätta ihop funktionerna map och filter med indatafunktionerna till det önskade resultatet.
Körexempel:
>>> process = make_filter_map(lambda x: x % 2 == 1, lambda x: x * x)
>>> process(range(10))
[1, 9, 25, 49, 81]
Krav
Nedan följer de krav som finns på hur ni löser denna laboration som är utöver det som framgår i själva instruktionen:- Alla lösningar skall ha huvudprogram som demonstrerar funktionaliteten hos varje del av laborationen
Python
Emacs
Laborationer och material
Sidansvarig: Pontus Haglund
Senast uppdaterad: 2023-09-25