i

Einstieg - Seiteneffekte

Ungereimtheiten bei der Bildverarbeitung

Schwarz-Weiß-Bilder kann man mit Hilfe von Bitfolgen repräsentieren (vgl. auch Exkurs - PBM, PGM, PPM).

Die folgende Funktion soll zum Invertieren von Schwarz-Weiß-Bildern benutzt werden.

def invertiereBild(L):
    """
    das in L dargestellte Bild wird invertiert
    d.h.: aus 0 wird 1 und aus 1 wird 0
    """
    for i in range(3, len(L)):
        if L[i] == 0:
            L[i] = 1
        else:
            L[i] = 0
    return L

Hier ein Test der Funktion:

>>> invertiereBild(['P1', 3, 3, 1, 1, 1, 1, 0, 1, 1, 1, 1])
['P1', 3, 3, 0, 0, 0, 0, 1, 0, 0, 0, 0]

Die Funktion invertiereBild wird jetzt in ein etwas umfangreicheres Programm integriert.

def invertiereBild(L):
    """
    das in L dargestellte Bild wird invertiert
    d.h.: aus 0 wird 1 und aus 1 wird 0
    """
    for i in range(3, len(L)):
        if L[i] == 0:
            L[i] = 1
        else:
            L[i] = 0
    return L

def addBit(i, j):
    """
    die Bits i und j werden wie folgt addiert:
    0+0->0; 0+1->1; 1+0->1; 1+1->1
    """
    s = i+j
    if s == 2:
        s = 1
    return s

def addBilder(M, N):
    """
    die Bitfolgen in M und N werden Bit für Bit addiert
    """
    L = []
    for i in range(len(M)):
        if i < 3:
            L = L + [M[i]]
        else:
            L = L + [addBit(M[i], N[i])]
    return L

Aufgabe 1

(a) Schau dir zunächst das Programm an. Was erwartest du als Ergebnis beim folgenden Testdialog?

>>> bild = ['P1', 3, 3, 1, 1, 1, 1, 0, 1, 1, 1, 1]
>>> bild
['P1', 3, 3, 1, 1, 1, 1, 0, 1, 1, 1, 1]
>>> negativ = invertiereBild(bild)
>>> negativ
['P1', 3, 3, 0, 0, 0, 0, 1, 0, 0, 0, 0]
>>> neuesBild = addBilder(bild, negativ)
>>> neuesBild
???

(b) Führe das Programm aus und vergleich das Ergebnis mit deinen Erwartungen. Alles klar?

Aufgabe 2

Teste noch einmal die Funktion invertiereBild. Kannst du jetzt das Verhalten des Programms oben erklären?

def invertiereBild(L):
    """
    das in L dargestellte Bild wird invertiert
    d.h.: aus 0 wird 1 und aus 1 wird 0
    """
    for i in range(3, len(L)):
        if L[i] == 0:
            L[i] = 1
        else:
            L[i] = 0
    return L

# Test

bild = ['P1', 3, 3, 1, 1, 1, 1, 0, 1, 1, 1, 1]
print(bild)
negativ = invertiereBild(bild)
print(negativ)
print(bild)
negativ = invertiereBild(bild)
print(negativ)
print(bild)

Ungereimtheiten mit einem Zählerprogramm

Betrachte das folgende einfache Programm:

from zaehler import *

def tausche(x, y):
    return (y, x)

# Test

print(tausche(2, 3))
print(tausche(1, 1))
print(getZaehler())
print(tausche(getZaehler(), getZaehler()))

Die Testaufrufe liefern die folgenden Ergebnisse:

(3, 2)
(1, 1)
1
(3, 2)

Aufgabe 3

(a) Warum ist das Ergebnis etwas merkwürdig? Woran könnte das liegen?

(b) Zur Beurteilung sollte man auch in die Datei zaehler.py schauen, deren Definitionen importiert und benutzt werden. Ist jetzt alles klar?

zaehler = 0

def getZaehler():
    global zaehler
    zaehler = zaehler + 1
    return zaehler

Suche

v
10.1.1.3
www.inf-schule.de/deklarativ/funktionaleprogrammierung/warumfunktional/einstieg_seiteneffekte

Rückmeldung geben