Logga in
| 7 sidor teori |
| 12 Uppgifter - Nivå 1 - 3 |
| Varje lektion är menad motsvara 1-2 lektioner i klassrummet. |
x = 13
y = x + 7
print(x, y)
x = 23
print(x, y)
Vad tror du kommer att hända när man kör det här kodexemplet? Testa koden och se om du hade rätt. Ändra sedan på exemplet och experimentera för att förstå hur variablerna beter sig. Spelar det t.ex. någon roll på vilken sida om likhetstecknet man anger variabeln? Vilka rader ändrar värdet i variabeln y
?
I den här lektionen går vi igenom följande begrepp:
Inom programmering används variabler för att lagra olika sorters värden. Ofta är det fråga om heltal eller decimaltal, men det kan t.ex. också vara text. Man skapar en variabel genom att välja ett namn och skriva det följt av ett likhetstecken och sedan det man vill lagra i variabeln. Man kan t.ex. skriva
x = 10
för att lagra värdet 10 i variabeln x
. Man kan se det som att programmet skapar en låda märkt x
som det sedan lägger värdet 10 i.
Variabelnamn kan bestå av bokstäver, siffror och understreck (_
) men de får inte börja med en siffra. I de flesta programmeringsmiljöer går det att använda å, ä och ö i variabelnamn men man brukar undvika att göra det eftersom det inte är garanterat att det fungerar.
en_variabel = 33.012
print(en_variabel)
variabel_2 = 74
print(variabel_2)
>
33.012
74
Till skillnad från variabler inom matematiken är innehållet i programmeringsvariabler varken obekant eller godtyckligt, utan programmet håller hela tiden reda på vad som finns lagrat i dem. Det är dock möjligt att innehållet skrivs över med något annat allt eftersom programmet stegar sig igenom koden.
x = 10
print(x)
x = 20
print(x)
>
10
20
När man lagrar ett värde i en variabel säger man att variabeln tilldelas ett värde. Variabelnamnet skrivs alltid innan likhetstecknet och det som kommer efter är vad som sparas i variabeln. Om det är ett uttryck kommer det beräknas och sedan lagras, så om man skriver
x = 3*7 + 8
kommer programmet att räkna ut 3⋅7+8=29 och lagra värdet 29 i variabeln x
. Det som står till höger om likhetstecknet kan även innehålla andra variabler, t.ex.
y = x + 6
.Om man redan har sparat värdet 29 i x
kommer detta att sättas in i uttrycket och programmet gör beräkningen 29+6=35 för att sedan spara 35 i variabeln y
. Det går till och med att använda den variabel som får tilldelningen i uttrycket till höger om likhetstecknet.
y = y + 1
.I matematiken skulle det här vara en ekvation, men i ett program tolkas det på ett annat sätt. Här läser programmet först av vad som finns lagrat i y
och sätter in det i högerledet, vilket ger uträkningen 35+1=36. Programmet skriver sedan över y
med detta nya värde.
x = 3*7 + 8
print(x)
y = x + 6
print(y)
y = y + 1
print(y)
>
29
35
36
Vad kommer att finnas i variablerna a
och b
efter att man har kört följande kod?
a = 25
b = 4*a
a = 4*b
b = b - 10
a=400 och b=90
Tänk på varje variabel som en låda. I början har lådan märkt a
siffran 25. Skapa en andra låda märkt b.
Vi börjar på rad 1, där vi ser att variabeln a
tilldelas värdet 25. Man kan tänka sig variabeln som en låda, och nu ligger talet 25 i lådan.
På rad 2 skapas variabeln b
och tilldelas resultatet av beräkningen till höger om likhetstecknet, alltså 4*a
. Just nu ligger värdet 25 i a
, så beräkningen blir 4⋅25=100. Nu har alltså en ny låda skapats med talet 100 i.
På rad 3 skapas ingen ny variabel, istället ändras värdet på a
. Till höger om likhetstecknet står 4*b
, och med värdet 100 i b
blir beräkningen 4⋅100=400. Vi ska alltså skriva över innehållet i a
med 400.
I matematik är b=b−10 en motsägelse, men i Python innebär det att värdet b-10
ska lagras i variabeln b
. Just nu ligger 100 i b
, så beräkningen blir 100−10=90. Variabeln ska alltså tilldelas värdet 90, vilket skriver över det gamla.
Detta är alltså vad som finns lagrat i variablerna efter att koden har körts.
En datatyp är en viss sorts information, t.ex. heltal eller strängar, som ett programmeringsspråk handskas med. Dessa kan inte kombineras hur som helst — man kan t.ex. inte addera ett tal och en text. Vissa operatorer, som t.ex. +
, fungerar olika beroende på vilken datatyp man använder dem på. Det är framför allt fem datatyper man bör känna till.
Datatyp | Beskrivning |
---|---|
Heltal (integer, int) | Detta är en datatyp för heltal, t.ex. 4 och -55 .
|
Flyttal (float) | Denna datatyp används för decimaltal, t.ex. -8.7 och 3.0 .
|
Sträng (string, str) | Strängar används för vanlig läsbar text, t.ex. 'Jag är 17 år gammal.' . Strängar skrivs inom apostrofer.
|
Bool (boolean) | Det finns bara två möjliga värden för datatypen bool: sant och falskt, vilket i Python skrivs True respektive False .
|
Lista (list) | Listor används för samlingar av värden, t.ex. [2, 4, 8, 16] eller [5, 'text', 3.14] . Listor skrivs inom hakparenteser.
|
Listor är en datatyp i Python som kan innehålla flera värden eller variabler. Man skapar dem genom att sätta hakparenteser runt en följd av värden, separerade med komman.
x = [1, 2, 3, 4, 5]
print(x)
>
[1, 2, 3, 4, 5]
Värdena i listor måste inte ha samma datatyp utan man kan blanda hur man vill.
x = [1, 'två', 3.0, 4, 'fem']
print(x)
>
[1, 'två', 3.0, 4, 'fem']
För att komma åt ett visst element i en lista sätter man en hakparentes efter variabelnamnet och skriver numret för det element man vill ha. I Python har man valt att indexeringen ska börja på 0, inte 1, så om man exempelvis vill få tag i det tredje elementet skriver man x[2]
.
x = [1, 'två', 3.0, 4, 'fem']
print(x[2])
>
3.0
Om man vill lägga till ett värde i en lista som redan finns går det att göra med hjälp av kommandot append()
. Man använder det genom att skriva namnet på listan följt av en punkt och append()
, där man skriver in det värde man vill lägga till inom parentesen. Då hamnar värdet sist i listan.
x = [1, 2, 3, 4, 5]
x.append(10)
print(x)
>
[1, 2, 3, 4, 5, 10]
Ylva ska beräkna värdet av ett polynom för några x-värden. Hon börjar med x=3 och skriver ett program för beräkningen.
print(18*3**4 - 57*3**3 + 12*3**2 + 100*3 - 560)
>
-233
x = 4
print(18*x**4 - 57*x**3 + 12*x**2 + 100*x - 560)
x = 5
print(18*x**4 - 57*x**3 + 12*x**2 + 100*x - 560)
x = 6
print(18*x**4 - 57*x**3 + 12*x**2 + 100*x - 560)
Först, hitta polynomet som Ylva använder. Använd sedan det uttrycket inuti print-instruktionen. Kom ihåg att först definiera variabelns värde.
x
tilldelas ett värde. x = 3
print(18*x**4 - 57*x**3 + 12*x**2 + 100*x - 560)
>
-233
Programmet gör precis samma sak som tidigare, men den här versionen är lättare att återanvända. Nu behöver Ylva bara ändra till x=4
, x=5
, och x=6
, och köra programmet igen för att beräkna nästa värde, istället för att ändra 3
till 4
på fyra ställen. Det är dessutom mer lättläst!
x = 4
print(18*x**4 - 57*x**3 + 12*x**2 + 100*x - 560)
x = 5
print(18*x**4 - 57*x**3 + 12*x**2 + 100*x - 560)
x = 6
print(18*x**4 - 57*x**3 + 12*x**2 + 100*x - 560)
>
992
4365
11488
Inom programmering är en kommentar ett textstycke i koden som inte tolkas av programmet. Syftet kan vara att förklara vad koden gör eller att tillfälligt dölja en kodrad som man kanske vill använda senare. I Python skapas en kommentar med tecknet #
. Alla efterföljande tecken på samma rad som #
ignoreras av programmet.
#Programmet tar ett tal x och skriver ut talet y,
#som är 5 större. x = 2 # Här sätts startvärdet
y = x + 5 # Raden nedan är bortkommenterad och därför skrivs y inte över
# y = -2 print(y)
>
7
Antag att koefficienterna till ett femtegradspolynom lagras i en lista på följande sätt.
koeff = [551, -5, 1, 8, 7, -85]
Det första elementet är konstanttermen, det andra är koefficienten framför x, osv.
Skriv ett program som använder en sådan lista och ett x-värde för att beräkna och skriva ut polynomets värde. Använd programmet för listan ovan och x-värdet 2.
Använd programmet för att beräkna värdet för polynomet 5x5−60x3+x2−100x+7723 när x=−5.
Vi börjar med att skapa variablerna som innehåller de värden vi vill räkna med, alltså listan med koefficienter och x-värdet.
koeff = [-85, 7, 8, 1, -5, 551] x = 2
Vi kan sedan beräkna värdet för polynomet direkt. Första termen är endast en konstant, så den är bara koefficienten koeff[0]
. För andra termen multipliceras koefficienten koeff[1]
med ett x, så man skriver koeff[1]*x
. Nästa term blir koeff[2]*x**2
, där vi kommer ihåg att man använder operatorn **
för potenser, och på samma sätt fortsätter vi för resten av termerna.
koeff = [-85, 7, 8, 1, -5, 551] x = 2
varde = koeff[0] + koeff[1]*x + koeff[2]*x**2 + koeff[3]*x**3 + koeff[4]*x**4 + koeff[5]*x**5
Vi sparar också det uträknade värdet i en variabel varde
så att vi kan skriva ut det.
koeff = [551, -5, 1, 8, 7, -85] x = 2
varde = koeff[0] + koeff[1]*x + koeff[2]*x**2 + koeff[3]*x**3 + koeff[4]*x**4 + koeff[5]*x**5 print(varde)
> -1999
Vi får resultatet -1999, vilket alltså är värdet på polynomet när x = 2.
För att göra en uträkning med ett nytt polynom och ett nytt x behöver vi bara ändra på värdena i koeff
och x
. Vi vet att det nya x-värdet är -5 men listan med koefficienter är lite klurigare. Vi tittar på polynomet.
5x^5 -60x^3 +x^2 - 100x + 7 723
Första elementet i listan är konstanttermen, alltså 7 723, och sedan kommer koefficienten framför x-termen, x^2-termen osv. Framför x^2-termen står det inget, vilket innebär att koefficienten är 1, och det finns ingen x^4-term, så i det fallet är koefficienten 0. Vi får då följande nya lista.
koeff = [7723, -100, 1, -60, 0, 5]
Vi byter ut listan koeff
i vårt program och sätter även in x = -5
. Sedan är det bara att köra programmet igen för att få värdet på polynomet.
koeff = [7723, -100, 1, -60, 0, 5] x = -5
varde = koeff[0] + koeff[1]*x + koeff[2]*x**2 + koeff[3]*x**3 + koeff[4]*x**4 + koeff[5]*x**5 print(varde)
> 123
Polynomet blir alltså 123 när x = -5.
Men hjälp av loopar kan man göra ett program som beräknar värdet av polynom med vilket gradtal som helst. Då stegar man sig igenom listan, koefficient för koefficient, och multiplicerar dem med x-värdet upphöjt till index för koefficienten. Listan koeff
kan då innehålla hur många koefficienter som helst.
koeff = [551, -5, 1, 8, 7, -85] x = 2 varde = 0
for index in range(len(koeff)): varde += koeff[index] * x**index ##Värdet från termerna i polynomet adderas till variabeln varde. print(varde)
Aksel tillverkar och säljer två sorters bullar. För att hjälpa honom med verksamheten har han skrivit ett program, där den viktiga delen ser ut så här.
vinst_kanel = intakt_kanel - utgift_kanel
vinst_polka = intakt_polka - utgift_polka
print(vinst_kanel / vinst_polka)
Vad gör programmet?
Aksel kör programmet med värdena nedan.
intakt_kanel = 32*22 - 5*12
utgift_kanel = 16*9 + 30*3
intakt_polka = 15*17 -2*22
utgift_polka = 13*12 + 3*15 + 10
Det ger ett felmeddelande. Varför blir det fel?
De första två raderna ser ut att beräkna två olika sorters vinst, genom att ta intäkter minus utgifter.
vinst_kanel = intakt_kanel - utgift_kanel vinst_polka = intakt_polka - utgift_polka
Förmodligen är det en vinst per bullsort, dvs. att han tjänar olika mycket pengar på att tillverka och sälja de två bullsorterna. Huruvida det handlar om vinst per bulle, per vecka eller något annat vet vi inte. Sista raden gör en beräkning och skriver ut resultatet.
print(vinst_kanel / vinst_polka)
Anta som exempel att vinst_kanel
är 30kr och att vinst_polka
är 10kr. Kvoten som beräknas blir då .30 /10. = 3, vilket innebär att vinsten på kanelbullarna är 3 gånger så stor som vinsten för polkabullarna. Programmet avgör alltså hur många gånger större vinsten på kanelbullarna är jämfört med polkabullarna.
Det fullständiga programmet ser ut så här.
intakt_kanel = 32*22 - 5*12 utgift_kanel = 16*9 + 30*3 intakt_polka = 15*17 -2*22 utgift_polka = 13*12 + 3*15 + 10
vinst_kanel = intakt_kanel - utgift_kanel vinst_polka = intakt_polka - utgift_polka print(vinst_kanel / vinst_polka)
> Traceback (most recent call last): File "python", line 8, in <module> ZeroDivisionError: division by zero
Här är felmeddelandet ZeroDivisionError: division by zero ganska tydligt. Vi delar med noll! Det måste alltså vara vinst_polka
som är noll. Vi kontrollerar det genom att beräkna intakt_polka - utgift_polka
med de värden vi har.
Polkabullarna verkar alltså inte ge någon vinst, och då går beräkningen inte att utföra.
Nisse vill undersöka den linjära funktionen f(x)=x+10. Han vill först testa den för x=2 och skriver följande.
x = 2
y = x + 10
Han använder print
för att undersöka värdena, och vill sedan testa en punkt till. Han lägger då till dessa rader till programmet.
x = 15
print(x, y)
Han väntar sig att se 15 25
, men det får han inte. Varför?
Här ser man en skillnad mellan matematik och programmering. I matematik skulle y = x + 10 beskriva en funktion, där y är en beroende variabel som uppdateras
för varje nytt värde på x. Men kodraden y = x + 10
anger inte en matematisk funktion utan en tilldelning. Det som händer då är att högerledet utvärderas,
x+ 10 ⇒ 2 + 10 ⇒ 12,
och resultatet 12 sparas i variabeln y
. Det här värdet ligger kvar tills man ger y
en ny tilldelning. Nisse skulle därför kunna skriva programmet så här.
x = 2 y = x + 10 print(x, y) x = 15 y = x + 10 print(x, y)
> 2 12 15 25
Begreppet funktion
används även i programmering. Det är användbart i fall som detta när man har en beräkning, x + 10, man vill göra flera gånger, men för olika invärden. Dessa anges med kommandot def
som i exemplet nedan.
def y(x): return x + 10 print(2, y(2)) print(15, y(15))
> 2 12 15 25
Matematik och programmering använder liknande notation men med olika innebörd. Vilka av formuleringarna nedan är giltiga inom matematik och vilka är giltiga kodstycken?
Vi går igenom raderna var för sig och undersöker vilka som fungerar inom matematik och som fungerar som kodstycken.
Detta går bra att skriva både inom matematik och programmering, och i båda fall betyder det att variabeln x är lika med 5. Inom programmering är det dock på grund av att man gör en tilldelning och sparar värdet 5
i variabeln x
.
I programmering är det inga problem att skriva på detta sätt, så länge variabeln x
redan finns. Då beräknas summan av det gamla värdet och 5 och detta nya värde sparas i x
. Det fungerar inte fullt lika bra som en matematisk ekvation. Subtraherar vi x på båda sidor får vi en motsägelse.
x = x + 5 ger 0 = 5
Raden fungerar alltså som en kodsnutt men inte som en ekvation.
Den här raden fungerar varken som kod eller som en ekvation. Som kod blir det fel eftersom det bara får stå ett variabelnamn till vänster om likhetstecknet när man gör en tilldelning. Som en ekvation är det samma problem som för förra raden, alltså att det leder till en motsägelse om man försöker lösa den.
Här har vi igen flera termer till vänster om likhetstecknet, så raden fungerar inte som kod. Den fungerar dock fint som en ekvation och vi kan lösa den utan några motsägelser. x + 5 = 10 ger x = 5
Antag att man har två variabler, x
och y
.
x = -50
y = -97
När man sparar ett värde i en variabel skriver man över det som fanns där tidigare. Vi kan alltså inte bara lägga över värdet från en av variablerna till den andra variabeln och sedan göra samma sak åt andra hållet. Då kommer vi ju att tappa bort värdet från den andra variabeln. Istället måste vi skapa en till variabel där vi kan lägga ett värde så länge.
x = -50 y = -97 temp = x
Nu har vi sparat undan det ursprungliga värdet som fanns i variabeln x
, dvs. - 50, så det gör inget om vi skriver över den. Vi kan alltså lägga det värde som för tillfället finns i y
i x
.
x = -50 y = -97 temp = x x = y
Nu har vi fått över värdet från y
till x
och allt vi har kvar att göra är att flytta över det gamla x
-värdet, dvs. - 50, från temp
till y
.
x = -50 y = -97 temp = x x = y y = temp
Värdena i x
och y
har nu bytt plats. Om vi vill kan vi lägga till en utskrift som visar det.
x = -50 y = -97 temp = x x = y y = temp print('x:', x) print('y:', y)
> x: -97 y: -50
Vi drar slutsatsen att programmet som följer de givna stegen är program B.