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