Göm meny

Uppgifter i Python 2 - Loopar och villkor del 1


Fler övningar kommer läggas till HT 2017.

Till varje uppgift kommer du behöva skriva minst en funktion. Skriv koden till alla funktioner i en och samma fil. De olika uppgifterna är värda olika antal poäng. För att inlämningen ska vara godkänd, måste du ha samlat ihop 100 poäng.

Rättningsskriptet

För att underlätta för dig när du gör pythonuppgifterna finns det ett rättningsskript som du kan köra till varje uppgift. Rättningsskriptet testar koden du skrivit och berättar för dig vilka uppgifter du gjort fel på och räknar ut din poäng. Du får också reda på vilka uppgifter som saknas.

Rättningsskriptet ligger i ~729G74/kursmaterial/python/python1 för Tema 1, ~729G74/kursmaterial/python2 för Tema 2, och i ~729G74/kursmaterial/python/python3 för Tema 3

Du behöver inte kopiera filerna som ligger där utan anropar t.ex. pytest1.sh (för Pythonuppgift 1) som testar Pythonuppgift 1 enligt nedan när du står i samma katalog som din uppgiftskod.

För tema 1:

$ ~729G74/kursmaterial/python/python1/pytest1.sh pythonuppg.py

För tema 2:

$ ~729G74/kursmaterial/python/python2/pytest2.sh pythonuppg.py

För tema 1:

$ ~729G74/kursmaterial/python/python3/pytest3.sh pythonuppg.py

I anropet ersätter du såklart pythonuppg.py med namnet på din egen fil.

Resultat från rättningsskriptet

Rättningsskriptet kommer berätta för dig vilka uppgifter som är godkända, vilka som inte är godkända och vilka som inte hittades. Rättningsskriptet berättar också hur många poäng du fått.

När du kör rättningsskriptet kommer du få en utskrift i terminalen som liknar den nedan.

OBS! Rättningsskriptet undersöker bara hur många och vilka uppgifter du löst och vilka du inte löst. Du kommer själv behöva testa lägga till t.ex. spårutskrifter för att testa koden medan du skriver den.

#### POÄNG (100 poäng behövs för GODKÄND UPPG) ####

UPPG 1.1: 5 poäng.
UPPG 1.2: 5 poäng.
UPPG 1.3: 5 poäng.
UPPG 1.4: 5 poäng.
UPPG 1.5: 10 poäng.
UPPG 1.7: 10 poäng.
UPPG 1.8: 10 poäng.
UPPG 1.9: 10 poäng.
UPPG 1.10b: 5 poäng.
UPPG 1.11: 15 poäng.
UPPG 1.12: 15 poäng.


#### SAKNADE UPPGIFTER ####

Kontrollera stavning på din funktioner. Stora och små
bokstäver spelar roll.

UPPG 1.10a saknar funktion: 'first_in_list'
UPPG 1.10c saknar funktion: 'last_in_list'


#### FEL vid TEST ####

Felsök genom att ha testanrop längst ner i din kodfil och
skriv ut resultaten. Kontrollera också så att du har mellanrum
på rätt ställe och att stora/små bokstäver stämmer överrens.

UPPG 1.6: Fel påträffades.

#### ANTAL POÄNG: 95
#### Du är INTE godkänd på Pythonuppgift 1.
#### 5 poäng saknas.

Skicka in kod

Om uppgiften är godkänd så hittar du även ett stycke med en specialkod. Den innehåller information om din uppgift, hur många poäng din kod fick, samt en ett antal rader med textdata som du kan kopiera och klistra in i ett epost till 729g74@ida.liu.se för att lämna in dina uppgifter. Skriv Pythonuppgift X (där X är numret på aktuella tema), ditt LiU-ID, samt din läres handledarkod.

Så här kan koden se ut som du ska skicka in. Kopiera allt mellan de streckade raderna, inklusive de streckade raderna och skicka in det till din handledare (OBS! Nedanstående kod är ogiltig).

-------------------------------- TEXT START --------------------------------
dXBwZzEvaW5mby50eHRVVAkAAz99zVc/fc1XdXgLAAEE9QEAAAQUAAAABcHLEcIgEADQO1VsA3FY
zVd1eAsAAQT1AQAABBQAAABQSwMEFAAAAAgAiIElSZnJPKxkAAAAcgAAABgAHABqb2RmbzAxLXB5
AjhLN2E/iophTDike9+T7dQCwWNePC0+AeaCoWBy89Bfgdcutnt01j4K/FR+qxQY1xzjgbdxud6+
AGpvZGZvMDEtcHl1cHBnMS9taW5pZmllZC5weVVUCQADP33NVz99zVd1eAsAAQT1AQAABBQAAACN
UEsDBAoAAAAAAIiBJUkAAAAAAAAAAAAAAAAQABwAam9kZm8wMS1weXVwcGcxL1VUCQADP33NVz99
kstugzAQRfd8hUU3pCGhRMomUlb9jLayDIzBjbEte4iavy/YPEJaqV0gM3fO3Bk/RGu0RWKZqnQb
VcCJBeysolxcIdmcojEm8SDEnjBWKFwAHyYhv/EAqyrqsJdrt7Jo4DPexo6p4NM5oNgAvTLrsSuT
HZyPM+/j5+OKZbZO2Gi+NJ+VuXZSVsVSKCgssMtqKssqkr+rYTmEwVxXoGUlJn6CPPXL4a4m6Lug
hxIjBdJCSJmwVncKU9W1BViqOTWgjYS78kBkj4Q3KrUqGYLqv/kMXZ66+/Yu37rQlgvrkArVb82N
47rHOd3by0eYEXrz6k86D7Rk/3De5ZO1hBJpeEY/6aDvy0aLEqa0L6xBgR32avQFWq2oYi0kxgIX
X+BS13H/E656EM/rVhPZ33xgH/KzQUQG5/Nvxxs8xl7LExr46Im89g8GoSLFjZhbK5TgAixJGkTj
TllWC2y6Yl/qNpOCo+Y8W7BN9A1QSwMEFAAAAAgAiIElSclUPoaqAAAAqAEAAB8AHABqb2RmbzAx
zZoKdEnH7GDmmeo9xVhT5JpzNVmFaOPAK6G5P1BLAwQUAAAACACIgSVJoN99PmsBAABgAwAAGwAc
LXB5dXBwZzEvcHl1cHBnMXRlc3QubG9nVVQJAAM/fc1XP33NV3V4CwABBPUBAAAEFAAAAOPiUgYC
hQD/wy1+7goahgYGCgX5h5fkpSskpWYc3lZWrJB2eFuRgru/izdQhYtCaECAu6YCSA8XF4itYKhn
aKVgCtWkBxMzwiJmjEXMBIuYqZWCoQG6oBk2QXNsghbYBC2xCRoaJGKx3tAgCatoMjZRoN8NMUWN
CgAAAAAAiIElSQAAAAAAAAAAAAAAABAAGAAAAAAAAAAQAO1BAAAAAGpvZGZvMDEtcHl1cHBnMS9V
VAUAAz99zVd1eAsAAQT1AQAABBQAAABQSwECHgMUAAAACACIgSVJmck8rGQAAAByAAAAGAAYAAAA
AAAAUEsBAh4DFAAAAAgAiIElSaDffT5rAQAAYAMAABsAGAAAAAAAAQAAAKSBAAEAAGpvZGZvMDEt
AAABAAAApIFKAAAAam9kZm8wMS1weXVwcGcxL2luZm8udHh0VVQFAAM/fc1XdXgLAAEE9QEAAAQU
UEQhIezoF+LoAw1noLShKUTYpVTh8BKk8C04vFQhoLIkIz+vtKAgPTOtRMFQkUtBgQsAUEsBAh4D
JUnJVD6GqgAAAKgBAAAfABgAAAAAAAEAAACkgcACAABqb2RmbzAxLXB5dXBwZzEvcHl1cHBnMXRl
cHl1cHBnMS9taW5pZmllZC5weVVUBQADP33NV3V4CwABBPUBAAAEFAAAAFBLAQIeAxQAAAAIAIiB
c3QubG9nVVQFAAM/fc1XdXgLAAEE9QEAAAQUAAAAUEsFBgAAAAAEAAQAegEAAMMDAAAAAA==
-------------------------------- TEXT SLUT  --------------------------------

Nyckelbegrepp för uppgiften

  • syntax och användning av while-loopen
  • jämförelser med !=, ==, <, >, <=, och >=
  • syntax och användning av if, elif, else
  • logiska operatorer för att kombinera jämförelser
  • listor: slå upp och ändra värde i lista med hjälp av index

Uppgifter

Nedan hittar du uppgifterna samt information om förberedelser inför uppgifterna. Hur mycket varje uppgift är värd hittar du inom parentes efter uppgiftsnummret.

Om ni stöter på några problem, hittar fel, eller har frågor kring dessa uppgifter, säg gärna till!

Förberedelser

Nedanstående kod kan du använda som en utgångspunkt när du ska skriva din egen kod.

Tecknet # i början av en rad gör att pythontolken struntar i just den raden. På så sätt kan du skriva egna kommentarer. Kommentera hellre för mycket än för lite!

# Pythonuppgifter 1
# liuid: abcde123
# personnummer: ÅÅMMDD-XXXX

# här skriver du dina funktionsdefinitioner
def hello_world():
    print("Hello World!")


# Nedanstående rad är instruerar python att bara köra det som står nedanför
# om denna fil körs direkt, t.ex. från en terminal. Om koden bara laddas, t.ex.
# när rättningsskriptet körs, så kommer koden under nedanstående if-sats inte
# att köras.
#
# Observera indenteringen för att eventuell test-kod ska höra till if-blocket.
if  __name__ == "__main__":
    
    # här kan du alltså testköra dina funktioner genom att anropa dem
    # läs mer om hur du kan testa din kod på
    # https://www.ida.liu.se/~729G74/kursmaterial/pythonfaq
    hello_world()

Prova att köra ovanstående kod som du skrivit in i en textil med filändelsen .py från terminalen:

$ python3 filnamn.py

Lycka till med uppgifterna!

Uppgift 2.1 (5p)

Skriv funktionen greeting(name) som tar emot en sträng med ett namn som värde. Funktionen returnerar sedan hälsningsfrasen "Hej " + name + "!" förrutom när namnet som skickats in börjar på (stora) bokstaven M. I dessa fall returneras "Hej " + name + ", visste du att M är min favoritbokstav!"

Anropet greeting("Pontus") ska alltså returnera strängen "Hej Pontus!" medan anropet greeting("Morgan") ska returnera strängen "Hej Morgan, visste du att M är min favoritbokstav!".

Uppgift 2.2 (5p)

Skriv funktionen is_this_a_long_list(values) som får en lista (values) som argument och returnerar True eller False beroende på hur lång listan är. Listor längre än 5 element anses vara långa.

Tips: Använd funktionen len() för att ta reda på längden på en lista (eller sträng för den delen)

Uppgift 2.3 (5p)

Skriv funktionen get_grade(score) som tar in en siffra (argumentet score) som antingen ett heltal eller ett flyttal) och returnerar en sträng med betyget som man får när man har score poäng. Betygsgränserna är följande:

  • Betyget "G" returneras om poängen är 50 eller högre.
  • Är poängen högre än 80 returneras betyget "VG".
  • Vid mindre än 50 poäng returneras "U".

Uppgift 2.4 (5p)

Skriv funktionen days_in_month(name_of_month) som tar in namnet på en månad (som sträng) och returnerar antalet dagar i den månaden (antag att det inte är skottår). Följande stavningar på månader ska användas: "januari", "februari", "mars", "april", "maj", "juni", "juli", "augusti", "september", "oktober", "november", "december".

Uppgift 2.5 (5p)

Skriv funktionen odd(value) som tar in ett heltal och returnerar True om heltalet value är udda, och returnerar False om heltalet value är jämt.

Tips!

Operatorn modulo som i Python skrivs som % ger resten vid division. Om man ska dela heltalet 6 med heltalet 5, så får 5 plats 1 gång och man får en rest på 1. Dvs man delar 6 % 5 ger 1 eftersom 6 = 5 * 1 + 1. 6 % 3 ger oss en rest på 0 eftersom 6 = 3 * 2 + 0.

Resten 0 innebär allstå att att täljaren är jämt delbar med nämnaren. Eftersom alla tal som är jämt delbara med 2 är jämna, kan man använda modulo-operatorn för att ta reda på om ett tal är jämt eller udda. Om resten är 0 är talet jämt!

Uppgift 2.6 (10p)

Skriv funktion get_integer_description(value) som tar in ett heltal och returnerar ett annat heltal beroende egenskaperna hos value.

  • om value är positivt och jämt returneras 2
  • om value är positivt och udda returneras 1
  • om value är 0 returneras 0
  • om value är negativt och udda returneras -1
  • om value är negativt och jämt returneras -2

Tips: Använd logiska operatorer för att kombinera fler än en jämförelse

Uppgift 2.7 (10p)

Skriv funktionen appraisal_factor(rare, good_condition) som returnerar ett flyttal. Båda argumenten rare och good_condition är sanningsvärden (dvs antingen True eller False).

Funktionen är tänkt att användas för att justera priset på antikviteter. Om ett föremål är sällsynt (om argumentet rare är True) läggs en bonus på 25% till priset. Om föremålet inte är sällsynt (om argumentet rare är False) dras 25% bort från priset.

Förrutom sällsyntheten behöver man även ta hänsyn till hur gott skick som föremålet är i. Är föremålet i gott skick (om argumentet good_condition är True) lägger man till 50% till priset. Är det i dåligt skick (om argumentet good_condition är False) drar man bort 50% från priset.

Funktionen appraisal_factor(rare, good_condition) ska returnera den faktor som orginalpriset ska multipliceras med för att kompensera för sällsynthet och skick.

Exempel: Ett sällsynt föremål i gott skick ska alltså ha en faktor på 1.75 (1 + 0.25 + 0.50). Ett sällsynt föremål som inte är i gott skick ska ha en faktor på 0.75 (1 + 0.25 - 0.50)

Uppgift 2.8 (5p)

Skriv funktionen create_ten_list() som ska returnera en lista som innehåller heltalen 0-10 i ordning, dvs listan [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]. Funktionen ska använda en loop för att skapa listan.

Tips 1

Skapa en tom lista med t.ex. new_list = [] som du sedan lägger till värden till.

Tips 2

Lägg till innehåll till en lista antingen med metoden .append() eller genom att använda operatorn +.

new_list1 = []
new_list2 = []
ord = "då"

new_list1.append("hej")
new_list1.append(ord)

new_list2 = new_list2 + ["hej"]
new_list2 = new_list2 + [ord]

Ovanstående kod kommer att resultera i att både new_list1 och new_list2 innehåller ["hej", "då"]. Exemplet visar också hur det ser ut när man lägger till ett hårdkodat värde till en lista och hur det ser ut när man lägger till ett värde från en variabel till en lista.

Uppgift 2.9 (5p)

Skriv funktionen create_zero_to_number_list(number) som ska skapa och returnera en lista som innehåller siffrorna från 0 till number. Argumentet number är ett heltal.

Anropet create_number_list(3) ska allstå returnera listan [0, 1, 2, 3].

Uppgift 2.10 (5p)

Skriv funktionen create_number_to_number_list(start_number, end_number) som ska skapa och returnera en lista som innehåller siffror från start_number till end_number. Både start_number och end_number är heltal. start_number kommer också alltid att vara lägre än end_number.

Anropet create_number_to_number_list(5, 9) ska alltså returnera listan [5, 6, 7, 8, 9]

Uppgift 2.11 (5p)

Skriv funktionen get_max(integer_list) som ska returnera det högsta heltalet i listan integer_list som är en lista av heltal. Funktionen ska inte använda den inbyggda funktionen max() utan en loop som itererar över input-listan.

Anropet get_max([9, 3, 6, 3, 100, 2, 30]) ska alltså returnera 100.

Tips! Referera till föreläsningen där vi tog upp while-loopen för första gången.

Uppgift 2.12 (5p)

Skriv funktionen get_min(integer_list) som ska returnera det högsta heltalet i listan integer_list som är en lista av heltal. Funktionen ska inte använda den inbyggda funktionen min() utan en loop som itererar över input-listan.

Anropet get_min([9, 3, 6, 3, 100, 2, 30] ska alltså returnera 2.

Uppgift 2.13 (5p)

Skriv funktionen word_in_list(words, word) som tar in en lista av strängar (argumentet words) samt en enskild sträng (argumentet word). Funktionen ska returnera True om strängen word finns i listan words. Använd inte den inbyggda operatorn in.

Uppgift 2.14 (5p)

Skriv funktionen count_integers(value_list) som returnerar antalet heltal i en lista (argumentet value_list).

Använd funktionen type() som returnerar vilken datatypen hos ett värde. Till exempel type(4) returnerar int, så jämförelsen type(4) == int kommer att vara True (OBS! int inte är omgiven av några citat-tecken).

Tips

Du kan tänka att funktionen ska göra något i den här stilen:

  • Gå igenom listan med värden ett i taget.
  • Om det aktuella värdet är ett heltal, lägg till 1 till variabeln som lagrar antalet heltal du stött på.

Uppgift 2.15 (10p)

Skriv funktionen average(values) som returnerar genomsnittet av alla värden i en lista av flyttal. Anropet average([10.0, 20.0, 6.3]) bör alltså returnera 12.1. Funktionen summera ihop värdena med en loop och sedan dela summan med antalet värden i listan values.

Det finns smidigare sätt att göra detta, men syftet med uppgiften är att öva på loopar.

Uppgift 2.16 (5p)

Skriv en funktion replace_periods_with_newlines(string_value) som använder en while-loop för att gå igenom en sträng och byta ut alla .-tecken (punkter) mot radbrytningar. Resulterande sträng returneras av funktionen.

Använd ej den inbyggda funktionen str.replace(), utan använd en loop som stegar igenom strängen.

Tips!

I Python kan man inte byta ut enskilda tecken i en sträng. Använd därför en loop för att gå igenom strängen och “spara undan” alla tecken som inte är en . i en ny sträng. När du stöter på en punkt, spara undan radbryttecknet \n istället.

Tips 2

Minns att man kan “plussa” ihop strängar. "h" + "e" == "he" och "he" + "j" == "hej"

Anropet replace_periods_with_newlines("hej.hur mår du.jag mår bra!") ska alltså returnera strängen "hej\nhur mår du\njag mår bra!". Observera att om du skriver ut strängen så kommer alla förekomster av "\n" att skrivas ut som faktiska radbryt.

Uppgift 2.17 (10p)

Skriv funktionen replace_char_in_string(original_string, search_character, replacement) som ska byta ut alla förekomster av tecknet i strängen search_character mot tecknet i strängen replacement. Använd en loop för att göra detta, inte str.replace().

Uppgift 2.18 (10p)

Skriv en funktion reverse_string(string_value) som tar en sträng som argument och returnerar en sträng som är som är en baklänges variant av strängen i argumentet string_value. Funktionen ska använda en while-loop för att skapa baklängessträngen som returneras.

Anropet reverse_string("python är kul") ska alltså returnera strängen "luk rä nohtyp".

Tips! Funktionen len() kan också användas för att ta reda på hur lång en sträng är.

Uppgift 2.19 (5p)

Skriv funktionen get_five_first(value_list) som tar in en lista som alltid kommer vara längre än 5 element. Funktionen ska returnera en lista som bara innehåller de fem första elementen i value_list. Använd en loop och inte “slice”-notation (som finns i Python men som vi inte gått igenom än).

Anropet get_five_first([5, "hej", "hopp", "who", "are", "you"]) ska alltså returnera listan [5, "hej", "hopp", "who", "are"].

Uppgift 2.20 (10p)

Skriv funktionen get_nfirst(value_list, n) som tar in en lista, value_list som alltid är längre än heltalsargumentet n. Funktionen ska returnera en lista som innehåller de n första elementen i listan value_list.

Anropet get_nfirst([5, "hej", "hopp", "who", "are", "you"], 3) ska alltså returnera listan [5, "hej", "hopp"].

Uppgift 2.21 (10p)

Skriv funktionen get_all_less_than(values, cutoff) som returnerar en lista med alla värden från listargumentet values som är mindre än cutoff. Alla värden i values och värdet i cutoff är flyttal.

Anropet get_all_less_than([4.5, 0.1, 40.3, 20.0], 3.1) ska alltså returnera listan [0.1].


Sidansvarig: Jody Foo
Senast uppdaterad: 2017-09-05