Lektion 1: Grundläggande Python#
Syfte: Introducera grundläggande element i Python-språket.
Viktiga begrepp: Tal, strängar, listor, variabler. Datatyper.
Arbetsform: Arbeta gärna tillsammans med någon men skriv alltid egen kod! Diskutera med varandra!
Uppskattad arbetstid: 2 timmar.
Redovisning: Ingen obligatorisk, men diskutera oklarheter med lärare/labbhandledare.
Komma igång#
Python finns installerat på datorerna i datorsalarna.
Om du vill använda din egen dator är det lättast att installera
Anaconda för att komma igång. Med Anaconda följer en Python-installation med diverse paket som vi kommer använda senare (t.ex. Matplotlib
).
Efter att du installerat Anaconda startar du på Windows programmet
Anaconda Prompt
och på mac eller linux programmet Terminal.
Därefter kan du starta Python genom att skriva python3
i kommandofönstret. Då ska det
se ut ungefär så här:
Anmärkning: Det kan hända att du ska skriva bara python
på din
dator. Det är dock viktigt att du ser till att det är Python 3.6 eller
högre som startas och inte Python 2.
Efter promptern (d.v.s. tecknen >>>
) går det att skriva
Python-kommandon.
Avsluta#
För att komma ur programmet kan man skriva exit()
, quit()
eller,
enklast, ctrl-D
.
Aritmetiska uttryck#
Tal skrivs som vanligt (med eller utan decimalpunkt).
Aritmetiska operatorer: +
, -
, *
, /
, //
, %
och **
.
De fyra första har sin vanliga betydelse.
Operatorn
//
står för heltalsdivision d.v.s. eventuella decimaler stryks.Operatorn
%
ger resten vid heltalsdivision.Operatorn
**
står för upphöjt till.
Testa detta genom att skriva några beräkningsuttryck efter >>>
. Prova
bl.a. följande:
Prova detta! |
Kommentar |
---|---|
4 + 3*5 - 2*2
|
Vanlig beräkningsordning d.v.s. * och / före + och - |
4 + 3*(5-2)*2
|
Kan ändras med parenteser |
4+2+1
|
|
4+2+1.
|
Samma värde som ovan men med decimaldel utsatt |
5/2
|
Värde med decimaldel |
5//2
|
Heltalsdivision |
-5//2
|
Heltalsdivision |
-(5//2)
|
Annat resultat än ovan! |
37 % 10
|
Procent-tecknet är rest-operator |
1234567//1000 % 10
|
Fjärde siffran från slutet |
1/0
|
|
3e2 + 1e4 + 2.5e-2
|
\(3 \cdot 10^2 + 1 \cdot 10^4 + 2.5 \cdot 10^{-2}\) |
3*10**2 + 10**4 + 2.5*10**-2
|
Samma värde men klumpigare |
0.1*0.1
|
Antagligen inte alldeles rätt… |
10**1000
|
|
10.**1000
|
|
-1**0.5
|
Först upphöjt, sedan minus |
(-1)**0.5
|
Först minus, sedan upphöjt |
Lärdomar#
Det finns två typer av tal i Python (liksom i de flesta andra programmeringsspråk): heltal och så kallade flyttal. Heltal skrivs utan decimaldel och flyttal med decimaldel. Man säger att heltal och flyttal är olika datatyper. Namnen på dessa två typer är
int
respektivefloat
.Om minst den ena operanden i en operation är av flyttalstyp så blir resultatet av flyttalstyp.
Om båda operanderna är av heltalstyp bli resultatet av heltalstyp förutom för division (
/
) som alltid ger resultat av flyttalstyp.Det är viktigt att veta i vilken ordning operationer utförs!
Datorer räknar inte alltid helt rätt! I Python är heltalsräkningen exakt medan räkning med flyttal kan ge avrundningsfel.
Det finns uppenbarligen en begränsning på hur stora flyttal kan bli. Heltalen verkar inte ha samma begränsning. (Se exemplen med
10**1000
respektive10.**1000
.)Det sista exemplet visar att Python kan hantera komplexa tal. Det kommer vi dock inte utnyttja i denna kurs.
Tips#
Det går bra att ta tillbaka, redigera och göra om det man skrivit tidigare med hjälp av pilarna på tangentbordet. Börja med att trycka på uppåtpilen.
Övningar#
Använd Python-satser för lösa nedanstående uppgifter!
Hur många sekunder går det på ett år?
Svar
Skriv:
>>> 365*24*60*60
som ger 31536000
Antag att du tänker mycket långsiktigt och sätter in 1 kr på ett konto som ger 2 procents årlig ränta. Vad blir kapitalet med ränta på ränta om 2000 år?
Svar
Skriv:
>>> 1.02**2000
som ger 1.586147327603768e+17 kronor.
Variabler och tilldelningar#
En variabel är en namngiven storhet som kan ha ett värde. I Python gäller:
Variabler skapas genom att man ger dem ett värde i en tilldelningssats:
variabel = uttryck
. I Python har således variabler alltid värden.Därefter kan variabeln användas i uttryck i stället för värdet.
Variabler kan ges nya värden med nya tilldelningssatser.
Variabelnamn kan innehålla bokstäver, siffror och understrykningstecknet (
_
). Första tecknet får inte vara en siffra. Python skiljer mellan små och stora bokstäver så att t.ex.page
ochPage
är olika namn!Från och med Python 3 är det tillåtet att använda nationella bokstäver (t.ex. â, å, å, ö, ç, é, è, ï, …) men det gör programmen svårlästa och ännu svårare att underhålla så vi avråder från det.
Variabelnamn som börjar med understrykningstecknet (
_
) har en speciell betydelse i vissa sammanhang.I våra små exempel använder vi ofta väldigt korta variabelnamn. När man skriver riktiga program är det viktigt att använda namn som anger vad variabeln används till. Exempel på beskrivande namn:
weekday
,lines_per_page
ochnumber_of_convolutions
.Observera att etablerad stil i Python är att använda tecknet
_
mellan ord inom samma variabelnamn för att öka läsbarheten.
Prova i tur och ordning:
>>> i = 2
>>> x = 4.5
>>> y = i*x
>>> y = i*y
>>> x = i + 2
Du kan ta reda på en variabels värde genom att skriva dess namn efter promptern och trycka return.
Variabeln i
har ett värde av heltalstyp och y
har ett värde av
flyttalstyp medan x
först får ett värde av flyttalstyp och sedan ett
nytt värde av heltalstyp.
Man kan visa flera variablers värden på en gång, t.ex. genom att skriva
print(i, x, y)
.
>>> x = 2
>>> x += 4
>>> x
>>> x *= 2
>>> x
>>> x -= 11
>>> x
>>> x /= 2
>>> x
Uttrycket x += 4
betyder alltså att värdet på x
ska ökas med 4,
d.v.s. uttrycket är ekvivalent med x = x + 4
.
(Anmärkning: Om du har programmerat i språk som t.ex. C, C++ eller
Java så har du kanske använt operatorerna ++
och --
. Dessa finns
inte i Python! Det är extra lurigt eftersom det inte är säkert att man
får något felmeddelande om man råkar använda dem. T.ex. är 3 + ++x
legalt
även i Python men det har en helt annan betydelse! Prova gärna och försök inse
varför det blir som det blir!)
Matematiska funktioner#
Standardpaketet math
innehåller matematiska funktioner. För att få
tillgång till dessa används kommandot import math
Exempel: Beräkna hypotenusan i en rätvinklig triangel:
>>> import math
>>> k1 = 3
>>> k2 = 4
>>> hyp = math.sqrt(k1*k1 + k2*k2)
>>> hyp
Exempel på andra funktioner i math
är sin
, cos
, exp
och log
.
De trigonometriska funktionerna använder radianer och log
avser den
naturliga logaritmen. Andra varianter finns dock.
Kommandot dir(math)
ger en lista på funktioner och konstanter. Prova
kommandot help(math)
som ger lite mer förklaringar. Eventuellt får du
meddelandet Squeezed text
. Dubbelklicka på detta meddelande så får du
se hela texten!
Ännu mer information finns i den officiella dokumentationen!
Modulen math
innehåller också konstanterna pi
och e
som alltså
skrivs som math.pi
och math.e
.
Om man ska använda t.ex. sqrt
på många ställen i koden kan man skriva
from math import sqrt
varefter man inte ska ange math.
-prefixet vid anropen.
Om man ska använda många olika funktioner så kan man i stället skriva importsatsen så här:
from math import *
Då kan man anropa funktionerna direkt utan att skriva math.
framför
varje anrop. Rekommendationen är dock att explicit tala om vilka
funktioner man tänker använda.
Strängar#
Strängar är en annan inbyggd datatyp med följande egenskaper:
En sträng är en följd av noll eller flera tecken (bokstäver, siffror, specialtecken, …).
Strängar omges av citationstecken (exempel: ”Ciao!”) eller apostrofer (exempel ’Han sa ”Ciao!”’). Strängar omgivna av apostrofer kan innehålla citationstecken och tvärt om.
Datatypen för att hantera strängar heter
str
.En sträng kan inte ändras men en strängvariabel kan tilldelas en annan sträng.
Operatorn
+
används för att sätta ihop (konkatenera) strängar.
Exempel:#
Prova följande:
>>> name = 'Kalle'
>>> family_name = 'Andersson'
>>> age = '12'
>>> full_name = name + " " + family_name
>>> full_name + " är " + age + " år"
Sätt age
till 12
(d.v.s. talet 12
, inte strängen '12'
) och prova
den sista raden igen! (Kom ihåg att du kan ta fram tidigare kommandon med
piltangenterna!)
Det fungerade alltså inte. Problemet är att man inte kan blanda typer
hur som helst. Operatorn +
är definierad för både strängar och tal men
med helt olika funktion. När operanderna är av olika typer så vet
inte Python vad som ska göras. Programmeraren måste med
typkonvertering ange hur det ska tolkas.
f-strängar#
Ett, oftast bättre, alternativ till konkatenering av strängar är att använda s.k. f-strängar som introducerades i Python 3.6.
En f-sträng inleds med f'
eller f"
och avslutas som vanliga strängar
med '
respektive "
.
För att få samma resultat som ovan kan vi skriva på följande sätt:
>>> name = 'Kalle'
>>> family_name = 'Andersson'
>>> age = 12
>>> full_name = f'{name} {family_name}'
>>> f'{full_name} är {age} år'
En f-sträng kan alltså innehålla ett variabelnamn inom {}
. När värdet av
strängen beräknas ersätts {}
-uttrycket av variabelns värde. Det blir
kortare att skriva, enklare att läsa och vi slipper skriva explicita
typkonverteringar.
Innehållet i {}
-uttrycket är inte begränsat till att vara variabler
utan kan vara generella uttryck som då kommer att beräknas. Exempel:
f'{x} i kvadrat är {x*x}'
Listor#
En lista består av ett antal värden. Värdena kan vara av olika typ. En lista kan definieras genom att man räknar upp elementen, kommaseparerat, inom [ ]-parenteser. Man använder även [ ]-parenteserna för att nå enskilda element genom dess index. Första elementet har alltid index 0.
Uttryck |
Värde |
Kommentar |
---|---|---|
x = 4
lst = [2, 3, x, x*x]
|
[2, 3, 4, 16] |
En lista med heltal |
lst[0] + lst[3]
|
18 |
Första plus sista elementet |
lst[1] = lst[2] + 3
lst
|
[2, 7, 4, 16] |
Element kan tilldelas nya värden |
lst.append(25)
lst
|
[2, 7, 4, 16, 25] |
Element kan läggas till på slutet. Observera syntaxen! |
len(lst)
|
5 |
Funktionen len ger längden av listan |
['Eva', 'Åke']
|
Lista med strängar |
|
['Eva', 22, 'Åke', 24]
|
Lista med blandade typer |
Observera hur listor kunde utökas med append
! Listor har ett antal
metoder varav append
är en. Metoder används för att hämta
information om eller påverka enskilda objekt. Vi kommer ta upp flera
metoder både för listor och andra datatyper längre fram.
Listor är en mycket kraftfull datatyp i Python, med stora användningsområden.
Typkonverteringar#
För att översätta en typ till en annan skriver man typnamnet (int
,
float
, str
…) följt av det uttryck som man vill konvertera inom
parentes.
Exempel:
Uttryck |
Värde |
Kommentar |
---|---|---|
str(12)
|
’12’ |
Heltal till sträng |
str(-12.5)
|
’-12.5’ |
Flyttal till sträng |
str([1, 2, 3])
|
’[1, 2, 3]’ |
Lista till sträng |
list('abc')
|
[’a’, ’b’, ’c’] |
Sträng till lista |
int('12')
|
12 |
Sträng till heltal |
int(12.8)
|
12 |
Flyttal till heltal. Decimaler trunkeras! |
float('12.8')
|
12.8 |
Sträng till flyttal |
Funktionen str
kan användas på alla typer medan int
och float
kräver att argumentet går att tolka som ett tal. Uttrycket
float('1x42')
kommer alltså att ge en felutskrift.
Konverteringen kan göras var som helst i uttryck. Exempel:
'Svar: ' + str(100*(1//n + int(math.exp(x))))
Frågor och övningar#
Vid omvandling från flyttalstyper till heltalstyper trunkeras värdena, d.v.s. decimalerna stryks. Hur kan man göra om man vill att värdet av
x
avrundas till närmaste heltal?Svar
int(x + 0.5)
(förutsätter attx
≥ 0)
Det finns också en funktionround
som gör detta, men den har vi inte nämnt än.Vilka datatyper har du sett under denna lektion?
Svar
int
för heltal,
float
för flyttal,
str
för strängar och
list
för listor.Vilka aritmetiska operatorer har du sett under denna lektion?
Svar
+, -, *, /, //, %, **, +=, -=, *=, /=, %=
Vad är det för skillnad mellan heltals- och flyttalsaritmetik?
Svar
Heltal representeras exakt och heltalsaritmetiken ger exakta resultat. Flyttalen kan inte alltid representeras exakt och aritmetiken kan ge avrundningsfel.
Vilka regler gäller när man blandar heltal och flyttal i samma uttryck?
Svar
Python behandlar varje enskild operation för sig. Om båda operanderna är av heltalstyp så blir resultatet av heltalstyp. Om den ena är av heltalstyp och den andra av flyttalstyp så konverteras först heltalsoperanden till flyttal och resultatet blir ett flyttal. Resultatet av
/
-operatorn är dock alltid ett flyttal.
Exempel: Uttrycketfloat(1//2 + int(3/2 + 2))
har värdet 3.0
Vad finns i modulen
math
? Hur används den?Svar
Ett antal matematiska funktioner som
sin
,cos
,exp
,log
, …
För att använda dessa måste modulen importeras.Vad är en variabel och vilka egenskaper har den?
Svar
En variabel har namn och värde.
Värdet kan ändras med tilldelningsoperatorn (=
).Vilka typkonverteringar kan ske automatiskt?
Svar
Från
int
tillfloat
Hur gör man explicita typkonverteringar?
Svar
Genom att använda funktionerna
int
,float
ochstr
.
Exempel:x = int(10*math.sin(z)) ans = 'Svaret är ' + str(x)
Sätt en variabel
x
till ett heltalsvärde som står för ett antal månader.
Skriv en rad som skriver ut vad detta blir uttryckt i år och månader.
Exempel: Om x är satt till 208 så ska utskriften bli17 år och 4 mån
.
Prova med olika värden påx
!Svar
x = 208 str(x//12) + ' år och ' + str(x % 12) + ' månader'
eller
print(x//12, ' år och ', x % 12, ' månader')
eller, med en f-sträng
print(f'{x//12} år och {x % 12} månader')