Experimente mit der Datenverwaltung
Lokale und globale Variablen
Wir betrachten ein verkürztes Programm zur Verschlüsselung mit einer Zuordnungstabelle.
Programm 1:
def verschluesselterText(klartext, schluessel): geheimtext = '' for zeichen in klartext: nummer = ord(zeichen)-ord('A') neuesZeichen = schluessel[nummer] geheimtext = geheimtext + neuesZeichen klartext = '' print() print('lokale Variablen:') print(locals()) print('globale Variablen:') print(globals()) return geheimtext # Testprogramm zuordnung = 'GKXCSLZUAHWDBMTYENJVPOIRFQ' aktuellerKlartext = 'OBELIX' geheimtext = None aktuellerGeheimtext = verschluesselterText(aktuellerKlartext, zuordnung) print() print(aktuellerKlartext) print(aktuellerGeheimtext) print() print('globale Variablen:') print(globals())
Beachte, dass hier mit print(locals())
und print(globals())
zusätzliche Ausgabeanweisungen eingefügt sind.
Aufgabe 1
Führe das Programm aus. Kannst du anhand der ausgegebenen Daten erschließen, was die Hilfsoperatoren
locals()
und globals()
als Ergebnisse zurückliefern?
Namenskonflikte
Darf man Variablen zur Verwaltung von Daten genauso benennen wie Parameter zur Verwaltung übergebener Daten?
Programm 2:
def verschluesselterText(klartext, schluessel): geheimtext = '' for zeichen in klartext: nummer = ord(zeichen)-ord('A') neuesZeichen = schluessel[nummer] geheimtext = geheimtext + neuesZeichen klartext = '' print() print('lokale Variablen:') print(locals()) print('globale Variablen:') print(globals()) return geheimtext # Testprogramm schluessel = 'GKXCSLZUAHWDBMTYENJVPOIRFQ' klartext = 'OBELIX' geheimtext = None geheimtext = verschluesselterText(klartext, schluessel) print() print(klartext) print(geheimtext) print() print('globale Variablen:') print(globals())
Beachte, dass hier die Parameter der Funktion verschluesselterText
dieselben Namen haben wie die Variablen im Tesprogramm zur Verwaltung der aktuellen Daten.
Aufgabe 2
Führe das Programm aus. Welche Schlüsse kannst du anhand der ausgegebenen Daten ziehen?
Seiteneffekte
Das folgende Programm benutzt eine Prozedur (Funktion ohne Rückgabe) zur Erzeugung des Geheimtextes.
Programm 3:
def textVerschluesseln(): global zuordnung global geheimtext global klartext geheimtext = '' for zeichen in klartext: nummer = ord(zeichen)-ord('A') neuesZeichen = zuordnung[nummer] geheimtext = geheimtext + neuesZeichen klartext = '' print() print('lokale Variablen:') print(locals()) print('globale Variablen:') print(globals()) # Testprogramm zuordnung = 'GKXCSLZUAHWDBMTYENJVPOIRFQ' klartext = 'OBELIX' geheimtext = None textVerschluesseln() print() print(klartext) print(geheimtext) print() print('globale Variablen:') print(globals())
Aufgabe 3
Führe das Programm aus. Was bewirken Anweisungen wie global geheimtext
?
Warum funktioniert die Datenverarbeitung mit einer Funktion ohne Rückgabe hier?
Verwendung globaler Variablen
Wir lassen jetzt Schritt für Schritt die Anweisungen global ...
weg, indem
wir sie auskommentieren.
Programm 4:
def textVerschluesseln(): #global zuordnung global geheimtext global klartext geheimtext = '' for zeichen in klartext: nummer = ord(zeichen)-ord('A') neuesZeichen = zuordnung[nummer] geheimtext = geheimtext + neuesZeichen klartext = '' print() print('lokale Variablen:') print(locals()) print('globale Variablen:') print(globals()) # Testprogramm zuordnung = 'GKXCSLZUAHWDBMTYENJVPOIRFQ' klartext = 'OBELIX' geheimtext = None textVerschluesseln() print() print(klartext) print(geheimtext) print() print('globale Variablen:') print(globals())
Aufgabe 4
Führe die modifizierten Programme aus. Was stellst du fest? Hast du eine Erklärung hierfür?