Funktioner - sm.luth.se
Short Description
Download Funktioner - sm.luth.se...
Description
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 "", line 1, in -toplevelcatTwice(chant1, chant2) File "", line 3, in catTwice printTwice( cat ) File "", 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
View more...
Comments