Lektion 5: Mer om funktioner.
Denna lektion innehåller Obligatorisk uppgift 1 (OU1)
Moment: | Objekt. Parameteröverföring och returvärden. |
Begrepp som introduceras: | Föränderliga och oföränderliga objekt. |
Arbetssätt: | Arbeta gärna tillsammans med någon, men skriv egen kod. Diskutera med varandra!
Försök göra övningarna innan du tittar på svaren. Fråga handledarna om det är något svar du inte förstår! Tips: Använd debuggern |
Uppskattad arbetstid: | Schemalagd handledningstid inkl redovisning: 6 timmar. Utöver det räkna med eget arbete med lika många timmar. |
Redovisning: |
Obligatorisk redovisning för lärare/handledare enligt tiderna på
kurssidan.
Notera att den pythonkod du redovisar skall följa kodningsreglerna |
Backup: | När du arbetar på egen dator måste du se till att det löpande görs backup på de filer (py-filer) som du skapar under kursens gång. Om du har filerna enbart lagrade på din dator finns risk att allt försvinner vid ett datorhaveri eller vid stöld. |
Vad menas med objekt?
I den första lektionen talade vi om "list-objekt" och i den tredje om "turtle-objekt".
Det som synligt verkade lite speciellt med dessa var att det
fanns metoder för att påverka objekten (append
för listor och left
,
forward
m.m. för sköldpaddor).
Metoder är funktioner kopplade till individuella objekt.
För att anropa en metod använder man en punktnotation där man framför punkten anger vilket objekt som åsyftas och efter punkten vilken funktion (dvs metod) som avses. Exempel: t.forward(10)
som anger att det är just den sköldpadda som t
refererar som ska flyttas.
I Python är faktiskt nästan allting objekt (heltal, flyttal, strängar m.m. men även t.ex, funktioner). Det finns alltså metoder knutna även t.ex. till tal.
Det är dock en viktig skillnad mellan å ena sidan t.ex. list- och turtle-objekt och å andra sidan bl.a. heltals- och flyttals-objekt.
Heltals-, flyttals- liksom även t.ex. sträng-objekt är oföränderliga (eng. immutable) medan t.ex. list- och turtle-objekt är föränderliga (eng. mutable). Det har effekter på vad som händer både vid tilldelningar och parameteröverföring.

Vidstående figur illustrerar hur det ser ut när nedanstående kod körts.

Om vi sedan kör nedanstående rader blir bilden
Eftersom heltal är oföränderliga måste y
få ett nytt objekt med innehållet 4 (om man kunde ändra 3-an till en 4
skulle även x
bli 4 - sannolikt en mycket oönskad effekt...)
Efter tilldelningen u = t
kommer u
och t
att stå för samma objekt.
Det innebär alltså att t.ex. t.forward(100)
och u.forward(100)
gör precis samma sak dvs flyttar på den gröna paddan.
Den röda paddan är borttappad. Den syns (dvs finns) fortfarande men vårt program har svårt att komma åt den.
Vid tilldelning av ett värde av föränderlig typ till en variabel ändras bara referensen - inget nytt objekt skapas.
Vid funktionsanrop fungerar överföringen av argumenten till parametrarna precis som tilldelningar. Det innebär att om vi skickar ett oföränderligt värde till en parameter så spelar det ingen roll vad funktionen gör med parametern. Om parametern tilldelas ett nytt värde kommer det inte ha någon effekt i den anropande koden.
Om vi skickar ett förändringsbart objekt, t.ex. en turtle, till en funktion så kommer allt funktionen gör med parametern synas (märkas) i den anropande koden.
Återbesök i sköldpaddsdammen
Vi ska nu titta på några funktioner som gör saker med paddor. Det kommer finnas två lite olika typer av funktioner:- Funktioner som ber en viss given padda göra något som det saknas en metod för. Då kan vi skriva en funktion som tar emot en padda som och utför de saker vi vill med den paddan. Om vi själva hade designat paddorna kanska vi hade gjort detta som en metod.
- Vi kan också vilja ha paddorna enbart som hjälpmedel för att producera olika geometriska figurer som rektanglar, cirklar, mm. Eftersom vi inte är intresserade av vilken padda som producerar resultatet skickar vi inte med paddan utan låter funktionen själv skapa den! I själva verket behöver vi inte ens veta att funktionen använder paddor för att åstadkomma det vi vill.
Ytterligare turtle
-metoder kan vara till nytta i denna lektion
Metod | Funktion |
---|---|
xcor() | Returnerar paddans x-koordinat. |
ycor() | Returnerar paddans y-koordinat. |
heading() | Returnerar paddans kurs. 0 är x-axelns och 90 är y-axelns riktningar. |
setheading(angle) | Sätter paddans kurs. 0 är x-axelns och 90 är y-axelns riktningar. |
towards(x, y) | Returnerar riktningen till punkten (x , y ). |
towards(t) | Returnerar riktningen till paddan t . |
distance(x, y) | Returnerar paddans avstånd till punkten (x , y ). |
distance(t) | Returnerar avståndet från den egna paddan till paddan t . |
Turtlar som parametrar
Om man vill flytta en padda utan att den ritar ett spår är följande funktion användbar:Turtlar som funktionsvärde
Exempel: make_turtle
När man skapar en padda medturtle.Turtle()
placeras paddan i origo.
Om det är vanligt att vilja ge den en annan startposition kan vi använda:
Övningar
-
Skriv en funktion
rectangle(x, y, width, height, color)
som skapar en padda och målar en rektangel med angiven bredd, höjd och färg. Rektangelns nedre vänstra hörn ska vara i punkten(x, y)
. Du behöver göraimport turtle
i programmet för att kunna använda turtlar.def rectangle(x, y, width, height, color): t = make_turtle(x, y) t.hideturtle() t.fillcolor(color) t.begin_fill() for dist in [width, height, width, height]: t.forward(dist) t.left(90) t.end_fill()
-
Skriv en funktion
tricolore(x, y, h)
som ritar en fransk flagga med nedre vänstra hörnet i punkten (x, y) och höjden h. Proportionerna ska vara 2:3.def tricolore(x, y, h): w = h/2 #färgfältens bredd rectangle(x, y, w, h, 'blue') rectangle(x+w, y, w, h, 'white') rectangle(x+2*w, y, w, h, 'red')
-
Skriv funktionen
pentagram(x, y, side)
som skapar en padda och ritar ett pentagram. Toppen ska placeras i punkten(x, y)
. Parameternside
anger längden på linjerna mellan spetsarna..Tips: Vinkeln i toppen är 36 grader.
def pentagram(x, y, side): t = make_turtle(x, y) t.hideturtle() t.setheading(270 - 36/2) for i in range(5): t.forward(side) t.left(180-36)
Nu följer de obligatoriska uppgifterna som skall redovisas, nämligen uppgift A-C
Notera att den pythonkod du redovisar skall följa kodningsreglernaUppgift A: Prova funktionerna!

jump
, make_turtle
,
rectangle
, tricolore
och pentagram
) i en Python-fil.
Modifiera pentagram
så att den tar emot en parameter för fyllnadsfärg
på samma sätt som rectangle
.
Skriv de rader som producerar vidstående resultat. Lägg den kod som anropar funktionerna samlat sist i python-filen.
Kommentar:Färgfyllningen av pentagrammen kan bero på vilken dator/operativsystem du använder. Mac fyller ej i mitten av pentagrammet. Det är alltså inget du behöver fixa, utan det är okej att stjärnorna ser ut som dom gör.
Tips:
- Om du ger paddan hastigheten 0 (
t.speed(0)
) så går det fortare att rita! - Du kan sätta valfri färg på pentagrammen
- Det kan räcka med 3 rader kod för att rita de 10 pentagrammen.
Tips: Använd
for
-satser. Tänk på att programmet skall rita identiska pentagrammer i 10 st olika positioner.
Default-värden på parametrar
Man kan ge parametrar standardvärden ("default-värden") som gäller om man utelämnar den.
Exempel: Om man deklarerarrectangle
-funktionen så här:
rectangle(0, 0, 50, 50) | En ofylld kvadrat (en tom sträng som fyllnadsfärg anger att ingen fyllnad ska ske) |
rectangle(100, 100, 50, 50, 'blue') | En kvadrat fylld med blå färg. |
rectangle(100, 100, 50, 50, color='red') | En kvadrat fylld med röd färg. Är ett bra sätt om man har flera parametrar med default-värden. |
Övningar
-
Lägg till en parameter
visible
till funktionenmake_turtle
med defaultvärdetTrue
. Anropetmake_turtle(x, y)
ska, som tidigare, skapa en synlig padda medan anropetmake_turtle(x, y, visible=False)
liksommakeTurtle(False)
ska returnera en osynlig padda. Sätt också alltid osynliga paddors hastighet till högsta möjliga medspeed(0)
.def make_turtle(x, y, visible = True): t = turtle.Turtle() if not visible: t.hideturtle() t.speed(0) jump(t, x, y) return t
-
Skriv funktionen
random_turtle(side)
som skapar en padda, flyttar den till en slumpmässig plats i en centrerad kvadrat med sidanside
. Paddan ska få en slumpmässig riktning mellan och och 359. Parameternside
ska ha defaultvärdet 500. Tänk på att programmet måste haimport random
för att kunna använda slumptal.def random_turtle(side=500): low = -side//2 high = side//2 t = make_turtle(random.randint(low, high), random.randint(low, high)) t.setheading(random.randint(0, 359)) return t
Uppgift B: Rita flaggor

vietnamese_flag(x, y, height)
som ritar den vietnamesiska flaggan
med nedre vänstra hörnet i punkten (x, y)
.
Parametern height
anger höjden på flaggan och flaggans
proportioner är 3:2.
Pentagrammet ska vara centrerat på flagga. Uppskatta storleken på pentagrammet (eller leta upp rätt värde på nätet).
Ledning: Du måste antagligen skriva om pentagram
-funktionen
dels för att du inte ska ha med kantlinjerna och dels för att hela det inre ska
vara färgat.
<
Kommentar:Färgfyllningen av pentagrammen kan bero på vilken dator/operativsystem du använder.
Mac fyller ej i mitten av pentagrammet.
Det är alltså inget du behöver fixa, utan det är okej att stjärnorna ser ut som dom gör.
Du kan välja någon annan flagga t.ex.
den amerikanska, som också består ju också av rektanglar och fyllda pentagram.
Den flagga du väljer måste bestå av något mer än rektanglar!
Lägg den kod som anropar funktionen vietnamese_flag(x, y, height)
samlat sist i python-filen.
Uppgift C: Irrande paddor
-
Skapa filen
dizzyTurtles.py
. -
Lägg in raderna
import turtle import randomförst i filen. Dessa behövs för att kunna använda turtlar och slumptal.
-
Lägg in funktionerna
jump
,rectangle
ochmake_turtle
i filen. -
Skriv funktionen
move_random(t)
som skall göra en slumpmässig förflyttning av paddan.Kursen ska ändras med med ett slumpmässigt värde i intervallet [-45, 45]. Om t.ex. paddan har kurs 90 ska kursen sluta i intervallet [45, 135]. Därefter ska paddan gå framåt. Längden på sträckan som paddan går ska vara ett slumptal i intervallet [0, 25].
För att skapa slumpvärden ska funktionen
random.randint(m, n)
användas. Den returnerar ett slumptal mellanm
ochn
(gränserna kan antas). -
Skriv nu kod som skapar en padda, ritar en centrerad kvadrat med metoden
rectangle
. Kvadraten ska ha sidan 500 och fyllas men någon läcker färg (t.ex. 'lightblue'). -
Flytta paddan (
jump
) till en slumpmässig position inuti den blåa rutan. Nu kan det se ut så här: -
Skriv nu kod som med hjälp av
for
-satsen gör 250 anrop tillmove_random
. Notera, denna metod skall ej ändras.Då kan det se ut så här:
-
Lägg nu till kod i
move_random
som gör så att om paddan efter förflyttningen befinner sig utanför den blå rutan vänder sig mot origo. (Ett annat sätt att lösa "studsen" mot kanten kunde vara att låta utgående vinkel sättas till ingående vinkel. Om paddan går in i kanten med 20 graders vinkel, skall den gå ut med samma vinkel. Detta är dock lite svårare att få till)Då kan det se ut så här:
-
Skapa en till padda som också ska placeras ut slumpmässigt. Ge paddorna olika färg (metoden
color
).Låt samma
for
-sats flytta båda paddorna. Ändra så attmove_random
-metoderna anropas 500 gånger. Notera att denna metod skall ej ändras.Låt den ena paddan skriva ut texten
'close'
i fönstret om de är närmare varandra än 50 punkter. Metodenwrite
hjälper oss med detta. Exempel:t.write('close')
skriver ut texten'close'
intill paddant
i fönstret.Låt också programmet räkna och sedan skriva ut hur många gånger det var nära.
Lägg den kod som anropar funktionen
move_random
sist i python-filen.
Allmänna frågor
-
Vilka datatyper har du hittills sett i Python?
int
,float
,str
,bool
,list
,tuple
ochturtle
-
Vad är det för skillnad på uttrycken
2
och"2"
?Den första har typenint
och den andra typenstr
. -
Vad skrivs ut av satsen
print(int(1.8))
?Prova och förklara resultatet! -
Hur gör man för att se vilka funktioner som finns i modulen
math
? Visa!dir(math)
-
Vad är skillnaden mellan en funktion och en metod?
En metod hör till ett objekt vilket inte en funktion (normalt) gör.
-
Vad är en parameter?
En parameter är en variabel som nämns i funktionsdefinitionen. När funktionen anropas får parametern värde från motsvarande argument.
Fråga
Hur många timmar har du hittills arbetat vid dator för denna kurs?
Gå till nästa lektion eller gå tillbaka