l u l e Å t e k n i s k a u n i v e r s i t et

4
1 L U L E Å T E K N I S K A U N I V E R S I T ET D 0 0 0 9 E S Y S T E M T E K N I K INTRODUKTION TILL PROGRAMMERING 1 Introduktion till programmering D0009E 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 ET S M D 1 8 0 S 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 ET S M D 1 8 0 S Y S T E M T E K N I K INTRODUKTION TILL PROGRAMMERING 5 Om moduler 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) L U L E Å T E K N I S K A U N I V E R S I T ET S M D 1 8 0 S 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 ET S M D 1 8 0 S 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 ET S M D 1 8 0 S 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.

Upload: others

Post on 25-Jan-2022

1 views

Category:

Documents


0 download

TRANSCRIPT

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!