Logga in
| 8 sidor teori |
| 12 Uppgifter - Nivå 1 - 3 |
| Varje lektion är menad motsvara 1-2 lektioner i klassrummet. |
import math print(math.pi) x = 19.7531
print(math.sqrt(x))
print(round(x,1)) en_lista = [-7, 2, 19, 3]
print(max(en_lista))
print(sum(en_lista))
print(len(en_lista))
Kan du lista ut vad kodraderna ovan gör? Ändra värdena i x
och en_lista
för att se hur resultatet påverkas. Vad gör tror du ettan på rad 7 gör? Vad händer om första raden tas bort?
I den här lektionen går vi igenom följande begrepp:
//
mellan täljaren och nämnaren. Om man t.ex. skriver 32 // 5
får man resultatet 6
eftersom det finns 6 hela 5:or i 32. kvot = 32 // 5
print(kvot)
För att beräkna resten man får vid heltalsdivision använder man modulo-operatorn. I Python skrivs den som ett procenttecken mellan täljaren och nämnaren, t.ex. 32 % 5
, vilket ger resultatet 2
eftersom det blir 2 över om man delar 32 med 5.
rest = 32 % 5
print(rest)
print("Kvot:", 23 // 12, "Rest:", 23 % 12)
print("Kvot:", 3001 // 103, "Rest:", 3001 % 103)
print("Kvot:", 87178291199 // 115249, "Rest:", 87178291199 % 115249)
Använd operatorn //
för kvoten och %
för resten.
För att beräkna heltalskvoten använder vi operatorn //
mellan täljaren och nämnaren, alltså 23 // 12
. På samma sätt använder vi operatorn %
för att beräkna resten och skriver 23 % 12
. Vi lägger även till några extra utskrifter så att vi vet vad det är som skrivs ut.
print("Kvot:", 23 // 12, "Rest:", 23 % 12)
>
Kvot: 1 Rest: 11
Genom att kopiera denna rad och byta ut värdena kan vi återanvända koden och göra samma sak för de två andra divisionerna.
print("Kvot:", 23 // 12, "Rest:", 23 % 12)
print("Kvot:", 3001 // 103, "Rest:", 3001 % 103)
print("Kvot:", 87178291199 // 115249, "Rest:", 87178291199 % 115249)
>
Kvot: 1 Rest: 11
Kvot: 29 Rest: 14
Kvot: 756434 Rest: 29133
I Python finns många inbyggda funktioner som kan vara användbara. Dessa kan t.ex. användas för att göra olika matematiska beräkningar. Pythons nummerfunktioner som abs()
, int()
och float()
omvandlar enskilda värden eller konverterar mellan olika typer.
Funktioner för tal | |
---|---|
abs()
|
Beräknar absolutbeloppet av argumentet. Skriver man t.ex. abs(-35) beräknas ∣−35∣ och man får det positiva talet 35 som resultat.
|
int() och float()
|
Konverterar värden till datatypen heltal respektive flyttal. Dessa kan man bland annat använda för att konvertera strängar till värden man kan räkna med. T.ex. får man heltalet 23 om man skriver int('23') . Det är viktigt att tänka på att int() struntar i eventuella decimaldelar av ett tal, så int(2.94) ger resultatet 2 .
|
Listfunktioner som sum()
, len()
, min()
och max()
analyserar samlingar som helhet och beräknar sammanlagda egenskaper.
Funktioner för listor | |
---|---|
sum()
|
Används för att beräkna summan av ett antal värden i en lista. Exempelvis ger sum([1, 2, 3]) resultatet 6 .
|
len()
|
Använder man detta kommando på en lista svarar det listans längd, alltså antalet element i listan. T.ex. får man resultatet 3 om man skriver len([1, 2, 3]) .
|
min() och max()
|
Används för att hitta det minsta respektive största värdet i en lista. I listan [1, 2, 3] får man exempelvis ut 1 om man skriver min([1, 2, 3]) och 3 om man skriver max([1, 2, 3]) .
|
En modul kan också kallas bibliotek
eller paket
. Det är kod man kan läsa in i sitt program för att få tillgång till fler funktioner. I Python finns t.ex. modulen math
, som innehåller matematiska funktioner, och matplotlib
, med funktioner för att rita grafer och diagram. För att importera, dvs. läsa in, en modul skriver man import
överst i programmet.
import math
Funktioner från modulen kan sedan användas var som helst i programmet genom att skriva modulens namn följt av en punkt och funktionens namn.
import math
print(math.sqrt(9))
>
3.0
math
- modul
Modulen math
används till mer avancerade matematiska beräkningar i Python.
pi
, e
sqrt()
exp()
log()
log(100, 10)
ger t.ex. tiologaritmen av 100.radians()
degrees()
sin()
, cos()
, tan()
asin()
, acos()
, atan()
I trigonometrin får man lära sig att sin(90∘)=1 och att arccos(−1)=180∘. Pythons funktioner sin()
och acos()
räknar dock inte vinklar i enheten grader, utan i radianer. Det är viktigt att tänka på detta när man skriver program, så att man inte får helt fel värden.
import math
vinkel1 = 90
sinus = math.sin(vinkel1)
print(sinus)
>
0.8939966636005579
import math
cosinus = -1
vinkel2 = math.acos(cosinus)
print(vinkel2)
>
3.141592653589793
degrees()
och radians()
så att sinus
blir 1 och vinkel2
blir 180 i beräkningarna ovan.
import math
vinkel1 = math.radians(90)
sinus = math.sin(vinkel1)
print(sinus)
import math
cosinus = -1
vinkel2 = math.degrees(math.acos(cosinus))
print(vinkel2)
Använd radians()
för att omvandla grader till radianer och degrees()
för att omvandla radianer till grader.
Grader och radianer är olika enheter att mäta vinklar i, på samma sätt som t.ex. ett avstånd kan mätas i både cm och tum. För att beräkningarna ska fungera som förväntat måste vi ta hänsyn till de olika enheterna. Grader omvandlas till radianer med radians()
, och den första vinkeln kan därför skrivas om på det här sättet.
import math
vinkel1 = math.radians(90)
sinus = math.sin(vinkel1)
print(sinus)
>
1.0
Nu får vi rätt sinusvärde. Den andra vinkeln att omvandla är resultatet av beräkningen math.acos(cosinus)
, eftersom funktionen acos()
svarar med vinklar i radianer. För att omvandla radianer till grader används degrees()
.
import math
cosinus = -1
vinkel2 = math.degrees(math.acos(cosinus))
print(vinkel2)
>
180.0
round()
För att avrunda värden i Python använder man kommandot round()
och skriver det tal man vill avrunda innanför parenteserna.
print(round(2.75))
>
3
Som standard avrundas värdet till ett heltal, men genom att lägga till ett extra argument kan man välja hur man avrundar. Argumentet anger hur många steg från decimaltecknet avrundningen sker, där positiva tal anger steg till höger och negativa tal anger steg till vänster. T.ex. avrundar man till hundradelar om argumentet är 2 och till tiotal om det är −1.
print(round(1786.1314, 2))
print(round(1786.1314, -1))
>
1786.13
1790.0
På grund av hur man har valt att avrundning ska fungera i Python och hur decimaltal lagras kan man inte lita på att avrundningen exakt kommer att följa de avrundningsregler man är van vid. Oftast stämmer det, men man får t.ex. resultatet 2
om man skriver round(2.5)
. För att alltid avrunda uppåt eller nedåt använder man funktionen ceil
respektive floor
från modulen math
.
import math
print(math.ceil(3.14159))
print(math.floor(2.71828))
>
4
2
Skriv ett program som bestämmer längden på den längsta sidan i en triangel, givet koordinaterna för triangelns hörn. Använd programmet för att bestämma den längsta sidan i följande triangel. Svara med 2 decimaler.
Vi börjar med att skapa tre listor, p1
, p2
och p3
, som innehåller koordinaterna för triangelns tre hörn. Vi läser av dem från figuren.
Vi låter första elementet i listorna vara x-koordinaterna och element två vara y-koordinaterna.
p1 = [-4, -3] p2 = [-2, 3] p3 = [3, 2]
Vi vill nu beräkna avstånden mellan dessa punkter och för att göra det använder vi avståndsformeln. Enligt den ges avståndet mellan två punkter (x_1, y_1) och (x_2, y_2) av
d = sqrt((x_2-x_1)^2 + (y_2-y_1)^2).
Vi skriver om detta på kodform. Då skrivs roten med kommandot sqrt()
från modulen math
, så vi måste importera modulen i början av programmet. Om vi börjar med att räkna ut sidan mellan första och andra punkten blir x_1 listelementet p1[0]
, y_1 blir p1[1]
, x_2 blir p2[0]
och y_2 blir p2[1]
.
import math p1 = [-4, -3] p2 = [-2, 3] p3 = [3, 2]
sida1 = math.sqrt((p2[0] - p1[0])**2 + (p2[1] - p1[1])**2)
Vi lägger till ytterligare två rader för de andra sidorna, alltså de mellan p2
och p3
respektive p3
och p1
.
import math p1 = [-4, -3] p2 = [-2, 3] p3 = [3, 2]
sida1 = math.sqrt((p2[0] - p1[0])**2 + (p2[1] - p1[1])**2) sida2 = math.sqrt((p3[0] - p2[0])**2 + (p3[1] - p2[1])**2) sida3 = math.sqrt((p1[0] - p3[0])**2 + (p1[1] - p3[1])**2)
För att hitta den längsta sidan lägger vi in alla sidlängder i en lista och använder funktionen max()
på den. Vi sparar detta värde i en variabel, langsta_sida
, och skriver ut den.
import math p1 = [-4, -3] p2 = [-2, 3] p3 = [3, 2]
sida1 = math.sqrt((p2[0] - p1[0])**2 + (p2[1] - p1[1])**2) sida2 = math.sqrt((p3[0] - p2[0])**2 + (p3[1] - p2[1])**2) sida3 = math.sqrt((p1[0] - p3[0])**2 + (p1[1] - p3[1])**2) langst_sida = max([sida1, sida2, sida3]) print(langst_sida)
> 8.602325267042627
Med hjälp av programmet kan vi alltså bestämma att den längsta sidan är ungefär 8,6 l.e. lång.
Hannibal har hittat kod på nätet som tar ett positivt heltal x
och skriver ut de n
första och sista siffrorna i talet.
import math
x = 634748103
n = 3
A = x % 10**n
p = math.ceil(math.log(x, 10))
B = x // 10**(p - n)
print(A)
print(B)
>
103
634
Han ser att koden fungerar, men förstår inte varför. Förklara för Hannibal vad som händer på raderna 5–7 och varför detta producerar de första och sista n siffrorna.
Vi tittar först på rad 5.
A = x % 10**n
Talet n
är 3, så 10**n
blir 10^3 = 1000. Beräkningen är alltså x % 1000
, vilket ger resten då talet x
delas med 1000. Detta blir de tre sista siffrorna, vilket man kan förstå om man delar upp talet x
:
634748103 = 634748000 + 103.
Talet 634748000 är ett jämnt tusental, så det går jämnt upp när man delar med 1000. Däremot är 103 för litet för att bilda ett helt tusental och blir därför en rest.
De sista siffrorna utgör alltså en rest då man delar x
med en tiopotens. På samma sätt utgör de första siffrorna en heltalskvot då man delar med en tiopotens. Det kan vi förstå genom att temporärt byta ut %
mot //
på rad 5.
A = x // 10**n print(A)
> 634748
När %
byts mot //
plockas de fem första siffrorna ut ur x
, eftersom 1000 ingår i x
precis 634748 gånger (med 103 i rest). //
är alltså ett verktyg för att plocka ut förstasiffror, men vi måste dela med rätt tiopotens! x // 1000
ger ju mer än bara de tre första siffrorna. Det är därför vi behöver rad 6.
p = math.ceil(math.log(x, 10))
Här beräknas antal siffror i talet x
. Vi kan förstå det genom att beräkna tiologaritmen math.log(x, 10)
för några olika tal.
import math print(math.log(14, 10)) print(math.log(320, 10)) print(math.log(7412, 10))
> 1.1461280356782377 2.505149978319906 3.869935410646859
Kom ihåg att lg(10)=1 och att lg(100) = 2. Därför kommer tiologaritmen av varje tal mellan 10 och 100 bli ett tal mellan 1 och 2. På samma sätt har alla tal mellan 100 och 1000 en tiologaritm mellan 2 och 3. Så genom att avrunda tiologaritmen uppåt med ceil
matchar variabeln p
alltid antal siffror i talet x
.
import math x = 634748103 n = 3
A = x % 10**n p = math.ceil(math.log(x, 10)) print(p)
> 9
Vi såg tidigare att x // 10**3
gav de siffror som blir kvar när man tar bort de sista tre. Nu vill vi ändra exponenten så att vi skalar bort så många att bara tre siffror blir kvar! Antalet som ska skalas bort blir därför 3 mindre än antal siffror i talet: p - n
. Med detta som exponent får vi mycket riktigt ut talets tre första siffror.
import math x = 634748103 n = 3
A = x % 10**n p = math.ceil(math.log(x, 10)) B = x // 10**(p - n) print(A) print(B)
> 103 634
Programmet fungerar faktiskt inte riktigt som det beskrivs för alla värden på x
. Se t.ex. nedan, där samma program körs med ett annat x
.
import math x = 482934049 n = 3
A = x % 10**n p = math.ceil(math.log(x, 10)) B = x // 10**(p - n) print(A) print(B)
> 49 482
Här skrivs bara de två sista siffrorna ut, inte tre! Det beror på att programmet hanterar tal och inte enstaka siffror. De tre sista siffrorna 049
tolkas då som talet 49. Det går att komma runt detta, t.ex. genom att använda strängar istället för tal, men lärdomen är att inte lita blint på kod man hittat på nätet!