Professional Documents
Culture Documents
DATA110
DATA110
Forelesning 1
Hva er programmering?
Å gi instruksjoner til en datamaskin ved hjelp av et
programmeringsspråk.
Hva er et program?
• Et sett av instruksjoner som en datamaskin vil utføre
• En tekstfil med programkode
Hva er et program?
name = input('Enter file:')
handle = open(name, 'r')
counts = dict()
for line in handle:
words = line.split()
for word in words:
counts[word] = counts.get(word,0)+1
bigcount = None
bigword = None
for word, count in list(counts.items()):
if bigcount is None or count > bigcount:
bigword = word
bigcount = count
print(bigword, bigcount)
Problemløsing
Du må kunne pønske ut hvilke instruksjoner som skal gis for å
oppnå ønsket effekt.
Python 3
• Populært programmeringsspråk
• Lett å komme i gang
• Rikt bibliotek av funksjoner
• Gratis
• python.org
- Nedlasting (IDLE),
- dokumentasjon
- etc:
Python-tolken (IDLE)
Verktøy for å lage programfiler og utføre program
Signatur
Verdiene skrives på skjermen adskilt av skilleteksten med
avslutningsteksten til slutt.
Hvis ikke noe annet er oppgitt vil skilleteksten være et
mellomrom og avslutningen vil være linjeskift.
Formatkoder
Heltall %d
‘%vd’% n Heltallet n skrives på totalt v plasser
>>> '%5d'% 25
' 25'
Kommatall %f
‘%.df’% n Tallet n skrives med d desimalplasser
>>> x=5
>>> print(x)
5
>>> y=7
>>> print(x,'pluss',y,'er lik',x+y)
5 pluss 7 er lik 12
>>> x=10
>>> print(x,'pluss',y,'er lik',x+y)
10 pluss 7 er lik 17
>>> x='hei'
>>> y='sann'
>>> print(x,'pluss',y,'er lik',x+y)
hei pluss sann er lik heisann
Kommentarlinjer
Starter med # og blir ignorert av tolken
n ( n+1 )
Eksempel: 1 + 2 + 3 + ... + n = 2
n=8
print('Summen av tallene fra 1 til', n)
print('1 + ... +',n , ' = ', (n*(n+1))/2)
Syntaktiske feil
Reserverte nøkkelord
False class return is finally
None if for lambda continue
True def from while nonlocal
and del global not with
as elif try or yield
assert else import pass
break except in raise
Syntaksregler
I tilordninger må variabelen stå på
venstre side
Variabelnavn
• Kan bestå av bokstaver, tall og _
• Må starte med en bokstav ( eller _ )
• Store/små bokstaver spiller en rolle
Operatorer
Vi har sett en del operatorer allerede
+ -
* \
< >
Her er noen flere
// Heltallsdivisjon
% Rest etter heltallsdivisjon (modulo)
** Eksponensiering ‘opphøyet i’
<= Mindre eller lik
>= Større eller lik
== Er lik
!= Ulik
Syntaksregel En operator må ha alle sine operander
Eksempler
Eksempel
Program som regner x antall minutter om til timer
og
minutter
x=257 #totalt antall minutter
timer = x//60 #finner antall timer
minutter = x%60 #finner resterende
minutter
print(x,’m =’,timer,’t +’,minutter,’m’)
Operatorpresedens
Uttrykket 2*3+1 er egentlig tvetydig
Presedensregler
Operatoren med høyest presedens regnes ut først
Eksempler PEMDAS
Eksempel
Eksempel
Eksempel
Eksempel
Eksempel
Eksempel
Uttrykk formuleres ved hjelp av:
• Litteraler (aka konstanter)
• Variable
• Operatorer
• (Funksjoner, mer om dette senere)
Litteraler er enkeltstående uttrykk som (nærmest) betegner seg selv.
Eksempler:
• Sifferet 5 betegner tallet fem
• -53 betegner tallet minus femtitre
• Strengen ‘Hei’ betegner teksten satt sammen av bokstavene H,
e og i
• False betegner sannhetsverdien Usann
En variabel x betegner verdien lagret under navnet x.
Uttrykkets ‘anatomi’
Programsetninger
Eksempler:
- max(6,9,...,7) returnerer det største tallet i listen
- print(5) har effekten at 5 skrives ut på skjermen
Vi har allerede sett flere av Pytons innebygde funksjoner.
Innebygde funksjoner
Vi er allerede kjent med disse:
https://docs.python.org/3/library/
https://docs.python.org/3/library/random.html
Betinget utførelse(forelesning 3)
Boole’ske verdier (boolean) [George Boole]
Sammenlikningsoperatorer
> Større enn
< Mindre enn
>= Større eller lik
<= Mindre eller lik
== Likhet
!= Ulikhet
is Identisk
is not Ikke identisk
Boole’sk uttrykk
Uttrykk som evalueres til en sannhetsverdi
True/False
boole’sk operatorer (aka logiskoperatorer /
konnektiver)
Uttrykk Evalueres til
B1 and B2 True når både B1 og
B2 er True
False ellers
B1 or B2 True når B1 eller B2 er
True (eller begge!)
False ellers
not B1 True når B1 er False
False ellers
Betinget utførelse
if-setninger
Blokken utføres kun dersom betingelsen evalueres
til True
Alternativ utførelse
if-else setning
Dersom betingelsen gir True utføres Blokk1 (‘if-
grenen’) ellers utføres Blokk2 (‘else-grenen’).
Forenklet:
Forenklet:
Blokk-struktur
Blokker markeres med innrykk
Alle programsetninger i samme blokk skal ha samme
innrykk
(Konvensjon: 4 blanke)
OBS! Vær nøye med blokk-strukturen
Slurv kan føre til både syntaktisk og semantisk feil
Forebygging av feil-avbrudd
Feil kan føre til havari
Programmet kan beskytte seg mot forutsette feil
Betinget uttrykk
Variant av if til bruk i uttrykk
Verdi1 if betingelse else Verdi2
grunnLønn=2000 #pr. dag
provisjon=0.1
bonus= 0.2
n = int(input('solgte enheter: '))
påslag = n*(provisjon if n<1000 else bonus)
dagslønn = grunnLønn+påslag
print('du tjente', dagslønn, 'i dag')
Funksjoner(forelesning 4)
I matematikk
'...the idealization of how a varying quantity depends on
another quantity.' '... an expression, rule, or law that defines
a relationship between one variable (the independent
variable) and another variable (the dependent variable).
To typer funksjoner:
• Tomme (void) funksjoner har kun effekter og returnerer ikke noe resultat
• Resultat-funksjoner returnerer en resultatverdi og kan ha effekter i tillegg
Et kall
funksjonsnavn(argument1,...,argumentn)
starter en prosess der blokken utføres etter at parameter-variablene er tilordnet tilsvarende
argument-verdier
Eksempel Valuta-omregning
Eksempel Valuta-omregning
Valuta-kalkulatoren opererer med flere funksjoner
• Argument: beløp i norske kroner (NOK)
Funksjonsverdi: beløp i fremmed valuta
• Argument: beløp i fremmed valuta
Funksjonsverdi: beløp i norske kroner
Resultat-funksjoner - return
return V
def norskTilSvensk(beløp):
return beløp*kursSEK
def svenskTilNorsk(beløp):
return beløp/kursSEK
def norskTilDansk(beløp):
return beløp*kursDKK
def danskTilNorsk(beløp):
return beløp/kursDKK
Eksempel
nok=int(input('NOK = '))
sek=norskTilSvensk(nok)
dkk=norskTilDansk(nok)
print('NOK', nok, 'tilsvarer:')
print('- SEK', round(sek,2))
print('- DKK', round(dkk,2))
Erstatt funksjonene:
• svenskTilNorsk(beløp)
• danskTilNorsk(beløp)
• norskTilSvensk(beløp)
• norskTilDansk(beløp)
med disse
• tilNorsk(beløp, valuta)
• fraNorsk(beløp, valuta)
def svenskTilDansk(sek):
nok=tilNorsk(sek,'svensk')
return fraNorsk(nok,'dansk')
beløpSEK=100
dkk=svenskTilDansk(beløpSEK)
print('SEK', beløpSEK,'= DKK',dkk)
…….
Dette inkluderer:
• Funksjonens lokale variable
• Globale variable
• Eventuelle variable i andre omsluttende skop
Navnekonflikter
Når samme variabel-navn brukes på variable med ulike roller.
Løsning
En lokal variabel tar presedens over eventuelle variable med samme navn i andre skop
Gjenbruk av variabelnavn
Identiteten til en variabel bestemmes av både navn og skop
Dvs, en x i et skop er uavhengig av x‘er i andre skop
Oppdatering i omsluttende skop (I) – global
En funksjon står fritt til å lese globale variable, men et forsøk på å oppdatere en
global variabel vil tolkes som et forsøk på å opprette en lokal variabel med
samme navn
global spesifiserer at funksjonen oppdaterer i det globale skopet
None
Verdi som betegner ‘ingen verdi’
Eksempel
def refreng():
def dd():
print('dum og deilig')
def juba(antall):
print('juba '*antall)
def g(x):
y = x*3
return y*z
return g(y)
def h(z):
x=f(z)
return x+y
x=1
y=2
z=3
print(h(x))
Oppdatering i omsluttende skop (II) – nonlocal
En funksjon står fritt til å lese variable i omsluttende skop, men et forsøk på å oppdatere en
ikke-lokal variabel vil tolkes som et forsøk på å opprette en lokal variabel med samme navn
• Intervall – tall-sekvens
range(m, n)
m, m+1, m+2, ... , n-1,
while-setninger
Betingelsen re-evalueres i hver runde og vil typisk involvere variable som endres i blokken .
år=2021
print('Første skuddår etter',år,'er',end=' ')
while not sjekkSkuddÅr(år): år=år+1
print(år)
Eksempel
handleliste=[]
vare=input('Hva vil du kjøpe? ')
while vare!='ingenting':
handleliste=handleliste+[vare]
vare=input('Hva mer vil du kjøpe? ')
print(handleliste)
Eksempel 6*7*8*9*10*11 = ?
Produktet av tallene i et intervall: m* ... *n
def intervallProdukt(m,n):
faktor=m # telle-variabel
produkt=1 # akkumulator-variabel
while faktor<=n:
produkt=produkt*faktor
faktor=faktor+1
return produkt
Uendelige løkker
while betingelse:
Om betingelsen alltid evalueres til True fortsetter iterasjonene til ‘evig tid’ - i praksis til
utførelsen avbrytes:
• av brukeren (tast Ctrl-C)
• av operativsystemet pga overskredet minnekapasitet
for-setninger
for i in sekvens :
def intervallProdukt(m,n):
produkt=1
for faktor in range(m,n+1):
produkt=produkt*faktor
return produkt
11
Tips
range(m, n, s)
=
Sekvensen av tall fra m til n i steg på s
def intervallProduktPartall(m,n):
produkt=1
if m%2!=0: # m er ikke partall
m=m+1 # og droppes
for faktor in range(m,n+1,2):
produkt=produkt*faktor
return produkt
break
Bryter ut av en for- / while- løkke
Programflyten fortsetter med første setning etter løkken
#Finner første skuddår mellom 2021 og 2050
for i in range(2021,2050):
if sjekkSkuddÅr(i):
Break
print('Første skuddår etter 2021' 'er', i)
Eksempel
handleliste=[]
while True:
vare=input('Hva vil du kjøpe? ')
if vare=='ingenting': break
handleliste=handleliste+[vare]
print(handleliste)
continue
Bryter ut av en ‘runde’ (iterasjon) i løkke-utførelsen
Programflyten fortsetter med neste runde i løkken
Eksempel
handleliste=[]
while True:
vare=input('Hva vil du kjøpe? ')
if vare=='ingenting':
break
if vare=='aksjer' or vare=='vin':
print('Nei, kun dagligvarer')
continue
handleliste=handleliste+[vare]
print(handleliste)
Tips *-parametere
En *-parameter står for et uspesifisert antall argumenter
def snitt(*tall):
n=0
sum=0
for i in tall:
sum=sum+i
n=n+1
return sum/n
Nestede løkker
## Seriekampoppsett
## alle mot alle, borte og hjemme
lag=['Brann', 'Sogndal', 'Rosenborg',\
'Vålerengen', 'Strømsgodset']
farge='hvit'
for kol in ['A','B','C','D','E','F','G','H']:
farge=bytt(farge)
for rad in range(1,9):
print(kol+str(rad),':',farge)
farge=bytt(farge)
Objekter og klasser(forelesning 6)
Litt mer om lister (det kommer enda mer senere)
Vi kan legge til elementer i en liste vha metoden append.
‘Punkt-notasjon’ : objekt.metode(...)
Programsetningen L.append(e) utvider listen L ved å legge til et nytt element e bakerst.
Objekter
Et objekt består av data med tilhørende operasjoner (kalt metoder) som utgjør en
enhet.
Objektets sammensetning av data- og metode-komponenter er definert av en
klasse.
Klassen er en mal for objekter av samme type. Vi sier at objektene er instanser
av / medlem i / tilhører sine respektive klasser
Sammensatte data-objekter
Informasjon kan ofte representeres og lagres som separate data...
Datastrukturer
Klasser (I) Strukturerte data
Mal for person-objekter:
class Person:
navn=None
telefon=None
adresse=None
Klasser og instanser
En klasse-definisjon er kun en mal, den skaper ingen objekter
Objekter skapes ved instansiering x=klassenavn() og tilordninger til attributter
x.attributt=verdi
kari=Person()
kari.navn='Kari Normann'
kari.telefon=98765432
kari.adresse='Tullevei 9, 9876 Tøysedal'
Klasser (II) Metoder
Eksempel:
handleliste=['mel', 'ost', 'rosiner']
handleliste.append('brød')
I metode-definisjoner heter denne parameteren alltid self og skal alltid være den første
parameteren.
def metodenavn(self, parameter1, ..., parametern):
class Person:
navn=None
telefon=None
adresse=None
def skriv(self):
print(self.navn,self.telefon,self.adresse)
Klasse-attributter vs instans-attributter
En instans-attributt har en individuell verdi for hver instans
instansvariabel.attributt=verdi
Eksempel
class Person:
nasjonalitet='norsk' ## standard-verdi
navn=None
telefon=None
adresse=None
def skriv(self):
print(self.navn,\
'(',self.nasjonalitet,'):', \
self.telefon,',', self.adresse)
## Persongalleri
kari=Person()
kari.navn='Kari Normann'
kari.telefon=98765432
kari.adresse='Tullevei 9, 9876 Tøysedal'
per=Person()
per.navn='Per Hansen'
per.telefon=99778891
per.adresse='Nedvei 5, 9855 Oppberg'
ola=Person()
ola.adresse='Langbakken 1, 9921 Langdalen'
ola.telefon=99555554
ola.navn='Ola Lange'
piirka=Person()
piirka.navn='Piirka Kollonemi'
piirka.telefon=99881111
piirka.adresse='Tertitten 4, 0568 Oslo'
Nestede objekter
class Navn:
fornavn=None
etternavn=None
class Adresse:
gateadresse=None
poststed=None
class Person:
navn=None
telefon=None
adresse=None
def skriv(self):
print(self.navn.fornavn,\
self.navn.etternavn,',',\
self.telefon,',',\
self.adresse.gateadresse,',',\
self.adresse.poststed)
Initiering av instanser
Dersom metoden __init__(self, ...) er definert i klassen så vil den automatisk bli
utført når en instans opprettes.
class Navn:
fornavn=None
etternavn=None
def __init__(self,f,e):
self.fornavn=f
self.etternavn=e
self.forbokstaver=f[0]+e[0]
def skriv(self):
print(self.fornavn,self.etternavn)
dir(...)
Lister opp tilgjengelige attributter og metoder for et objekt
Klasser er typer
NB!
Tallet 5 er kun overflateverdien for en instans av klassen int
‘Alt er objekter'
Sletting av objekter
Sammensatte objekter kan potensielt inneholde mye data.
For å unngå plass-sløsing vil Pythons underliggende lageradministrasjon automatisk frigjøre
lagerplassen til et objekt som ikke lenger blir referert til.
class Navn:
fornavn=None
etternavn=None
def __init__(self,f,e):
self.fornavn=f
self.etternavn=e
self.forbokstaver=f[0]+e[0]
def __del__(self):
print('Over og Ut fra',self.fornavn)
def skriv(self):
print(self.fornavn,self.etternavn)