Erfarenheter från labben Bra Jobbat! Lite ont om plats... Parprogrammering? Skillnad mellan program och funktion! Skillnad mellan uttryck och kommando! Välj bra variabelnamn! Vad göra om det blir fel? 1
Program vs funktion tal = input( Ange talet ) sum = 0 while tal > 0: sum += tal%10 tal = tal/10 print siffersumman är, sum def siffersum(tal): sum = 0 while tal > 0: sum += tal%10 tal = tal/10 return sum 2
Program vs funktion tal = input( Ange talet ) def siffersum(tal): sum = 0 while tal > 0: sum += tal%10 tal = tal/10 Precis samma sum = 0 while tal > 0: sum += tal%10 tal = tal/10 print siffersumman är, sum return sum 2
tal = input( Ange talet ) sum = 0 while tal > 0: sum += tal%10 tal = tal/10 print siffersumman är, sum def siffersum(tal): sum = 0 while tal > 0: sum += tal%10 tal = tal/10 return sum Ett program som läser och skriver data i terminalfönstret En funktion som kan anropas av andra program eller funktioner >>> Ange talet: 1338 siffersumman är 15 >>> >>> >>> siffersum(1338) 15 >>> 3
tal = input( Ange talet ) sum = 0 while tal > 0: sum += tal%10 tal = tal/10 print siffersumman är, sum def siffersum(tal): sum = 0 while tal > 0: sum += tal%10 tal = tal/10 return sum Ett program som läser och skriver data i terminalfönstret En funktion som kan anropas av andra program eller funktioner for n in range(1,10000): if siffersum(n)**3 == n: print n 3
Tumregler När du programmerar, skriv alltid som en samling funktioner. När du testar, skriv små program (inte nödvändigtvis funktioner). Så fort du gjort en ändring, testa! 4
Uttryck vs kommando Ett uttryck är något som har ett värde, ex 5+a hej *5 b == 9 Ett kommando är en instruktion till Python att göra något, ex print hej *5 if b == 9: break v = 5+a Obs skillnad mellan a == b (likhetstest) och a = b (tilldelning) 5
Funktionsanrop som uttryck och kommandon def f(x): return 2*x+3 def g(x): z = f(x)**2.. def f(x): print x*5 return def g(x): f(x) if x**2 > 3:.. Funktioner som avslutas med return <uttryck> används som uttryck Funktioner som avslutas med return används som kommandon 6
Mer precist: En funktion kan ha ett eller båda av: Returvärde (definieras i return) Sidoeffekter (tex print) def f(x): print x return 2*x+3.. tal = f(5).... f(5).. Skriver ut 5 och tilldelar tal 13 Skriver ut 5. Värdet 13 beräknas visserligen men slängs bums bort 7
Specialare: En funktion som avslutas med return ger faktiskt det speciella värdet None. Ex: def f(x): print x*3 return b = f(5) print b Anropar f som skriver ut 15. Värdet på b blir None Skriver alltså ut None Körexempel 8
Variabelnamn Undvik alltför lakoniska (a,b,c) Jättekorta namn bara vid begränsat scope Kapitulera inte för fantasibrist (bla, foo) Heller inte för långa! Upp till åtta bokstäver är bra. Detsamma gäller namn på funktioner 9
def bla(): l = 1 b = 0 c = 1 while l <= 50: print "x"*cl(l) if cl(a) > b: b = cl(a) c = a l += 1 print "m =", b, "n =",c 10
def hist_max(): loopvar = 1 maximum = 0 var_max = 1 while loopvar <= 50: print "x"*cl(loopvar) if cl(loopvar) > maximum: maximum = cl(loopvar) var_max = loopvar loopvar += 1 print "m =", maximum, "n =", var_max 11
Python: listor [1, 18, 4, 0] en lista med fyra element Ser ut som Matlabs arrayer, men VARNING! Mycket lite av Matlabs arrayoperationer finns i Pythons listoperationer, och vice versa, och de som finns gör inte säkert samma sak! Till att börja med, index för Pythonlistor börjar alltid på 0 a = [1, 18, 25, 137] a[0] är 1 a[1] är 18 Körexempel a[3] är 137 12
a = [123, 456, 47, 14] a: 123 456 47 14 a[1] = 99 a: 123 99 47 14 b = [123, 99, 47, 14] a: b: 123 99 47 14 123 99 47 14 a == b är True a is b är False 13
a = [123, 456, 47, 14] a: 123 456 47 14 b = a a == b är True a is b är True a: b: 123 456 47 14 a: a[1] = 99 b: 123 99 47 14 nu har också b[1] blivit 99 14
Operationer på listor len(a) ger längden på listan a min(a), max(a) ger minsta resp. största värdet i a a+b konkatenerar listorna a och b x in a ger True om x finns i listan a [] Tom lista Varning: sista elementet i listan a är 15
Operationer på listor len(a) ger längden på listan a min(a), max(a) ger minsta resp. största värdet i a a+b konkatenerar listorna a och b x in a ger True om x finns i listan a [] Tom lista Varning: sista elementet i listan a är a[len(a)-1] 15
Loopar och listor Paradigm 1 Paradigm 2 Obs att range(x) är (0,1,...,x-1) for element in a: loopkropp for index in range(len(a)): loopkropp Ett varv för varje element i listan. element används för att komma åt elementet, ex ## Summera kvadrater sum = 0 for element in a: sum += element**2 Ett varv för varje element i listan. index används för att komma åt indexet. ex ## Öka varje element med 1 for index in range(len(a)): a[index] += 1 16
Listletningsparadigm def findit(li) for element in li: if element > 10: return True return False Leta efter ett element större än 10. Om ett sådant finns returnera True, annars False def findit(li) for element in li: if element > 10: return element return def findit(li) for idx in range(len(li)): if li[idx] > 10: return idx return Leta efter ett element större än 10. Om ett sådant finns returnera det första sådana elementet, annars None Leta efter ett element större än 10. Om ett sådant finns returnera indexet till det första elementet, annars None Körexempel 17
Strängar En text omsluten av antingen enkla eller dubbla citationstecken a = Joachim b = tack för hjälpen J o a c h i m t a c k f ö r h j ä l p e n Några specialare används för radbyte etc. Oftast \n a = Heja!\nHeja print a H e j a! \n H e j a Heja! Heja 18
Strängar som listor Väldigt många listoperationer fungerar också på strängar a = Joachim a[1] är o a == b strängarna är lika tecken för tecken a < b alfabetisk ordning a + b konkatenering len(a) antal tecken i a x in a om delsträngen x finns i a tomma strängen En del fungerar inte på strängar, tex tilldelning av element a = Joachim a[1] = u Körexempel 19
Omvandla sträng/lista För att omvandla en sträng till en lista av tecken finns funktionen list: a = Joachim b = list(a) a [ J, o, a, c, h, i, m ] Åt andra hållet finns strängmetoden join a = [ h, e, j ] b =.join(a) print b hej 20
Metodanrop Likartat funktionsanrop men inleds av ett objekt följt av punkt. Objekt, i detta fall tomma strängen Metodnamn.join(a) Aktuella parametrar Punkt, markerar tillhörighet, typ den join som hör till tomma strängen 21
Från www.python.org Documentation 6.6.1: string methods str.join(seq) Return a string which is the concatenation of the strings in the sequence seq. The separator between elements is the string providing this method..join([ a, b, c ]) == abc xx.join([ a, b, c ]) == axxbxxc 22
Funktioner vs metoder Python har en stor mängd av båda och en återkommande huvudvärk är att komma ihåg vad som är funktion och vad som är metod! Längd len(a) funktion Slå ihop str.join(a) metod Maximum max(a) funktion Sortera a.sort() metod 23
Metoder ändrar ofta sitt objekt och fungerar som kommandon snarare än uttryck Ex: sort sorterar objektet och returnerar None b = [2,5,3,4].sort() Fel ger b = None b = [2,5,3,4] b.sort() Rätt ger b = [2,3,4,5] Exempel: sortera en textsträng b = Joachim a = list(b) a.sort() b =.join(a) # b innehåller mitt namn # gör om det till en lista # sortera listan # gör om listan till en sträng 24
Bygga upp lista stegvis Exempel: Lägg till elementet 137 till listan a 1. Använd plus a = a + [137] Skapar en kopia av listan och lägger till 137 2. append-metoden a.append(137) Utökar listan med 137 a: b: 123 456 47 14 a: 123 456 47 14 137 a: b: 123 456 47 14 137 b: 123 456 47 14 25
Inför lab 2: Lär er hitta på www.python.org och i Python pocket reference Läs på om listor och strängar Man behöver inte kunna allt. Man behöver kunna grunder. Man behöver kunna använda dokumentation. Allt är en träningssak. Körexempel 26