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