HSG |
|
# -*- coding: iso-8859-1 -*- # Autor: mk, Datum: 6.6.08 # Unterprogramm def durchschnitt(L): # L Notenverteilung, z.B. L = [2,5,11,8,3,1] n=0 # n Gesamtzahl der Arbeiten s=0 # s Summe aller Noten for i in range(6): n = n+L[i] s = s+L[i]*(i+1) return float(s)/n # Rückgabewert der Funktion # Test if __name__ == '__main__': d = durchschnitt([2,5,11,8,3,1]) if abs(d-float(98)/30) < 1E-10: print 'Durchschnitt: '+str(round(d,2))+', Test1: OK'
Hat eine Funktion mehr als die beabsichtigte Wirkung, so spricht man von Seiteneffekten.
Im Rahmen einer Implementierung von MiniFloats wurden folgende Funktionen geschrieben.
def ha(a,b): """ Halbaddierer, a = 0 oder 1, b = 0 oder 1 """ s = a^b ue = a&b return [s,ue] def va(a,b,c): """ Volladdierer, a = 0 oder 1, b = 0 oder 1, c = 0 oder 1 """ [s1,ue1] = ha(a,b) [s,ue2] = ha(s1,c) ue = ue1|ue2 return [s,ue] def gl(a,b): """ die beiden Listen a und b werden dadurch auf gleiche Länge gebracht, dass die kürzere von vorne mit Nullen aufgefüllt wird """ na = len(a) nb = len(b) if na < nb: n = nb while len(a) < n: a = [0]+a else: n = na while len(b) < n: b = [0]+b return [a,b] def addbin(a,b): """ die beiden 'Binär-Listen' a und b werden addiert """ [a,b] = gl(a,b) n = len(a) ue = 0 s = [] for i in range(n-1,-1,-1): [si,ue] = va(a[i],b[i],ue) s = [si]+s return s def zweierkomplement(a): """ zur 'Binär-Liste' a wird das Zweierkomplement gebildet """ n = len(a) for i in range(n): a[i] = 1-a[i] return add1(a)
Teste die Funktionen auf Seiteneffekte. An welchen Stellen kannst du Seiteneffekte vorhersagen?
Linke Seiten von Wertzuweisungen kontrollieren, ob 'mutable' Objekte wie z.B. Listen vorkommen. Gegebenfalls mit einer Kopie arbeiten, bei einer Liste a bewirkt etwa die Anweisung a = a[:], dass der lokale Name a in a[:] zwar noch auf die - eventuell globale - Liste zeigt, aber nach der Zuweisung auf eine Kopie.
Wird vor einen formalen Parameter ein * geschrieben, so repräsentiert der Parameter ein - eventuell leeres - Tupel von Argumenten.
def ItoB(n,*args): """ n wird in eine Liste von 0-en und 1-en verwandelt ein optionales zweites Argument gibt eine Länge an, auf die die Liste mit führenden Nullen gefüllt wird """ b = [] while n > 0: if n%2 == 1: b = [1]+b else: b = [0]+b n = n/2 if len(args) > 0: while len(b) < args[0]: b = [0]+b return b
Beispielaufrufe in der Shell:
>>> ItoB(5) [1, 0, 1] >>> ItoB(5,8) [0, 0, 0, 0, 0, 1, 0, 1] >>>