Din egen chattbot - Marvin - steg 3
Programmering och problemlösning i Python. Jobba vidare med Marvin och implementera ny funktionalitet som använder listor.
#Förkunskaper
Du kan grunderna i Python och stränghantering, funktioner och du har byggt andra delen av Marvin.
#Introduktion
Du skall bygga en ryggsäck till Marvin med hjälp av listor.
Du skall kommunicera med Marvin via text och inte via ett menyval.
Se hur det kan se ut när uppgiften är klar:
#Krav
- Kopiera din Marvin från föregående kursmoment och utgå från den koden.
# Flytta till kurskatalogen
cd me
cp -ri kmom03/marvin2/* kmom04/marvin3/
cd kmom04/marvin3
Skapa en ny fil
inventory.py
där du lägger alla nya funktioner för inventory kommandona. Importera inventory.py i main.py. Skapa en lista i main.py som ska fungera som en ryggsäck.Lär Marvin att hantera listor. Skapa funktionen
pick
som tar emot tre argument, den första skall vara ryggsäcken, den andra skall vara saken man skall plocka upp och den tredje skall vara en optionell parameter som säger vilken position (index) saken skall lägga sig i (som en string). Funktionen ska lägga till saken i listan, om position skickas med ska saken tryckas in på den platsen (du ska inte ersätta det som redan ligger på den platsen, de sakerna ska flyttas ett index åt höger). Om position inte skickas med ska saken läggas till sist i ryggsäcken. Funktionen skall returnera den uppdaterade ryggsäcken.I
main.py
skall du lägga till stöd för kommandot “inv pick” enligt tabellen nedan. Om allt gick bra skall du skriva ut ett passande meddelande som innehåller vad som lades till i ryggsäcken och på vilken position om ett index är givet. Meddelandet skall skivas ut i funktionen och inte main programmet.- Tags:
pick
- Tags:
Skapa funktionen
inventory
som tar emot ett argument, ryggsäcken. Funktionen skall inte returnera någonting. Den skall skriva ut ett meddelande som innehåller hur antalet saker som befinner sig i ryggsäcken och alla saker som ligger där inne. Imain.py
lägger du till stöd för kommandot inv som exekverar funktionen.- Tags:
inv
- Tags:
Skapa funktionen
drop
som skall kasta bort en sak från ryggsäcken. Den skall ta emot två argument, första är ryggsäcken och den andra är saken som skall slängas. Funktionen skall returnera den uppdaterade ryggsäcken. Imain.py
skall du lägga till stöd för kommandot “inv drop” enligt tabellen nedan. Om allt gick bra skall du skriva ut ett passande meddelande som innehåller saken som kastades. Meddelandet skall skivas ut i funktionen och inte main programmet.- Tags:
drop
- Tags:
Skapa funktionen
swap
som skall ta emot tre argument, den första är ryggsäcken, den andra och tredje är själva sakerna som skall byta plats. Funktionen skall returnera den uppdaterade ryggsäcken. Imain.py
skall du lägga till stöd för kommandot “inv swap” enligt tabellen nedan. Om allt gick bra skall du skriva ut ett passande meddelande som innehåller sakerna som bytte plats. Meddelandet skall skivas ut i funktionen och inte main programmet.- Tags:
swap
- Tags:
Felhantering. Lägg till felhantering för kommandona “inv drop”, “inv swap” och “inv pick” som ändrar utskriften. Om en sak man vill kasta eller byta plats på inte finns i ryggsäcken skall du skriva ett passande felmeddelande som innehåller ordet “Error” och saken som inte existerar i ryggsäcken. Tips Använd dig av
try-except
.Om man anger ett för högt index i pick kommandot skall den inte plocka upp något. Du skall istället skriva ut ett passande meddelande som innehåller ordet “Error” och den givna positionen.
När ett av dessa fel uppstår skall funktionerna returnera den originella ryggsäcken.
- Tags:
error
- Tags:
Följande kommandon skall fungera. Notera att Marvin ska kunna plocka upp vad som helst. Nedan visas flower
, book
och 0
enbart som exempel, bag
motsvarar Marvins ryggsäck.
Kommando | Vad händer | Kallar på | Listans innehåll efter |
---|---|---|---|
inv | Marvin skall skriva ut hur många saker om finns i listan samt skriva ut dem | inventory(bag) |
[] |
inv pick flower | Plocka upp en “flower” och lägg den på slutet av listan | pick(bag, "flower") |
[“flower”] |
inv pick book 0 | Plocka upp en “book” och på index “0” | pick(bag, "book", 0) |
[“book”, “flower”] |
inv swap flower book | Byter plats på “flower” och “book” | swap(bag, "flower", "book") |
[“flower”, “book”] |
inv drop flower | Kasta bort “flower” | drop(bag, "flower") |
[“book”] |
- Testa, validera och publicera din kod enligt följande.
# Flytta till kurskatalogen
dbwebb test marvin3
dbwebb validate marvin3
dbwebb publish marvin3
Rätta eventuella fel som dyker upp och publicera igen. När det ser grönt ut så är du klar.
#Extrauppgift
Utöka menyval inv med stöd för en sekvens. Utöver att fungera som tidigare ska det också gå att skriva
inv <start> <stop>
, där<start>
och<stop>
är heltal. Ändrainventory(bag)
så du kan skicka med start och stop,inventory(bag, start, stop)
. I funktionen använd dig av slice på din lista för att hämta ut alla element från start till stop. Om man inte skickar med start och stop skainv
fungera som vanligt.# med inventory ["ko", "lo", "apa"] input: "inv 1 3" output: "lo, apa" input: "inv -1 3" output: "apa"
- Tags:
inv
,range
- Tags:
Utöka menyval pick med stöd för en sekvens. Utöver att fungera som tidigare ska det också gå att skriva
inv pick <sak>,<sak>,<sak> <position>
, där sekvensen med saker är ord med komma i mellan och<position>
är heltal. Ändrapick(bag, what, where)
så du kan kan ta emot en sträng med flera saker. Precis som med vanligapick
så skaposition
vara optionellt. Om man inte skickar med en position ska alla saker läggas till sist i ryggsäcken. Om man skickar med position ska de läggas in på det index, utan att ta bort sakerna som redan finns där.pick
ska fortfarande funka som vanlig om man inte skicka en en sträng med kommatecken i.# med inventory ["ko", "lo", "apa"] input: "inv pick mus,tjur" returnerar: ["ko", "lo", "apa", "mus", "tjur"] input: "inv pick mus,tjur 1" returnerar: ["ko", "mus", "tjur", "lo", "apa"]
- Tags:
pick
- Tags:
#Tips från coachen
Felsöka med debuggern.
Validera ofta. Så slipper du en massa valideringsfel i slutet av övningen.
Lycka till och hojta till i forumet om du behöver hjälp!
#Revision history
- 2022-09-09: (B, aar) La till nytt extra krav för pick.
- 2020-03-30: (A, moc) Ny version för att introducerar automaträttning.