Föreläsning 1: Python!
- Kursen och formalia
- Python
- Jämförelse med Java
- Idealviktsalgoritmen
- Skottårsalgoritmen
- Listor
-
for
och while
- Objektorienterad programmering i Python
Kursen och formalia
Ettans javaprogrammeringskurs Programkonstruktion följs nu av en
datalogisk del som gäller för alla programspråk. På föreläsningarna
används språket Python, eftersom algoritmerna framstår tydligare
utan Javas komplicerade överbyggnad. Den som föredrar att göra
labbarna i något annat språk får göra det.
Datalogikurser världen över är mycket lika varandra. Innehållet är
i huvudsak det här.
- Abstraktion
- Datastrukturer
- Algoritmer
Därför finns många likvärdiga läroböcker och många användbara
webbplatser. Föreläsningsanteckningarna ska dock täcka kursen bra.
Läs kurs-PM! Innehåller all info.
Python
Python är ett tio år gammalt språk som har blivit mycket populärt
tack vare sin enkelhet. Det påminner mycket om Matlab genom att
vara interaktivt. Kommandot
python
kör igång ett system
som direktexekverar pythonrader.
>>> 17*666+4711
16033
>>> utrop="Aj"
>>> utrop*9
'AjAjAjAjAjAjAjAjAj'
Jämförelse med Java
Om man i ett javaprogram stryker allt
"onödigt" - huvuden, deklaration, måsvingar, semikolon osv - blir
det som står kvar ungefär motsvarande pythonprogram.
Som exempel tar vi ett javaprogram som räknar om grader till radianer.
//Detta är filen Radianer.java
import java.io.*;
class Radianer {
public static void main(String[] args){
BufferedReader in = new BufferedReader(
new InputStreamReader(System.in));
System.out.print("Antal grader: ");
try {
String rad = in.readLine();
int grader = Integer.parseInt(rad);
double radianer = grader*Math.PI/180;
System.out.println(radianer+" radianer");
}
catch(Exception e){
System.err.println("Inget heltal!");
}
}
}
Och här har vi motsvarande pythonprogram.
"Detta är filen radianer.py"
from math import pi
grader=input("Antal grader:")
radianer=grader*pi/180
print radianer,"radianer"
Pythonprogrammet körs med
python radianer.py
. Det
behövs ingen separat kompilering motsvarande
javac Radianer.java
.
Java använder klasser även när programmet inte skapar några objekt,
men i Python definierar man en klass bara när man tänker skapa objekt.
Det tas upp nästa vecka.
Idealviktsalgoritmen
Eftersom algoritmer är kursens tema ska vi börja med en enkel sådan.
----------------------------------------------
ALGORITM FÖR IDEALVIKT: idealvikt = längd - 110
----------------------------------------------
Vi vill ha ett program som fungerar enligt följande.
Din längd (cm):183
Din vikt (kg):75
Banta 2 kg!
Det ger oss anledning att skriva en if-sats i Python. Kommentarer
går från brädhögstecknet till radens slut
"Detta är filen banta.py" #Dokumentationstext (frivillig)
langd=input("Din längd (cm):") #Inga åäö i variabelnamn
idealet=langd-110
vikt=input("Din vikt (kg):")
if vikt>idealet: #Kolon efter if,while,for,def
print "Banta",vikt-idealet,"kg!" #Indragna rader fixar Emacs
elif vikt<idealet: #Else-if skrivs elif
print "Lägg på dej",idealet-vikt,"kg!"
else: #Även kolon efter else
print "Du har idealvikt!"
Själva algoritmen kan uppfattas som en funktion från längder
till vikter, och den funktionen kan vi skriva så här.
def idealvikt(langd):
return langd-110
Om funktionen definieras i samma fil kan den anropas så här.
idealet=idealvikt(langd)
Om funktionen finns i en egen fil
formler.py
måste den importeras.
"Detta är fortfarande filen banta.py"
from formler import idealvikt #from formler import * går också
langd=input("Din längd (cm):")
idealet=idealvikt(langd)
- - -
Skottårsalgoritmen
------------------------------------------------------------
ALGORITM FÖR SKOTTÅR:
Om årtalet är delbart med fyra är det oftast skottår.
För årtal som slutar på 00 måste dock även seklet vara delbart med fyra.
------------------------------------------------------------
Vi vill ha en funktion från årtal till dagantal och den kan få finnas
i filen
year.py
"Nyttiga funktioner av årtalet"
def days(year):
"Kollar skottår" #Dokumentationstext får finnas här
if year%4!=0: #y%4 är resten när y delas med fyra
return 365 #Vanliga ickeskottår
if year%100!=0: #Vanliga skottår
return 366
if (year%400)==0: #År av typen 2000
return 366
return 365 #År av typen 1900
Om vi i huvudprogrammet vill tabellera funktionen behövs en for-slinga.
"Tabellerar dagantalet för åren 1900...2000"
from year import days
for year in range(1900,2001): #Övre gränsen kommer inte med
print year,days(year) #1900 365 (det blir en snygg tabell)
Listor
Om slingan ovan ska starta från noll räcker
range(2001)
,
om den ska hoppa fram med steget fem skrivs det
range(1900,2001,5)
.
Men man kan också genomlöpa vilken
lista som helst:
for x in [17,666,4711]: print x*x
for y in "rdtls": print y+"imma" # en sträng är en lista av tecken
Listor går även att använda till att lagra information
väldigt enkelt. De funkar ungefär som javas vektorer:
l=[1, 2, "tillåtna hjälpmedel: algoritmbok och formelblad",
88, "plugga varje da"]
l[0]=5
print l[1] # -> 2
print l[0] # -> 5
print l[2][0:3]+l[4][-2:] # -> ?
for
och while
for
och
while
är väldigt lika sina motsvarigheter
i java.
for
går igenom en lista och antar alla värden i den.
while
upprepar något så länge ett villkor är sant.
for i in range(5):
print "*",
print
i=0
while i<5:
print "*",
i=i+1
print
Låt oss skapa en funktion som ritar en asteriskrad
av längd
langd
:
def ritaasteriskrad(langd):
for i in range(langd):
print "*",
print
Vad blir resultatet av följande kodsnutt?
for i in range(7):
ritaasteriskrad(i)
print
Objektorienterad programmering i Python
Rektangel
En klass som beskriver rektanglar:
class Rektangel:
bredd=0
hojd=0
def rita(self):
for i in range(self.hojd):
ritaasteriskrad(self.bredd)
def area(self):
return self.bredd * self.hojd
Med hjälp av en klass kan man konstruera objekt/instanser:
r=Rektangel() # ett nytt objekt som variablen r håller reda på
r.bredd=6 # sätter instansvariablerna till de värden vi vill
r.hojd=3
r.rita() # kör instansfunktionen rita() - vad händer?
print r.area() # skriver ut resultatet av instansfunktionen area()
Gör vi en till instans fungerar de på samma sätt, men är helt oberoende:
r2=Rektangel() # ett nytt objekt som variablen r2 håller reda på
r2.bredd=2
r2.hojd=4
r.rita() # rita() för objektet som r håller reda på
r2.rita() # rita() för objektet som r2 håller reda på
a=r.area() # area() för r
b=r2.area() # area() för r2
print a+b