Python Material Installation Dokumentation PythonKara Grundlagen Namensräume Funktionen Testen Strings Dictionary Listen Zeitmessungen Zufall Bits+Bytes Module Sockets xml serielle Schnittstelle Python in HTML Turtle xturtle Tkinter OOP Threads Zusicherungen exe Patterns GnuPlot Goto MySQL CGI Dateien Exceptions Grafik Mathematik Fischertechnik Unicode funktional Iterator Sound C Debugger regex Pfade Docstrings Django Bluetooth format Bytecode signal
Pfad: Startseite / Fächer / Informatik / Python / Funktionen
Autor: mk
03.03.2010 18:40
2458
Unterprogramme

Beispiel 1

f1 f1.py

Beispiel 2

# -*- 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'

f2.py

Seiteneffekte

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?

Tipps zur Vermeidung von Seiteneffekten

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.

Funktionen mit beliebiger Anzahl von Parametern

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]
>>>

Links