1
L U L E Å T E K N I S K A U N I V E R S I T ETD 0 0 0 9 ES Y S T E M T E K N I K
INTRODUKTION TILL PROGRAMMERING
1
Introduktion till programmeringD0009E
Föreläsning 3: “Funktioner”
L U L E Å T E K N I S K A U N I V E R S I T ETS M D 1 8 0S Y S T E M T E K N I K
INTRODUKTION TILL PROGRAMMERING
4
Mer matematik
� Uttryck vi sett: 17+n pi/2 hours*60+minutes
� Kan man skriva log(x) och sin(pi/2)?
� Svar ja!�exempel på funktionsanrop
�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
L U L E Å T E K N I S K A U N I V E R S I T ETS M D 1 8 0S Y S T E M T E K N I K
INTRODUKTION TILL PROGRAMMERING
5
Om moduler
� För att komma åt modulnamn skriver manimport 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)
L U L E Å T E K N I S K A U N I V E R S I T ETS M D 1 8 0S Y S T E M T E K N I K
INTRODUKTION TILL PROGRAMMERING
7
En berättigad fråga:
� 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
L U L E Å T E K N I S K A U N I V E R S I T ETS M D 1 8 0S Y S T E M T E K N I K
INTRODUKTION TILL PROGRAMMERING
8
Funktionsdefinition
� 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
� Definierar funktionen newLine, som tar 0 parametrar
L U L E Å T E K N I S K A U N I V E R S I T ETS M D 1 8 0S Y S T E M T E K N I K
INTRODUKTION TILL PROGRAMMERING
9
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.
Second line.
2
L U L E Å T E K N I S K A U N I V E R S I T ETS M D 1 8 0S Y S T E M T E K N I K
INTRODUKTION TILL PROGRAMMERING
12
Varför funktioner?
� 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
� (Exempel: konstruera funktionerna nineLines och twentySevenLines, och försök sedan åstadkomma samma effekt utan att använda funktioner!)
� Fler poänger med funktioner kommer att uppenbaras framöver...
L U L E Å T E K N I S K A U N I V E R S I T ETD 0 0 0 9 ES Y S T E M T E K N I K
INTRODUKTION TILL PROGRAMMERING
13
Uttryckssatser
� Vi har sett att satser som består av endast ett uttryck orsakar utskrift om de körs interaktivt, men ignoreras inuti script
� En uttryckssats som t ex7+1
är tämligen meningslös i ett script, då resultatet kastas...
� UttryckssatsennewLine()
är däremot meningsfull: den orsakar en effekt även om resultatet (det primitiva värdet None, då inget annat sagts) ignoreras
L U L E Å T E K N I S K A U N I V E R S I T ETD 0 0 0 9 ES Y S T E M T E K N I K
INTRODUKTION TILL PROGRAMMERING
14
def-satsen
� 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
� 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
� När en funktion anropas och dess satslista körts färdigt fortsätter körningen där anropet skedde
L U L E Å T E K N I S K A U N I V E R S I T ETD 0 0 0 9 ES Y S T E M T E K N I K
INTRODUKTION TILL PROGRAMMERING
15
Programflöde
def a():
def b():
b()
a()
b()
8
1Notera namnet a
2Notera namnet b
3Anropa b
5Anropa a
7Anropa b
4 Utför satserna i b
6 Utför satserna i a
9Klar!
L U L E Å T E K N I S K A U N I V E R S I T ETS M D 1 8 0S Y S T E M T E K N I K
INTRODUKTION TILL PROGRAMMERING
16
Parametrar och argument
� värdet som skickas med till en funktionen�funktionens argument
�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 antaletparametrar
� Exempel på funktion med 1 parameter:def printTwice( bruce ):
print bruce, bruce
L U L E Å T E K N I S K A U N I V E R S I T ETS M D 1 8 0S Y S T E M T E K N I K
INTRODUKTION TILL PROGRAMMERING
17
Exempel
>>> printTwice( 'Spam' )Spam Spam>>> printTwice( 5 )5 5>>> 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.
3
L U L E Å T E K N I S K A U N I V E R S I T ETS M D 1 8 0S Y S T E M T E K N I K
INTRODUKTION TILL PROGRAMMERING
18
Lokala variabler
� Vad händer om vi definierar en variabel inuti en funktion? Var kan denna variabel användas?def catTwice( part1, part2 ):
cat = part1 + part2printTwice( cat )
� Provkörning:>>> chant1 = "Pie Jesu domine, ">>> chant2 = "Dona eis requiem.">>> catTwice( chant1, chant2 )Pie Jesu domine, Dona eis requiem. Pie Jesu domin...>>> print catNameError: cat
L U L E Å T E K N I S K A U N I V E R S I T ETS M D 1 8 0S Y S T E M T E K N I K
INTRODUKTION TILL PROGRAMMERING
19
Programmets tillstånd
� 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
L U L E Å T E K N I S K A U N I V E R S I T ETS M D 1 8 0S Y S T E M T E K N I K
INTRODUKTION TILL PROGRAMMERING
20
Vårt exempelprogram igen
def printTwice( bruce ):print bruce, bruce
def catTwice( part1, part2 ):cat = part1 + part2printTwice( cat )
chant1 = "Pie Jesu domine, "chant2 = "Dona eis requiem."catTwice( chant1, chant2 )
L U L E Å T E K N I S K A U N I V E R S I T ETS M D 1 8 0S Y S T E M T E K N I K
INTRODUKTION TILL PROGRAMMERING
21
Stack-diagram
� Ögonblicksbild just när utskrift sker:
� Tolkning: printTwice är anropad av catTwice, som är anropad av -toplevel- (kallas ibland __main__ eller ?)
chant1chant2
"Pie Jesu domine, ""Dona eis requiem."
-toplevel-
part1part2cat
"Pie Jesu domine, ""Dona eis requiem.""Pie Jesu domine, Dona eis requiem."
catTwice
bruce "Pie Jesu domine, Dona eis requiem."printTwice
L U L E Å T E K N I S K A U N I V E R S I T ETS M D 1 8 0S Y S T E M T E K N I K
INTRODUKTION TILL PROGRAMMERING
22
Vårt exempelprogram igen, nu med ett fel
def printTwice( bruce ):print bruce, bruuce
def catTwice( part1, part2 ):cat = part1 + part2printTwice( cat )
chant1 = "Pie Jesu domine, "chant2 = "Dona eis requiem."catTwice( chant1, chant2 )
Felstavning!
L U L E Å T E K N I S K A U N I V E R S I T ETS M D 1 8 0S Y S T E M T E K N I K
INTRODUKTION TILL PROGRAMMERING
23
Resultat vid körning
Traceback (most recent call last):File "<pyshell#38>", line 1, in -toplevel-catTwice(chant1, chant2)
File "<pyshell#31>", line 3, in catTwiceprintTwice( cat )
File "<pyshell#37>", line 2, in printTwiceprint bruce, bruuce
NameError: global name 'bruuce' is not defined>>>
Notera överensstämmelsen med stackdiagrammet!
4
L U L E Å T E K N I S K A U N I V E R S I T ETD 0 0 0 9 ES Y S T E M T E K N I K
INTRODUKTION TILL PROGRAMMERING
24
Om funktioner
� 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!
� 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!