Powered by CoCalc

Funktioner

Sage är baserad på programmeringsspråket Python. Det gör det möjligt att definiera funktioner som består av flera steg. Med indrag i koden markerar man vad som ska ingå i definitionen av en funktion.
def fkn(x, y) : z = x^2 - 2 * y return z print u'Denna rad ingår inte i funktionen.'
Denna rad ingår inte i funktionen.
Vi anropar en egendefinierad funktion på samma sätt som inbyggda funktioner.
fkn(3, 1)
7
Notera att variabeln z i funktionen fkn ovan betraktas som lokal. Lokala variabler introduceras i en funktion genom tilldelning. Det innebär att vi inte kan komma åt dess värde utanför funktionen. Om en gobal variabel har samma namn som en lokal variabel, så påverkas inte den globala vid funktionsanrop.
z = 2 def fkn(x, y) : z = x * y return z fkn(3, 5) z # den globala versionen
15 2
För att förändra en variabel globalt i en funktion måste vi deklarera att variabel ska vara global.
z = 2 def fkn(x, y) : global z z = x^y return z fkn(3, 5) z
243 243
Det är tillåtet att inne i en funktion förändra en variabel som ingår i argumentet till funktionen.
def fkn(x, y) : print 'Indata x =', x x = 2 * y - x print u'Nytt värde: x =', x z = x/y return z fkn(1, 2)
Indata x = 1 Nytt värde: x = 3 3/2
Det går bra att ange förvalda värden på variablerna i argumentet till en funktion. Ett förvalt värde används om man utelämnar argument vid funktionsanrop.
def fkn(x = 2, y = -4) : z = 2 * x + y return z fkn(1, 1)
3
fkn() # förvalda värden x = 2 och y = -4
0
Första argumentet är x. Vill man endast ändra denna anger enbart det värdet.
fkn(5) # behåll det förvalda värdet på y
6
Vi kan precisera vilka värden respektive variabel ska ha vid funktionsanropet.
fkn(y = 1) # behåll det förvalda värdet på x
5
fkn(x = 3, y = 1)
7
fkn(y = 1, x = 3) # ordningen har inte betydelse
7
Man kan lägga till en förklarande text i definitionen av en funktion. Med funktionen help visar man hjälptexten.
def palindrom(t) : """Returnerar ett palindrom baserat på textsträngen t, d.v.s. konkateneringen av t med sig själv (spegelvänd).""" p = t + t[::-1] return p
palindrom('Paris')
'ParissiraP'
palindrom('Sage + Python = sant!')
'Sage + Python = sant!!tnas = nohtyP + egaS'
help(palindrom)
Help on function palindrom: palindrom(t) Returnerar ett palindrom baserat på textsträngen t, d.v.s. konkateneringen av t med sig själv (spegelvänd).

Exempel (Collatz förmodan)

Låt a0a_0 vara ett positivt heltal och sätt an={3an1+1om an1 a¨r uddaan1/2om an1 a¨r ja¨mn, a_n = \begin{cases} 3a_{n-1} + 1 & \text{om $a_{n-1}$ är udda} \\ a_{n-1}/2 & \text{om $a_{n-1}$ är jämn}, \end{cases} för alla positiva heltal nn. Collatz förmodan säger att det existerar ett positivt heltal NN sådant att aN=1a_N = 1. Låt oss definiera en funktion som bestämmer talföljden (a0,a1,a2,,aN)(a_0, a_1, a_2, \ldots, a_N).
def Collatz(a_n) : """Returnerar Collatz talföljd (a_0, a_1, a_2, ..., a_N).""" C = [a_n] while a_n != 1 : if is_odd(a_n) : a_n = 3*a_n + 1 else : a_n = a_n/2 C.append(a_n) return C
help(Collatz)
Help on function Collatz: Collatz(a_n) Returnerar Collatz talföljd (a_0, a_1, a_2, ..., a_N).
Collatz(10)
[10, 5, 16, 8, 4, 2, 1]
Collatz(100)
[100, 50, 25, 76, 38, 19, 58, 29, 88, 44, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1]
Collatz(1024)
[1024, 512, 256, 128, 64, 32, 16, 8, 4, 2, 1]