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: startbild

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 skriva exit(), 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".

Skapa ny notebook i Jupyter

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.

Jupyter med kommandon

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.

Jupyter med kommandon som körts flera 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.5Först upphöjt, sedan minus
(-1)**0.5Först minus, sedan upphöjt

Lärdomar

  1. 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 är int respektive float.
  2. Om minst den ena operanden i en operation är av flyttalstyp så blir resultatet av flyttalstyp.
  3. Om båda operanderna är av heltalstyp bli resultatet av heltalstyp förutom för division (/) som alltid ger resultat av flyttalstyp.
  4. Det är viktigt att veta i vilken ordning operationer utförs!
  5. Datorer räknar inte alltid helt rätt! I Python är heltalsräkningen exakt medan räkning med flyttal kan ge avrundningsfel.
  6. Det finns uppenbarligen en begränsning på hur stora flyttal som kan bli. Heltalen verkar inte ha samma begränsning.
  7. 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!
  1. Hur många sekunder går det på ett år? Svar
    Skriv:
    >>> 365*24*60*60
    
    som ger 31536000
  2. 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?
    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:

  1. Variabler skapas genom att man ger dem ett värde i en tilldelningssats: variabel = uttryck. I Python har således variabler alltid värden.
  2. Därefter kan variabeln användas i uttryck i stället för värdet.
  3. Variabler kan ges nya värden med nya tilldelningssatser.
  4. 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 och Page är olika namn!
  5. 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.

  6. 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 och number_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.

(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å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

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:

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'
En f-sträng kan alltså innehålla ett variabeln inom {}. 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:

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.
UttryckVärdeKommentar
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.

Exempel:
UttryckVärdeKommentar
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')12Sträng till heltal
int(12.8)12Flyttal till heltal. Decimaler trunkeras!
float('12.8')12.8Strä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

  1. 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? Svar
    int(x + 0.5)    (förutsätter att x ≥ 0)
    Det finns också en funktion round som gör detta fast den inte nämnts tidigare.
  2. 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.
  3. Vilka aritmetiska operatorer har du sett under denna lektion? Svar
    +, -, *, /, //, %, **,
    +=, -=, *=, /=, %=
  4. 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.
  5. Vilka regler gäller det 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: Uttrycket
       float(1//2 + int(3/2 + 2))
    
    har värdet 3.0
  6. 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.
  7. Vad är en variabel och vilka egenskaper har den? Svar
    En variabel har namn och värde.
    Värdet kan ändras med tilldelningsoperatorn (=).
  8. Vilka typkonverteringar kan ske automatiskt? Svar
    Från int till float
  9. Hur gör man explicita tykonverteringar? Svar
    Genom att använda funktionerna int, float och str.
    Exempel:
      x = int(10*math.sin(z))
      ans = 'Svaret är ' + str(x)
     
  10. 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 bli 17 å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
    f'{x//12} år och {x%12} månader'
    

Gå till nästa lektion.

Valid CSS!