You are on page 1of 86

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)

• Et sett av instruksjoner som en datamaskin vil utføre


• Tekst-fil med programkode
0101010101010100111011000001101011011101
0001100010100100010001010100111010001101
• Kompilert program
0010010101010010100101010101010010100101 • Eksekverbar fil
0111100101001010100100101010011001001001 med maskinkode
0110001011111001010110011001101001010010
0100101010101010101001110110000011010110
1110100011000101001000100010101001110100
0110100100101010100101001010101010100101
0010101111001010010101001001010101010010
1001001001010100101001001001100010100...

Hva må man lære for å kunne programmere?


Et programmeringsspråk (for eksempel Python)
o Syntaks: Gloser og grammatikk.
o Semantikk: Meningsinnhold.
o Språkbruk: Hvordan formulere det man ønsker å uttrykke

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.

Eksempler med opsjoner


>>> print('Velkommen','til','DATA',110)
Velkommen til DATA 110
>>>
>>> print('Velkommen ','til
','DATA',110,sep='')
Velkommen til DATA110
>>>print(5,7,9, sep=’<’)
5<7<9
>>>print(5,3,7,sep=' og ',end=' er
primtall')
5 og 3 og 7 er primtall

\n er en kode for linjeskift


>>>print('Velkommen','til','DATA110',sep='
\n')
Velkommen
til
DATA110
>>>print('Velkommen\ntil\nDATA110')
Velkommen
til
DATA110

Standardopsjonene for print er sep=’ ’ og end=’\


n’
>>>print(5,7)
5 7
>>>print(5,7, sep=’ ’, end=’\n’)
5 7

Litt om formatering av tall


>>>100/3
33.333333333333336

Flere desimaler enn du ønsker?


Tall kan konverteres til formaterte tekstverdier
>>> '%.3f' % (100/3)
'33.333'

NB! resultatet er en tekst


>>> 7+(100/3)
40.333333333333336
>>> 7+'%.3f' % (100/3)
Traceback (most recent call last):
. . . FEILMELDING . . .

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

>>> print('%.2f' % 123.456789)


123.46

‘%v.df’% n Tallet n skrives på v plasser med d


desimaler
>>> '%8.2f' % 123.456789
' 123.46'

Program (også kalt ‘script’ i boken)


Sekvens av instruksjoner
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)

Skrives i en .py-fil som Python-tolken utfører steg


for steg
Forenklet modell av en datamaskin
Litt om variable (mer om dette neste gang)
En variabel står for en verdi

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

Operator overlasting (polymorfi)


Når et symbol brukes i ulike kontekster med ulik
betydning
Tall Tekst
>>> 5+3 >>> 'Python'+'Program'
8 'PythonProgram'
>>> 5*3 >>> 'Python'*3
15 'PythonPythonPython'
>>> 5>3 >>> 'Python'>'Program'
True True
Felle!
Tall-rekkefølge og alfabetisk rekkefølge er ikke alltid i
samsvar
>>> 99<100
True
>>> '99'<'100'
False

>>> max('programmering er moro!')


'r'

Kommentarlinjer
Starter med # og blir ignorert av tolken

Syntaksfeil [kompileringsfeil & eksekveringsfeil]


• Ulovlig formulering
• Programmet avvises/avbrytes med feilmelding

Logisk feil [eksekveringsfeil]


• Lovlig formulering, men ikke gjennomførbart
• Programmet avbrytes med feilmelding

Semantisk feil [eksekveringsfeil]


• Lovlig formulering
• Programmet fullfører uten feilmelding
• Har ikke ønsket effekt
Trykkfeil
feil analyse

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)

Summen av tallene fra 1 til 8


1 + ... + 8 = 36
>>>

Syntaktiske feil

Eksempel: 1 + 2 + 3 + ... + n = n ( n+1 )


2
Logiske feil

Eksempel: 1 + 2 + 3 + ... + n = n ( n+1 )


2
Semantiske feil
Uttrykk Og Programsetninger
(forelesning 2)
Verdier
De vanligste typene:
• Tall
- Heltall (integer)
9, -2, 0, ...
- Desimaltall (float)
3.7, -0.232716, 0.0, ...
• Tekst (tekststreng = en sekvens av
bokstaver/tall/tegn)
‘A’
‘Bergen’
‘Vått og kaldt og breiflabb over alt’
“Hordaland”
‘’ den tomme strengen
• Sannhetsverdier (Boole’ske verdier)
- True
- False
Funksjonen type()
type(v) gir typen til verdien v.
Konvertering mellom typene
Konverteringsfunksjoner:
str(v) konverterer verdien v til en tekst
int(v) konverterer verdien v til et heltall
float(v) konverterer verdien v til et
desimaltall
Variable og tilordninger
En variabel er et navn som står for en verdi
Verdien kan endres
Vi kan tenke på en variabel som en navngitt
lagerplass, og at variabelnavnet brukes til å
referere til verdien som er lagret der.
Variable opprettes/oppdateres vha tilordninger på
formen
Variabelnavn = Verdi
Eksempel: Instruksjonen x=5 har som effekt at
tallet 5 plasseres i en lagerplass merket med x.

Hvis det allerede finnes en lagerplass merket x vil


verdien som ligger der bli erstattet av den nye
verdien 5.
Hvis det ikke finnes en lagerplass merket x blir
den opprettet.
Typen til en variabel er typen til innholdet

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.

Sammensatt uttrykk (= ikke-atomisk)

Operator anvendt på operander


(der operandene selv er uttrykk)

Eksempel : 2*(x+1) er et sammensatt uttrykk som inneholder del-


uttrykkene 2, (x+1), x og 1

Uttrykkets ‘anatomi’
Programsetninger

Enhet av kode som Python kan utføre ‘Byggestenene’ i programmer

Så langt har vi bare sett enkle programsetninger som


x=5+2 og print(x)
men Pythons reserverte nøkkelord og funksjoner gir oss et rikt språk
for å formulere komplekse sammensatte programsetninger.
Et program (‘script’) er bygget opp av programsetninger
Litt om funksjoner (Mye mer om dette senere!)
En funksjon er en navngitt instruksjon som produserer et bestemt
resultat og/eller effekt.
Resultatet/effekten kan avhenge av inn-data vi kaller argumenter.
Funksjoner anvendes vha funksjonskall på formen
funksjonsnavn(argument1,...,argumentn)

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.

Vi kan skille mellom to typer funksjoner:


• Tomme (void) funksjoner har kun effekter og returnerer ikke noe
resultat
• Resultat-funksjoner returnerer en funksjonsverdi og kan ha effekter
i tillegg

Kall på resultat-funksjoner kan inngå i uttrykk på tilsvarende


måte som operatorer.

Innebygde funksjoner
Vi er allerede kjent med disse:

OBS! konverteringsfunksjonene her returnerer en ny verdi og


har ingen effekt på inndata.
Noen flere innebygde funksjoner

round(Tall) runder av til heltall


round(Tall1 , Tall2 ) runder av Tall1, med Tall2 desimaler

len(Tekst) returnerer lengden til teksten

input(Ledetekst) tar imot en verdi fra tastaturet.


Ledeteksten skrives på skjermen og brukeren taster inn en
verdi (avslutt med <Enter>). Verdien returneres som tekst.

En første kikk på moduler


En modul kan inneholde predefinerte funksjoner og data
Ved å importere modulen inn i programmet
import modulnavn
kan du kalle på disse slik:
modulnavn.funksjon(...)
Eksempel Modulen math inneholder flere matte-funksjoner
math.sqrt(Tall) beregner kvadratroten av tallet
math.pi tallet 
Standardbiblioteket
Python har et standardbibliotek med moduler som du kan
importere uten videre.
Gjør deg kjent med standardmodulene her:

https://docs.python.org/3/library/

Start med å kikke på math-modulen. Her finner du


konstanter og funksjoner for , e, sinus, cosinus, logaritmer,
kvadratrot og mye mer.

Tips! Modulen random


Stort utvalg funksjoner for å generere tilfeldige tall og verdier
random.randint(Tall1, Tall2) returnerer et tilfeldig heltall
mellom Tall1 og Tall2.

random.choice(Tekst) returnerer et tilfeldig tegn i teksten.


(choice kan brukes på andre typer data også
men det må vi vente med)

random.seed(Tall) setter en såkornverdi for de tilfeldige


valgene. Ved å gjenta såkornverdien senere kan man få de
samme valgene på nytt.

Og mye mer. Se her:

https://docs.python.org/3/library/random.html
Betinget utførelse(forelesning 3)
Boole’ske verdier (boolean) [George Boole]

Sannhetsverdier oppstår, blant annet, ved


sammenlikning
4>5
False

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

Operatorpresedens: not > and > or


Ekvivalente uttrykk
To uttrykk er ekvivalente dersom de alltid har
samme verdi

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’).

Betinget alternativ utførelse


if–elif(–else) setning

Den første grenen med sann betingelse utføres


Nestede if-setninger
if / elif / else-grener kan også inneholde if-
setninger

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

Håndtering av uforutsette feil


try – except Kan redde oss fra havar

Avkortet-evaluering av logiske operatorer


Python evaluerer logiske operatorer fra venstre mot
høyre og avkorter prosessen om mulig.
True or ? == True
False and ? == False
Triks: vern mot feil i boole'ske uttrykk
Utsatte operasjoner i et boole'sk uttrykk kan vernes mot
havari ved å utnytte avkortet evaluering

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).

Funksjonsbegrepet i programmering er mer generelt:


Navngitt samling instruksjoner som
utfører en bestemt oppgave.

• Valgfritt om en funksjonsverdi skal returneres


• Kan ha side-effekter, utover å produsere en returverdi

Funksjoner er viktige i programmering:


• abstraksjon/splitt-og-hersk i problemløsning
• strukturerer programkode
• gjenbruk av kode

Funksjoner anvendes vha funksjonskall på formen


funksjonsnavn(argument1, ...,argumentn)

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

Kall på resultat-funksjoner kan inngå i uttrykk på tilsvarende


måte som operatorer.
Egendefinerte funksjoner

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

avslutter funksjonens prosess med returverdien 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))

Funksjoner kan ha vilkårlig mange argumenter


(Med andre ord: du kan bruke så mange parametere du vil i
funksjons-definisjonene)

Eksempel Alternativ tilnærming til omregnings-funksjoner:


fremmed-valutaen oppgis som argument.

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 tilNorsk(beløp, valuta):


if valuta=='svensk':
kurs=kursSEK
elif valuta=='dansk':
kurs=kursDKK
else:
return 'ukjent valuta'
return beløp/kurs

def fraNorsk(beløp, valuta):


if valuta=='svensk':
kurs=kursSEK
elif valuta=='dansk':
kurs=kursDKK
else:
return 'ukjent valuta'
return beløp*kurs

Programflyt (flow of execution)

Eksekvering av et program er prosessen der programsetningene utføres ovenfra og ned, i


henhold til eventuelle betingelser i programsetningene

Programflyten er sekvensen av instruksjoner som blir utført.


Når programflyten kommer til et funksjonskall
• Suspenderes eksekveringen.
• Funksjonens kropp eksekveres i en egen prosess.
• Parametere blir til lokale variable i den nye prosessen, og tilordnes argumentverdiene i
funksjonskallet. (Argumentverdiene regnes ut, om nødvendig, før tilordning)
• Den opprinnelige eksekveringen gjenopptas når funksjonskallet er ferdig.

Eksempel - omregning SEK til DKK via NOK (ny versjon)


kursSEK=0.9842
kursDKK=0.7166

def tilNorsk(beløp, valuta):


if valuta=='svensk':
kurs=kursSEK
elif valuta=='dansk':
kurs=kursDKK
else:
return 'ukjent valuta'
return beløp/kurs

def fraNorsk(beløp, valuta):


if valuta=='svensk':
kurs=kursSEK
elif valuta=='dansk':
kurs=kursDKK
else:
return 'ukjent valuta'
return beløp*kurs

def svenskTilDansk(sek):
nok=tilNorsk(sek,'svensk')
return fraNorsk(nok,'dansk')

beløpSEK=100
dkk=svenskTilDansk(beløpSEK)
print('SEK', beløpSEK,'= DKK',dkk)
…….

Skop – en variabels rekkevidde

En funksjons-definisjon kan opprette lokale variable:


• Parameter-variable
• Variable opprettet på vanlig måte ved tilordning

Funksjonens kropp utgjør skopet til dens lokale variable.

Variable opprettet utenfor funksjonene sies å være globale.

Skopet til globale variable er programmet i sin helhet.


Dette globale skopet omslutter alle andre skop
En variabel kan ikke refereres til utenfor dens skop.
Omvendt, derimot, kan programsetninger i en funksjon referere utenfor kroppen, til globale
variable.

Med andre ord:


• Lokale variable er ‘usynlige’ utenfor funksjonen
• Globale variable er synlige overalt i programmet.
Globale vs lokale variable
Når et funksjonskall eksekveres i en separat prosess vil lokale variable høre til den
spesifikke prosessen, og forsvinne når prosessen opphører.

Globale variable hører til hoved-prosessen og er alltid tilgjengelige etter at de er opprettet.


Variabel-miljø
Et funksjonskall vil aktivisere en ny prosess med sitt eget miljø av variable.
Miljøet omfatter alle opprettede variable i programmet som er synlige i henhold til skop- og
presedens-reglene.

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

Valgfrie paramentere og standardverdier


def skrivAvstand(A, B, avs, enhet='km'):
print('Avstand',A,'-',B,'er', avs, enhet)

def skrivHastighet(H, lengde='km', tid='t'):


print('Hastighet:', H, lengde+'/'+tid)

None
Verdi som betegner ‘ingen verdi’

Tomme funksjoner ‘returnerer’ None


Lokale funksjoner.
En funksjon kan defineres innenfor en annen funksjon

Kroppen til f utgjør skopet til den lokale funksjonen g.


Vi sier at f-skopet omslutter g-skopet.

Skop-regelen generaliseres tilsvarende:


• En variabel/funksjon kan ikke refereres til utenfor dens skop.
• Omvendt, derimot, kan programsetninger i en funksjon referere utenfor kroppen, til
variable/funksjoner i omsluttende skop.
• En lokal variabel/funksjon tar presedens over eventuelle variable/funksjoner med samme
navn i omsluttende skop

Husk: Det globale skopet omslutter alle andre skop

Eksempel
def refreng():
def dd():
print('dum og deilig')

def juba(antall):
print('juba '*antall)

print('for jeg er')


dd()
juba(2)
print('øver foran speilet')
dd()
juba(2)
print('danser som en snegle')
dd()
print('nå går det bra')
juba(2)
refreng()
Eksempel variabel-binding
def f(x):
y = x+z

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

nonlocal spesifiserer at funksjonen oppdaterer utenfor eget skop (‘nærmeste’ forekomst,


dog ikke globalt).
Iterasjon(forelesning 5)
Litt om sekvens-typer (mer om dette senere)

• Liste – sekvens av elementer (av vilkårlig type)


[1, 2, ‘tre’, ‘4 fem’]
[] (tom liste)

• Intervall – tall-sekvens
range(m, n)
m, m+1, m+2, ... , n-1,

Merk: slutt-tallet n er ikke inkludert i intervallet

Funksjonen list(s) lager lister av andre sekvenstype


Operatorene + og * fungerer som konkatenering og kopiering
på noen sekvenstyper

Funksjonen len(sekvens) gir antall elementer

Det n‘te elementet nås vha indeksering: sekvens[n-1]


Merk: indeksene starter på 0

Iterering – gjentatt utførelse


Ofte trenger vi å gjenta programsetninger et antall ganger
Løkke-setningene for og while automatiserer repetisjon

Vi sier at programsetningene itereres, eller utføres i løkke.


Hver enkelt repetisjon kalles en iterasjon, eller runde, i løkken

while-setninger

Blokken repeteres så lenge betingelsen er oppfylt (True)

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

Produktet av partallene i intervallet


def intervallProduktPartall(m,n):
faktor=m
produkt=1
while faktor<=n:
if faktor%2==0: #partall
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

While-betingelsen må påvirkes av endringer som skjer når blokken utføres.

for-setninger
for i in sekvens :

Blokken utføres 1 gang for hvert element i sekvensen.

Løkke-variabelen i tilordnes det aktuelle elementet i hver repetisjon

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

En while/for-setning kan godt ha indre while/-for setninger i blokken.

#Alle mulige ekvipasjer


ryttere = ['Kari', 'Per', 'Liv']
hester = ['Blakken', 'Svarten',\
'Gampen', 'Raggen']
for hest in hester:
for rytter in ryttere:
print(hest, rytter)

## Seriekampoppsett
## alle mot alle, borte og hjemme
lag=['Brann', 'Sogndal', 'Rosenborg',\
'Vålerengen', 'Strømsgodset']

for hjemmelag in lag:


for bortelag in lag:
if bortelag!=hjemmelag:
print(hjemmelag, ' - ', bortelag)
## Program som skriver ut fargene
## til alle rutene på sjakk-brettet
def bytt(farge):
if farge=='hvit':
return 'sort'
else:
return 'hvit'

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.

Metoden remove fjerner et element: L.remove(e)

in (operator for sekvenstyper)


e in S sjekker om e er element i sekvensen S

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

Objekter er viktige på flere måter:


• konstruksjonsmekanisme for å danne komplekse/sammensatte data og
datastrukturer
• for å definere programstruktur. Data og operasjoner som konseptuelt hører
sammen kan samles i et objekt

Sammensatte data-objekter
Informasjon kan ofte representeres og lagres som separate data...

...men det er også ofte hensiktsmessig å strukturere og samle dem i en enhet

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

Objekter kan ha tilhørende operasjoner, kalt metoder

Metoder er som funksjoner, men de opprettes i klasse-definisjoner og kalles ved hjelp av


punkt.notasjon

Eksempel:
handleliste=['mel', 'ost', 'rosiner']
handleliste.append('brød')

Her er append en liste-metode som anvendes på liste- objektet handleliste

En metode vil alltid ha objektet sitt som parameter. Dvs. at i kallet


handleliste.append('brød')blir append anvendt på to argumenter: handleliste og
‘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

En klasse-attributt har felles verdi for alle instanser.


Verdien kan oppdateres:
klassenavn.attributt=verdi
Klasse-attributter kan bli til instans-attributter ved individuell tilordning.

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'

personliste=[kari, ola, per, piirka]

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.

Vi kan utføre sletting selv vha funksjonen del(objekt)

Kallet del(objekt)innebærer et kall på objektets egen slettemetode objekt .__del__().


Denne kan du definere selv slik at klassen din får sin egen tilpassede versjon av del.

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)

You might also like