Introduktion till programmering Föreläsning 3: Funktioner 1 1
Mer matematik Vi har sett matematiska uttryck med variabler, värden och operatorer, ex: 17+n pi/2 hours*60+minutes Kan man även skriva uttryck som log(x) och sin(pi/2)? Svar ja! Dessa uttryck är exempel på funktionsanrop (kallas ibland funktionsapplikation) Dock: namnen log och sin är dock inte inbyggda i Python de finns i stället definierade i den separata modulen math En modul är ett Python-script som innehåller definitioner av ett antal relaterade funktioner och variabler 2 2
Om moduler För att komma åt definitionerna i modulen modulnamn skriver man import modulnamn Detta får till följd att scriptet modulnamn.py läses in och körs samt att alla namn i detta script blir å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) 3 3
Exempel >>> import math >>> degrees = 45 >>> radians = degrees * 2 * math.pi / 360 >>> math.sin(radians) 0.70710678118654757 >>> sidax = 3 >>> siday = 4 >>> math.sqrt(sidax*sidax + siday*siday) 5.0 >>> math.sqrt(0.5) 0.70710678118654757 4 4
En berättigad fråga: Hur ser ett script ut som definierar funktioner? Hittills har vi bara tittat på hur man definierar variabler... Tyvärr kan vi inte lära oss något från modulen math, eftersom den specialbehandlas av Python (funktioner som sin och sqrt är egentligen maskininstruktioner precis som + och *) Det skulle dock vara bra att kunna definiera egna funktioner (t ex en funktion gradtorad som konverterar grader till radianer!) Lyckligtvis är funktioner ett mycket centralt begrepp i Python låt oss introducera det bit för bit 5 5
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 6 6
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. 7 Second line. 7
Funktionsanrop Ytterligare exempel: print "First line." newline() newline() newline() print "Second line." Ekvivalent exempel: def threelines(): newline() newline() newline() print "First line." threelines() print "Second line." 8 8
Varför funktioner? Ger oss möjlighet att namnge en lista av satser ökar läsbarheten om namnet väljs med omsorg Ger oss möjlighet att 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... 9 9
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 ex 7+1 är tämligen meningslös i ett script, då resultatet kastas... Uttryckssatsen newline() är däremot meningsfull: den orsakar en effekt även om resultatet (det primitiva värdet None, då inget annat sagts) ignoreras 10 10
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 11 11
Programflöde Notera namnet a 1 def a(): Utför satserna i a 6 Notera namnet b 2 def b(): 4 Anropa b 3 b() Anropa a 5 a() Anropa b 7 b() Klar! 9 8 Utför satserna i b 12 12
Parametrar och argument Det värde som skickas med till funktionen math.sin (vinkeln) kallas funktionens argument I allmänhet kan funktioner ta 0 eller fler argument, separerade med komma Inuti en funktionsdefinition nås argumenten via namn som kallas parametrar Antalet argument i ett funktionsanrop måste vara lika med antalet parametrar i funktionens definition Exempel på funktion med 1 parameter: def printtwice( bruce ): print bruce, bruce 13 13
Exempel >>> 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. 14 14
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 + 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 15 15
Programmets tillstånd Variabeldefinitioner på topp-nivån utökar programmets tillstånd Variabeldefinitioner inuti en funktion 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 funktion 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 16 16
Vårt exempelprogram igen def printtwice( bruce ): print bruce, bruce def cattwice( part1, part2 ): cat = part1 + part2 printtwice( cat ) chant1 = "Pie Jesu domine, " chant2 = "Dona eis requiem." cattwice( chant1, chant2 ) 17 17
Stack-diagram Ögonblicksbild just när utskrift sker: -toplevel- chant1 chant2 cattwice part1 part2 cat "Pie Jesu domine, " "Dona eis requiem." "Pie Jesu domine, Dona eis requiem." bruce "Pie Jesu domine, Dona eis requiem." printtwice "Pie Jesu domine, " "Dona eis requiem." Tolkning: printtwice är anropad av cattwice, som är anropad av -toplevel- (kallas ibland main eller?) 18 18
Vårt exempelprogram igen, nu med ett fel def printtwice( bruce ): print bruce, bruuce Felstavning! def cattwice( part1, part2 ): cat = part1 + part2 printtwice( cat ) chant1 = "Pie Jesu domine, " chant2 = "Dona eis requiem." cattwice( chant1, chant2 ) 19 19
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! 20 20
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! 21 21