L U L E Å T E K N I S K A U N I V E R S I T ET
SY ST E M T E K N I K
INTRODUKTION TILL PROGRAMMERING
D0009E
L U L E Å T E K N I S K A U N I V E R S I T ET
SY ST E M T E K N I K
INTRODUKTION TILL PROGRAMMERING
SMD180
Mer matematik
Uttryck vi sett: 17+n
Introduktion till programmering
D0009E
pi/2
hours*60+minutes
Kan man skriva log(x) och sin(pi/2)?
Svar ja!
exempel på funktionsanrop
Föreläsning 3: “Funktioner”
kallas ibland funktionsapplikation
log och sin inte inbyggda i Python
finns i den separata modulen math
modul
Python-script som innehåller definitioner av ett antal
relaterade funktioner och variabler
1
4
L U L E Å T E K N I S K A U N I V E R S I T ET
SY ST E M T E K N I K
INTRODUKTION TILL PROGRAMMERING
SMD180
L U L E Å T E K N I S K A U N I V E R S I T ET
SY ST E M T E K N I K
Om moduler
En berättigad fråga:
För att komma åt modulnamn skriver man
import modulnamn
modulnamn.py läses in och körs
alla namn åtkomliga via punktnotation:
modulnamn.funktion(x) modulnamn.variabel
Import av modulen math:
import math
Exempel på namn som då blir åtkomliga:
math.pi math.sin(x) math.log(x)
math.sqrt(x)
5
definiera funktioner?
bara tittat på hur man definierar variabler...
bra att kunna definiera egna funktioner
t.ex. gradToRad som konverterar grader till radianer!
funktioner
ett mycket centralt begrepp i programmering
7
L U L E Å T E K N I S K A U N I V E R S I T ET
SY ST E M T E K N I K
INTRODUKTION TILL PROGRAMMERING
SMD180
L U L E Å T E K N I S K A U N I V E R S I T ET
SY ST E M T E K N I K
Funktionsdefinition
INTRODUKTION TILL PROGRAMMERING
SMD180
Funktionsanrop
Funktionsanrop är en form av uttryck (expression):
funktionsnamn( argumentlista )
Regler: funktionsnamnet måste vara introducerat i en
tidigare def-sats, parenteserna måste finnas med
Exempel:
print "First line."
newLine()
print "Second line."
Genererar följande output:
First line.
Generellt mönster:
def funktionsnamn( parameterlista ):
satslista
Regler: def är ett nyckelord, parenteser och kolon
måste finnas med, satslistan måste vara indenterad från
vänstermarginalen
Exempel:
def newLine():
print
# nothing but a new line
Second line.
Definierar funktionen newLine, som tar 0 parametrar
8
INTRODUKTION TILL PROGRAMMERING
SMD180
9
1
L U L E Å T E K N I S K A U N I V E R S I T ET
SY ST E M T E K N I K
INTRODUKTION TILL PROGRAMMERING
SMD180
L U L E Å T E K N I S K A U N I V E R S I T ET
SY ST E M T E K N I K
Varför funktioner?
Uttryckssatser
Vi har sett att satser som består av endast ett uttryck
orsakar utskrift om de körs interaktivt, men ignoreras
inuti script
namnge en lista av satser – ökar läsbarheten om
namnet väljs med omsorg
skriva kortare program – satslistor som förekommer
på flera ställen kan ersättas av anrop till en gemensam
funktion i stället
En uttryckssats som t ex
7+1
är tämligen meningslös i ett script, då resultatet kastas...
(Exempel: konstruera funktionerna nineLines och
twentySevenLines, och försök sedan åstadkomma
samma effekt utan att använda funktioner!)
Uttryckssatsen
newLine()
är däremot meningsfull: den orsakar en effekt även om
resultatet (det primitiva värdet None, då inget annat
sagts) ignoreras
Fler poänger med funktioner kommer att uppenbaras
framöver...
12
13
L U L E Å T E K N I S K A U N I V E R S I T ET
SY ST E M T E K N I K
INTRODUKTION TILL PROGRAMMERING
D0009E
L U L E Å T E K N I S K A U N I V E R S I T ET
SY ST E M T E K N I K
def-satsen
INTRODUKTION TILL PROGRAMMERING
D0009E
Programflöde
Vi har också bekantat oss med två andra typer av satser:
• print-satsen, vars effekt är utskrift av text på skärmen
• variabel-tilldelning, vars effekt är förändring av
programmets interna tillstånd
Notera namnet a
Notera namnet b
def a():
2
Utför satserna i a
def b():
4
När en funktion anropas och dess satslista körts färdigt
fortsätter körningen där anropet skedde
14
1
6
Viktigt: def-satsen förändrar också programmets
interna tillstånd då den utförs, men enbart genom att
ett nytt funktionsnamn blir tillgängligt. De indenterade
satserna utförs inte vid detta tillfälle, utan först när
funktionen i fråga anropas
Anropa b
3
b()
Anropa a
5
a()
Anropa b
7
b()
Klar!
9
8
Utför satserna i b
15
L U L E Å T E K N I S K A U N I V E R S I T ET
SY ST E M T E K N I K
INTRODUKTION TILL PROGRAMMERING
SMD180
L U L E Å T E K N I S K A U N I V E R S I T ET
SY ST E M T E K N I K
Parametrar och argument
>>> printTwice( 'Spam' )
Spam Spam
>>> printTwice( 5 )
55
>>> printTwice( 'Spam'*3 )
SpamSpamSpam SpamSpamSpam
>>> printTwice( "'Spam'*3" )
'Spam'*3 'Spam'*3
>>> michael = "Eric, the half a bee."
>>> printTwice( michael )
Eric, the half a bee. Eric, the half a bee.
exempel: vinkeln till math.sin
funktioner ta 0 eller fler argument, separerade med
komma
Inuti funktionsdefinition
argumenten nås via namn som kallas parametrar
Antalet argument måste vara samma som antalet
parametrar
Exempel på funktion med 1 parameter:
def printTwice( bruce ):
print bruce, bruce
INTRODUKTION TILL PROGRAMMERING
SMD180
Exempel
värdet som skickas med till en funktionen
funktionens argument
16
INTRODUKTION TILL PROGRAMMERING
D0009E
17
2
L U L E Å T E K N I S K A U N I V E R S I T ET
SY ST E M T E K N I K
INTRODUKTION TILL PROGRAMMERING
SMD180
L U L E Å T E K N I S K A U N I V E R S I T ET
SY ST E M T E K N I K
Lokala variabler
Programmets tillstånd
Vad händer om vi definierar en variabel inuti en
funktion? Var kan denna variabel användas?
def catTwice( part1, part2 ):
cat = part1 + part2
printTwice( cat )
Provkörning:
>>> chant1 = "Pie Jesu domine, "
>>> chant2 = "Dona eis requiem."
>>> catTwice( chant1, chant2 )
Pie Jesu domine, Dona eis requiem. Pie Jesu domin...
>>> print cat
NameError: cat
18
Variabeldefinitioner på topp-nivån (utanför function)
utökar programmets tillstånd
Variabeldefinitioner i en function
utökar också programmets tillstånd, men bara
tillfälligt medan funktionen körs – därefter försvinner
denna del av tillståndet!
Parametrar till en function
beter sig precis som lokala variabler i detta avseende
För att hålla koll på vilka variabler som är definierade
(samt vart återhoppen ska ske) använder sig programmet
internt av en datastruktur som kallas en stack – det
senast tillkomna blir det första som ska tas bort
19
L U L E Å T E K N I S K A U N I V E R S I T ET
SY ST E M T E K N I K
INTRODUKTION TILL PROGRAMMERING
SMD180
L U L E Å T E K N I S K A U N I V E R S I T ET
SY ST E M T E K N I K
Vårt exempelprogram igen
INTRODUKTION TILL PROGRAMMERING
SMD180
Stack-diagram
Ögonblicksbild just när utskrift sker:
def printTwice( bruce ):
print bruce, bruce
-toplevel-
def catTwice( part1, part2 ):
cat = part1 + part2
printTwice( cat )
catTwice
printTwice
chant1 = "Pie Jesu domine, "
chant2 = "Dona eis requiem."
catTwice( chant1, chant2 )
chant1
chant2
"Pie Jesu domine, "
"Dona eis requiem."
part1
part2
cat
"Pie Jesu domine, "
"Dona eis requiem."
"Pie Jesu domine, Dona eis requiem."
bruce
"Pie Jesu domine, Dona eis requiem."
Tolkning: printTwice är anropad av catTwice, som är
anropad av -toplevel- (kallas ibland __main__ eller ?)
20
21
L U L E Å T E K N I S K A U N I V E R S I T ET
SY ST E M T E K N I K
INTRODUKTION TILL PROGRAMMERING
SMD180
L U L E Å T E K N I S K A U N I V E R S I T ET
SY ST E M T E K N I K
Vårt exempelprogram igen, nu med ett fel
def printTwice( bruce ):
print bruce, bruuce
INTRODUKTION TILL PROGRAMMERING
SMD180
Resultat vid körning
Traceback (most recent call last):
File "<pyshell#38>", line 1, in -toplevelcatTwice(chant1, chant2)
File "<pyshell#31>", line 3, in catTwice
printTwice( cat )
File "<pyshell#37>", line 2, in printTwice
print bruce, bruuce
NameError: global name 'bruuce' is not defined
>>>
Notera överensstämmelsen med stackdiagrammet!
Felstavning!
def catTwice( part1, part2 ):
cat = part1 + part2
printTwice( cat )
chant1 = "Pie Jesu domine, "
chant2 = "Dona eis requiem."
catTwice( chant1, chant2 )
22
INTRODUKTION TILL PROGRAMMERING
SMD180
23
3
L U L E Å T E K N I S K A U N I V E R S I T ET
SY ST E M T E K N I K
INTRODUKTION TILL PROGRAMMERING
D0009E
L U L E Å T E K N I S K A U N I V E R S I T ET
SY ST E M T E K N I K
Om funktioner
INTRODUKTION TILL PROGRAMMERING
D0009E
Hemuppgift – ingen redovisning
En funktion kan:
• Orsaka en effekt (t ex utskrift, som printTwice)
• Returnera ett resultat (som t ex math.sin)
• Eller både och!
• Eller ingetdera!
Skriv en funktion som skriver ut “tvåans”
multiplikationstabell på skärmen 2*1,…,2*10
• svårare:
• Skriv en funktion som skriver ut alla
multiplikationstabeller från 1 till 10
Vi har hittills negligerat förekomsten av resultat, och
koncentrerat oss på funktioner med effekter (ofta också
kallade procedurer)
Vi återkommer dock till det mycket centrala begreppet
funktionsresultat i föreläsning 5!
24
25
4