Du har nu lyckats öppna din första Jupyter notebook-fil. Välkommen!
Ifall texten är för liten kan du zooma in/ut genom att hålla i Ctrl och trycka +/- (alternativt hålla i Ctrl och rulla på scrollhjulet på musen).
Denna fil innehåller både beskrivande text (som den här), men även kodrutor där vi kan köra Pythonkod.
Det första vi ska lära oss är att köra kod i en sådan ruta. Eftersom Enter används för att skapa en ny rad i kodrutan så måste vi trycka Ctrl+Enter för att exekvera (köra) koden i rutan.
Börja med att skriva in 3+5 nedan och tryck Ctrl+Enter
7**2
Som väntat skrevs talet 8 ut.
En annan fördel med dessa kommandorutor är att man också lätt kan ändra i redan utförda kommandon (mer som på ett papper) och köra kommandot igen.
Förhoppningsvis blir det då mer inbjudande att experimentera och pröva sig fram, något vi starkt rekommenderar.
Pröva själv att ändra talen i rutan ovan och kör kommandot igen (med Ctrl+Enter) för att se att det fungerar.
Vi avslutar detta avsnitt med att gå igenom några vanliga operationer. I Python används:
+ för addition- för subtraktion* för multiplikation/ för division** för upphöjt medOm du t.ex. vill beräkna $\frac{34+7\cdot 9}{2^2-5}$ skriver du (34+7*9)/(2**2-5). Prova att köra detta i rutan nedan.
Prova själv att skriva in följande matematiska uttryck i rutan nedan (ett i taget) och se att du får rätt output.
| Uttryck | Ska ge output |
|---|---|
| $\frac{3\cdot7-5}{6+2}$ | 2.0 |
| $-(3-(5-(-7) \cdot \frac{3}{5}))$ | 6.199999999999999 |
| $\frac{5}{8}-\frac{200-13}{6}$ | -30.541666666666668 |
| $\frac {5^2} {8^{1/3}}$ | 12.5 |
5/8 - (200 - 13) / 6
Notera att decimaltecknet skrivs med en punkt i Python (mycket p.g.a. att det är amerikansk standard att göra så). Det är ett vanligt misstag att skriva decimaltal med kommatecken, så var uppmärksam på det.
Ofta när man löser mer komplicerade problem så delar man upp problemet i mindre delsteg. Resultaten från varje delsteg används i ett senare steg eller som del i den slutgiltiga lösningen. På liknande vis fungerar det när man programmerar, men för att hålla koll på alla delresultat, och kunna använda dom i ett senare steg, så behöver de sparas i s.k. variabler.
Ifall man skriver s=3+5 så beräknar Python uttrycket till höger om
likhetstecknet och lagrar därefter resultatet 8 i datorminnet under variabelnamnet s. Man säger att variabeln s tilldelas värdet 8.
Likhetstecknet används alltså inte på samma sätt som i matematik! Här betyder tecknet = tilldelning (värdet till höger skrivs in i variabeln till vänster).
När en variabel tilldelas ett värde skrivs det heller inte ut automatiskt. Du måste själv säga åt Python att du vill att värdet ska skrivas ut. Detta görs med hjälp av funktionen print.
Prova nu att köra koden
s=3+5
print(s)
i rutan nedan. Prova även vad som händer ifall du suddar ut print(s)
s = 8
print(s)
Eftersom = betyder tilldelning så innebär det att uttryck som x=x+1 inte betyder att man försöker lösa ekvationen $x=x+1$ (som saknar lösning), utan att man:
x (detta förutsätter givetvis att ett värde finns för variabeln x).1 till detta värde.x (och skriver över det gamla värdet).Prova att köra koden
x = 4
print(x)
x = x + 1
print(x)
i rutan nedan.
print(s)
Man kan också använda värdet på andra variabler för att tilldela värden på nya variabler. Testa t.ex. följande:
s = 4
w = 2
print(s)
print(w)
t = 2*s - w + 1
print(t)
som låter variabeln s ha värdet 4, w ha värdet 2 och t ha värdet 2*s - w + 1, dvs. 2*4 - 2 + 1 som är 7
Det är mycket viktigt att inte missa skriva ut några symboler, t.ex. gångertecknet * vid multiplikation. Man kan alltså inte skriva t = 2s - w + 1, det blir fel.
Notera också att det är mycket viktigt att variabeln står på vänster sida och uttrycket på höger sida om likhetstecknet.
Pröva att istället ge kommandot 2 * s - w + 1 = t i ovanstående kommandoruta och se vilket felmeddelande du får.
En variabels namn behöver inte bara bestå av ett ensamt tecken, utan kan vara ett ord, eller en kombination av tecken.
Ett variabelnamn får endast innehålla alfanumeriska tecken samt understreck (dvs. a-z, A-Z, 0-9, och _ ) och dess första tecken måste vara en bokstav eller ett understreck (ett variabelnamns första tecken får alltså inte vara en siffra).
Python skiljer på små och stora bokstäver (gemener och versaler) så summa, Summa och SUMMA är tre olika variabler.
Prova att köra följande kod i rutan nedan
summa = 3
_summa = 4
Summa = 5
SUMMA = 6
SUMMA12_34 = 12/34
print(summa)
print(_summa)
print(Summa)
print(SUMMA)
print(SUMMA12_34)
Prova gärna med något otillåtet efteråt, t.ex. 1Summa=34.
I senare versioner av Python tillåts åäö samt ÅÄÖ i variabelnamn. Testa gärna även det nedan.
variabeln_kan_vara_hur_lång_som_helst = 7
print(variabeln_kan_vara_hur_lång_som_helst)
Det är olämpligt att ge ett namn till en variabel som är samma som något redan inbyggt kommando (eller funktion) i Python. Exempelvis finns redan kommandot sum i Python, så det hade varit olämpligt att använda det som variabelnamn ovan (vi skall återkomma till kommandot sum längre fram).
Vissa andra namn är otillåtna, exempelvis for, eftersom det används till någonting annat (som kommer till längre fram). Det är kanske svårt att veta vilka namn som är olämpliga, men det kommer att framgå med tiden.
För att få en lista över skyddade ord i Python kan du köra help("keywords") i rutan nedan (dessa kan du inte använda som variabelnamn). Ifall du vill få en lista över inbyggda namn i Python kan du köra dir(__builtins__) i rutan nedan (dessa är olämpliga att använda som variabelnamn).
help("keywords")
Det gäller att göra lämpliga avvägningar när man väljer sina variabelnamn. Om det är för långt så kan det också bli svårt att följa beräkningarna.
Antag t.ex. att vi vill beräkna arean av en cirkel med radie 7 genom att först införa en variabel för cirkelns radie och därefter beräkna cirkelns area. Det skulle t.ex. kunna se ut så här:
pi = 3.14
radie = 7
area = pi * (radie ** 2)
men det blir lite onödigt långt och otydligt om man istället gör på följande vis:
pi_värdet = 3.14
radien_av_Cirkeln = 7
arean_av_Cirkeln = pi_värdet * (radien_av_Cirkeln ** 2)
Notera dock att detta helt beror på projektet man arbetar med och att inga exakta regler kan ges här.
Notera att vi i exemplet ovan angav värdet på $\pi$ genom att skriva pi = 3.14. För att slippa skriva detta i varje program (och för att få ett exaktare värde) så kan vi importera en modul som bland annat innehåller detta värde.
Detta görs genom att skriva import math varefter vi kan skriva math.pi för att få ut en apprixmation av $\pi$ (math.pi ger oss värdet 3.141592653589793 när vi arbetar med dubbel precision).
Kör följande i rutan nedan:
import math
print(math.pi)
math.sin(math.pi/2)
Importkommandot brukar skrivas högst upp i koden, så att det tydligt framgår vilka moduler koden kräver.
När modulen är importerad "utökas vår verktygslåda" och vi har fler funktioner och kommandon som kan användas i koden.
Ifall vi inte vill skriva math. varje gång vi använder $\pi$ i vår kod så kan vi spara värdet från math.pi i en lokal variabel.
Prova att köra följande kodstycke i rutan nedan:
import math
pi = math.pi
radie = 7
omkrets = 2 * radie * pi
area = pi * (radie ** 2)
print(omkrets)
print(area)
När en variabel tilldelas ett värde avgör Python vilken typ variabeln ska anta. Vanliga typer är int (heltal) och float (flyttal), men det finns fler.
Vi skall här inte gå in i detalj på vad ett flyttal är eller vad en datatyp är utan nöjer oss med att tänka på ett flyttal som ett decimaltal med ändlig decimalutveckling. Av naturliga skäl finns det ju ingen möjlighet för datorn att lagra oändligt antal siffror (allt är ändligt i datorns värld) så vi får nöja oss med en approximation. Talen sparas med ca. 15 värdesiffror (beroende på hur stort eller litet talet är).
Funktionen type anger vilken typ variabeln har. Vilken typ en variabel påverkar bland annat hur den hanteras av funktioner.
Prova att köra detta i rutan nedan:
x = 3
print(type(x))
x = 8/7
print(type(x))
Det är viktigt att komma ihåg att man arbetar med tal med ett begränsat antal decimaler. De avrundningsfel som blir när man representerar tal med ändliga approximationer är något man många gånger måste ta hänsyn till. Små fel kan accumuleras och bli ganska stora om man inte är försiktig.
Pröva t.ex. följande kommando
print(2.01-2)
print(2.1-2)
print(2.0000000000000001-2)
Vi kommer dock inte bekymra oss så mycket om avrundningsfel i denna kurs. Det lämnar vi för framtiden.
En annan sak som kan vara bra att känna till är hur Python presenterar flyttal i vissa sammanhang. Ifall vi beräknar 1.7/3000000 så skriver Python ut 5.666666666666666e-07, vilket är talet angivet på grundpotensformen $m\cdot10^n$ (s.k. Scientific notation). Här anges först värdet på $m$ därefter bokstaven e och sist värdet på
exponenten $n$ (inklusive dess tecken). T.ex. betyder 5.666666666666666e-07 talet $5.666666666666666\cdot10^{-7}$.
Du kan själv tilldela variabler värden på denna form, prova att köra följande i rutan nedan (gissa först vad det blir).
v = 3.27e+2
print(v)
Python går också utmärkt att använda som en avancerad räknedosa. Utöver de aritmetiska operationer vi redan räknat på ovan så finns alla elementära funktioner tillgängliga i modulen math.
För att se hur man anger de olika funktionerna kan man köra kommandot help(math) efter att ha importerat modulen. Prova nu att importera modulen math och köra help(math) för att se hur man skriver olika elementära funktioner. Kommandot help är mycket användbart och kan användas så fort du undrar hur en viss funktion eller ett paket fungerar. Du kan exempelvis köra help(math.cos) för att få hjälp om hur just cosinusfunktionen används.
För att exempelvis beräkna $\ln 3+e^2+\sqrt{7^2}+\arctan 2$ skrivs math.log(3)+math.exp(2)+math.sqrt(7**2)+math.atan(2).
Notera att den naturliga logaritmen $\ln$ heter log samt att man använder exp(x) för $e^x$. Det går dock att skriva math.e**x också.
Man måste ange parenteser när man använder dessa funktioner. Man kan inte skriva log 3 för $\ln 3$.
Prova själv att skriva in följande matematiska uttryck i rutan nedan (ett i taget) och se att du får rätt output. Använd hjälptexten från help ovan för att lista ut hur du ska skriva.
| Uttryck | Ska ge output |
|---|---|
| $\sin 90^\circ$ | 1.0 |
| $\log_{10} 200$ | 2.3010299956639813 |
| $\frac{\tan 3 + \ln (e+1)}{\cos 4.6 + \sqrt{2}}$ | 0.8991246282476245 |
När man kör ett program med flera kommandon så är det viktigt att förstå att ordningen i vilket kommandona skrivs har betydelse. Python utför kommandon på samma sätt som man läser en bok dvs. från vänster till höger, samt uppifrån och ner.
Detta innebär att endast ett av kodstyckena nedan kan köras utan fel, kan du gissa vilket? Och kan du gissa vilka värden $m$ och $n$ får när den korrekta koden körs?
Alternativ 1:
n=m+1
m=3
m=n+m
Alternativ 2:
m=3
n=m+1
m=n+m
Man kan även köra flera kommandon på samma rad genom att skilja dem åt med semikolon (;). Exempelvis går det bra att skriva:
a=2; b=4; c=5
print(a+c-b)
Ha dock alltid läsbarheten i åtanke när du gör något sådant.
Låt oss nu ge exempel på ett program som har lite tydligare koppling till verkligheten. Antag att vi vill beräkna centripetalkraften som påverkar en bil som kör i en rondell, då bilens massa är 2750 kg, rondellens radie är 20 meter och bilen åker i 50 km/h. Innan vi börjar med vårt program måste vi erinra oss formeln för att beräkna centripetalkraften utifrån givna storheter dvs. $$F = m\cdot \frac{v^2}{r}$$ Naturligtvis skulle man bara kunna sätta in alla givna värden i denna formel och beräkna svaret i ett enda uttryck, men vi tänker oss nu att man vill skriva ett program där man enkelt och tydligt kan göra nya beräkningar med andra värden utan att behöva förstå vad talen i formeln representerar (om några veckor när vi kanske vill göra en liknande beräkning har vi säkert glömt bort vad alla talen i formeln står för). Det skulle då kunna se ut så här:
massa=2750;
hast=50;
radie=20;
hast_ms=hast*1000/(60*60);
F = massa * (hast_ms ** 2) / radie
Variabeln hast_ms ger bilens hastighet i meter per sekund, så faktorn 1000/(60*60) omvandlar bilens hastighet från km/h till m/s.
Skriv nu själv ett program i nedanstående kommandoruta som steg för steg beräknar volymen av en cirkulär cylinder med basradien 3 och höjden 7. Det är inte resultatet som är det viktiga här. Försök dela upp problemet i mindre steg och inför variabler med lämpliga variabelnamn för de storheter som är relevanta.
Även om vi kunde skriva lite enkla program i kommandorutorna i Jupyter Notebook så sparar man normalt sin kod i scriptfiler med filändelse ".py".
I detta avsnitt skall vi se hur man skapar en scriptfil och hur man kör ett enkelt program. Detta är något vi skall jobbba mycket mer med senare i kursen.
Du behöver en editor för att skriva din kod i. Ett bra och enkelt alternativ är VSCode, men det finns väldigt många fler (många kända programmerare använder exempelvis Vim och Emacs). Du kan för tillfället använda windows notepad dock.
Kopiera nu koden
massa=2750;
hast=50;
radie=20;
hast_ms=hast*1000/(60*60);
F = massa * (hast_ms ** 2) / radie
print(F)
och klistra in i din editor. Spara filen med namnet script1.py och se till att den ligger i samma mapp som denna Jupyter Notebook-fil.
För att köra filen i Jupyter notebook så skriver du %run script1.py i en kommandoruta. Prova att göra det nedan.
Vi har tidigare pratat om att det är viktigt med bra namn på de variabler man använder. Ett annat sätt att göra det tydligt vad som händer i programmet (både för dig själv och för andra som kan komma att läsa ditt program) är att skriva s.k. kommentarer. Man kan var som helt i en scriptfil skriva förklarande text (dvs. en kommentar) om man först i texten har ett nummertecken #. Python kommer inte utföra något av det som står (på samma rad) efter ett sådant tecken.
Exempel
# Vi beräknar kraften m.h.a. F = m * v^2/r
massa=2750;
hast=50;
radie=20;
hast_ms=hast*1000/(60*60); # Vi omvandlar från km/h till m/s
F = massa * (hast_ms ** 2) / radie
print(F)
Prova att lägga till kommentarer i ditt script och spara det igen, samt kör det i rutan ovan för att se att kommentarerna inte påverkar körningen.
Ifall du vill köra filen direkt utan att använda dig av Jupyter Notebook så kan du köra den via en kommandoprompt (eller terminal).
I Windows kan du t.ex. använda PowerShell och i Linux kan du använda xterm, gnome-terminal eller liknande (beroende på vad du har installerat).
Du måste dock veta var din fil befinner sig i filhierarkin, vilket kan vara lite lurigt. Du ser detta lättast i Windows genom att öppna Utforskaren och leta upp filen där. När du befinner dig i mappen i vilken filen ligger trycker Alt + L. Adressfältet högst upp ändras nu filens plats står som en textsträng. Du kan nu kopiera filens plats med Ctrl+C.
Öppna sedan din kommandoprompt och skriv python följt med filens plats, t.ex.
python "C:\Användare\damiano\Programmeringsfiler\script1.py"