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: | < 1 timme. |
Redovisning: | Ingen obligatorisk men diskutera oklarheter med lärare/labbhandledare. |
Komma igång
Python finns installerat på institutionens Linuxdatorer.
Om du har en Mac eller en Linuxdator finns antagligen Python redan installerat men troligen med en gammal version. För att installera på Windows gå till Corey Schaffers första lektion på Youtube (eller läs om Anaconda, där en modern Pythonversion följer med, nedan).
(Anmärkning: I Mac-delen av ovanstående video talas om en fil med namnet .bash_profile
.) Det kan hända att den heter .profile
på
din dator.)
Därefter:
Starta Python genom att skriva python3
i ett kommandofönster.
Då ska det se ut ungefär så här:
Efter promptern (d.v.s. tecknen >>>
) går det bra att skriva Python-kommandon.
Tips: Det går bra att ta tillbaka, redigera och göra om det man skrivit tidigare med hjälp av pilarna på tangentbordet.
Anmärkning:
Ovanstående gäller på institutionens Linux-datorer.
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.
Vi rekommenderar starkt att du använder Python 3 i denna kurs.
Avsluta
För att komma ur programmet kan man skrivaexit()
, quit()
eller, enklast,
ctrl-D
.
ipython och Anaconda
Kommandot python
är inbyggt i alla Pythoninstallationer. Det är samtidigt ganska "primitivt".
Exempelvis markeras inte olika syntaktiska element med olika färger och andra små hjälpsamheter som
inte krävs för att skriva Pythonkod, men som kan underlätta.
På institutionens Linuxdatorer finns redan ipython ("An enhanced Interactive Python") också installerat.
Du öppnar den genom att skriva ipython3
. Testa att skriva pr och tryk på Tabb (som i print
, som vi kommer att använda
senare). Du kan avsluta ipython
på samma sätt som python
.
Om du vill ha tillgång till ipython och andra verktyg på en annan dator finns det flera sätt. Om du redan har Python installerat kan det hända
att kommandot pip3 install ipython
fungerar. För att underlätta finns det färdiga distributioner med många vanliga paket för
plottning, hantering av olika filformat, dataanalys o.s.v. En sådan är Anaconda, med färdiga
installationsprogram för Winndows, Mac och Linux.
Ett systerprojekt till ipython är Jupyter, där man ger sina kommandon i en webbläsare i stället för ett terminalfönster. Man kan skriva
textförklaringar (t.ex. svar på uppgiftsfrågor) varvat med kod och spara i en Jupyter Notebook. Det är viktigt att komma ihåg att en notebook
lagrar koden och det som skrevs ut, men inte själva det körandet programmet.
Testa att skriva jupyter notebook
på en dator i datorsal. Strunta i frågor om keyring om de kommer upp. När webbläsaren visas
väljer du "New", "Python 3".
När man har skrivit kod i en cell, en eller flera rader, trycker man på Skift+Enter för att köra den. Omedelbart under visas då resultatet.
Man kan köra samma cell flera gånger. I exemplet nedan har vi kört cell 2 och 3 en gång till. Då får variabeln x värdet 3, eftersom den först sattes till 1 och vi sedan har kört en cell som ökar värdet med 1 två gånger.
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. 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·102 + 1·104 + 2.5·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 och flyttal med decimaldel.
Man säger att heltal och flyttal är olika datatyper. Namnen på dessa två typer ärint
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 som kan bli. Heltalen verkar inte ha samma begränsning.
- Det sista exemplet visar att Python kan hantera komplexa tal. Det kommer vi dock inte utnyttja i denna kurs.
Övningar
Använd Python-satser för lösa nedanstående uppgifter!-
Hur många sekunder går det på ett år?
Skriv:
>>> 365*24*60*60
som ger31536000
-
Antag att du tänker mycket långsiktigt och sätter in 1 kr på konto nu och att du får 2 procents årlig ränta.
Vad blir kapitalet med ränta på ränta om 2000 år?
Skriv:>>> 1.02**2000
som ger1.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:
Prova! |
---|
i = 2 |
x = 4.5 |
y = i*x |
y = i*y |
x = i + 2 |
Tag reda på variablernas värde genom att skriva namnen ett på varje rad efter promptern.
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 få alla variablers värden t.ex. genom att skriva print(i, x, y)
.
Prova! |
---|
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
.
++
och --
.
Dessa finns inte i Python! Det är extra lurigt eftersom det inte är säkert att man får någon diagnos 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 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
Prova! |
---|
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.
Antagligen 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
math.
-prefixet vid anropen.
Om man ska använda många olika funktioner så kan man i stället skriva importsatsen så här:
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 ("strängkonstanter") 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 naturligtvis tilldelas en annan sträng.
-
Operatorn
+
används för att sätta ihop (konkatenera) strängar.
Exempel:
Prova! | Kommentar |
---|---|
name = 'Kalle' family_name = 'Andersson' age = '12' | |
full_name = name + " " + family_name | Konkatenering |
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 givna kommando 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 det 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änd 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 i tabellen ovan kan vi skriva som i tabellen nedan:
Prova! | Kommentar |
---|---|
name = 'Kalle' family_name = 'Andersson' age = 12 |
Nu som int |
full_name = f'{name} {family_name}' | |
f'{full_name} är {age} år' |
{}
.
När värdet av strängen beräknas ersätts {}
-uttrycket av variabelns värde.
Det blir är 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:
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 n = [2, 3, x, x*x] | [2, 3, 4, 16] |
En lista med heltal |
n[0] + n[3] | 18 | Första plus sista elementet |
n[1] = n[2] + 3 n | [2, 7, 4, 16] | Element kan tilldelas nya värden |
n.append(25) n | [2, 7, 4, 16, 25] |
Element kan läggas till på slutet. Observera syntaxen! |
len(n) | 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 ett mycket kraftfullt begrepp 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.
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:
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
rundat till närmaste heltal?int(x + 0.5)
(förutsätter attx
≥ 0)
Det finns också en funktionround
som gör detta fast den inte nämnts tidigare. -
Vilka datatyper har du sett under denna lektion?
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?
+, -, *, /, //, %, **,
+=, -=, *=, /=, %= -
Vad är det för skillnad mellan heltals- och flyttalsaritmetik?
Heltal representeras exakt och heltalsaritmetiken ger exakta resultat.
Flyttalen kan inte alltid representeras exakt och aritmetiken kan ge avrundningsfel. -
Vilka regler gäller det när man blandar heltal och flyttal i samma uttryck?
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?Ett antal matematiska funktioner somsin
,cos
,exp
,log
....
För att använda dessa måste modulen importeras. -
Vad är en variabel och vilka egenskaper har den?
En variabel har namn och värde.
Värdet kan ändras med tilldelningsoperatorn (=
). -
Vilka typkonverteringar kan ske automatiskt?
Från
int
tillfloat
-
Hur gör man explicita tykonverteringar?
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. Ignorera skottår!
Exempel: Om x är satt till 208 så ska utskriften bli17 år och 4 mån
.
Prova med olika värden påx
!x = 208 str(x//12) + ' år och ' + str(x%12) + ' månader'
ellerprint(x//12, ' år och ', x%12, ' månader')
eller, med en f-strängf'{x//12} år och {x%12} månader'
Gå till nästa lektion.