240 likes | 347 Views
Föreläsning 6. Funktioner, filer, särfall och lite om klasser. Anrop med parameternamn. Funktioner kan anropas med parameternamn. >def f(x): return x * x >f(x = 4) 16. Default-parametrar. Ibland har en parameter ett naturligt default-värde. >def f(x = 3): return x * x
E N D
Föreläsning 6 Funktioner, filer, särfall och lite om klasser
Anrop med parameternamn • Funktioner kan anropas med parameternamn. >def f(x): return x * x >f(x = 4) 16
Default-parametrar • Ibland har en parameter ett naturligt default-värde. >def f(x = 3): return x * x >f(4) 16 >f(x = 6) 36 >f() 9
Default-parametrar • Man kan ha varierande antal default-parametrar, men bara på slutet. >def f(x = 3, y): return x * x ??? error ??? >def f(x, y = 3): return x * y >f(4) 12 >f(x = 9, y = 7) 63
Namnrum • Varje variabel, funktion eller klass som definieras tillhör ett namnrum. • Detta är praktiskt för att undvika namnkollisioner. • Varje modul har sitt eget globala namnrum. • Varje funktion har sitt namnrum. Nästlade funktioner ger upphov till nästlade namnrum. • Inbyggda variabler, funktioner, och klasser finns i __builtin__
Namnrum file = open(”a.txt”)# Global module vars x = 1 y = 2 def f(): # f is global func. x = 3 # x is local to f. It # shadows global x print y # y is global def g(): # g is local to f print x # x is enclosing g() # to g f()
Namnrum __builtin__ name space open module name space file,x,y,f f’s name space x,g g’s name space
Tilldelning skapar namn! • Vid tilldelning till variabelnamn som inte hittas i lokalt namnrum skapas en ny variabel i aktuellt lokalt namnrum oavsett om variabeln kan refereras. x = 1 def f(): x = 3 # Creates new var! f()
Vilket namn används? • Vilket namn som används vid referering bestäms enligt LEGB-regeln: • Local • Enclosing • Global • Built-in
global • Python har olyckligtvis beskaffats med nyckelordet global. Unvik det! x = 3 def f(): global x x = 4 # Changes value of x f() print x
Dokumentera • Python låter oss knyta dokumentation till moduler, funktioner och klasser som senare kan kommas åt med __doc__. ”””My module doc””” # Start module def f(): ”””My f doc””” # Start func class A: ”””My A doc””” # Start class
Öppna fil En fil kan öppnas på flera vis: • För läsning: file = open(”filename.txt”, ”r”) • För skrivning (skriver över befintlig fil) file = open(”filename.txt”, ”w”) • För tillägg till slutet av filen: file = open(”filename.txt”, ”a”) • Ytterligare alternativ ”r+”, ”w+”, ”a+” fungerar som utan plus fast man kan både skriva och läsa.
Läs från öppen fil • Hela filen: contents = file.read() • Bestämt antal tecken: fiveChars = file.read(5) • En rad: oneLine = file.readline() • Alla rader till en lista: allLines = file.readlines()
Skriv till öppen fil och stäng • Skriv sträng file.write(”Hejsan hoppsan”) • Elementen i en lista: file.writelines() • När du läst eller skrivit klart från/till en fil så stänger du den: file.close()
Pickling (skriv) • Skriv komplicerade objekt till fil: import cPickle myfile = open(”myfile.txt”, ”w”) l = [(1,2),”hejsan”,[”a”,”b”]] cPickle.dump(l, myfile) myfile.close()
Pickling (läs) • Läs komplicerade objekt från fil: import cPickle myfile = open(”myfile.txt”, ”r”) l = cPickle.load(myfile) myfile.close() print l ger: [(1,2),”hejsan”,[”a”,”b”]]
Shelve-ing (skriv) • ”Random access” skriv till fil: import shelve dic = shelve.open(”myf.txt”, ”w”) dic[”myobj”] = [(1,2),”hejsan”] dic.sync() dic.close()
Shelve-ing (läs) • ”Random access” läs från fil: import shelve dic = shelve.open(”myf.txt”, ”r”) print dic[”myobj”] dic.close() Ger: [(1,2),”hejsan”]
Särfall • När något oväntat händer i ett program kan detta hanteras med särfall (eng. exception). • Särfall påverkar den normalt exekverade koden minimalt och ökar läsbarheten. • Särfall förenklar strukturerad felhantering.
Fånga särfall • Det finns flera sorters särfall (se boken) och nya kan skapas (senare i kursen). Särfall fångas med try och except try: n = int(raw_input(”Enter int: ”)) except: print ”Input not an int!”
Fånga särfall • Särfall kan hanteras olika beroende på sort: try: n = int(raw_input(”Enter int: ”)) print 1/n except(ValueError), e print ”Input not an int: ” + e except(ZeroDivisionError), e print ”Zero is not allowed: ” + e
Klass • Används för att dela upp ett program i lätthanterliga och återanvändbara delar. • En klass fångar ett koncept. • Klasser förenklar återanvändning av kod genom arv. • Klasser förenklar inkapsling och abstraktion. • En klass kan ha flera instanser med olika data.
Skapa klass class MyClass(object): count = 0 # Class var def __init__(self, name): # Constructor self.name = name MyClass.count += 1 def printName(self): # Inst. method print self.name def getCount(): # Class method return MyClass.count getCount = staticmethod(getCount)
Använd klass mc1 = MyClass(”Douglas”) mc2 = MyClass(”Lars”) mc1.printName() MyClass.getCount() Ger: Douglas 2