Präsentation herunterladen
Die Präsentation wird geladen. Bitte warten
1
Programmierung mit Python
Klaus Becker 2017
2
Programmierung mit Python
3
Vorbemerkungen zu Python
Teil 0 Vorbemerkungen zu Python
4
Entwicklungsgeschichte
Die Sprache wurde Anfang der 1990er Jahre von Guido van Rossum am Centrum voor Wiskunde en Informatica (Zentrum für Mathematik und Informatik) in Amsterdam als Nachfolger für die Programmier-Lehrsprache ABC entwickelt, ursprünglich für das verteilte Betriebssystem Amoeba. Alle bisherigen Implementierungen der Sprache übersetzen den Text eines Python-Programms transparent in einen Zwischencode, der dann von einem Interpreter ausgeführt wird. Der Name geht nicht etwa (wie das Logo vermuten ließe) auf die gleichnamige Schlangengattung Pythons zurück, sondern bezog sich ursprünglich auf die englische Komikertruppe Monty Python. In der Dokumentation finden sich daher auch einige Anspielungen auf Sketche aus dem Flying Circus. Trotzdem etablierte sich die Assoziation zur Schlange, was sich u. a. in der Programmiersprache Cobra sowie dem Python Toolkit „Boa“ äußert. Quelle: Wikipedia
5
Python - Ziele Python wurde mit dem Ziel entworfen, möglichst einfach und übersichtlich zu sein. Dies soll durch zwei Maßnahmen erreicht werden: Zum einen kommt die Sprache mit relativ wenigen Schlüsselwörtern aus, zum anderen ist die Syntax reduziert und auf Übersichtlichkeit optimiert. Dies führt dazu, dass Python eine Sprache ist, in der man schnell, einfach und leicht programmieren kann. Sie ist daher besonders dort geeignet, wo Übersichtlichkeit und Lesbarkeit des Codes eine herausragende Rolle spielen – z. B. in der Teamarbeit, bei Beschäftigung mit dem Quelltext nach längeren Pausen oder bei Programmieranfängern. Durch die Möglichkeit, auch Programme anderer Sprachen als Modul einzubetten, werden viele Nischen in der Programmierung abgedeckt. Bei Bedarf lassen sich so beispielsweise zeitkritische Teile durch maschinennah in C programmierte Routinen ersetzen, oder Python kann als Skriptsprache eines anderen Programms dienen (Beispiele: OpenOffice.org, Blender, Maya, PyMOL, SPSS und GIMP). Quelle: Wikipedia
6
Python - Ziele Python ist eine Multiparadigmensprache. Das heißt, es zwingt den Programmierer nicht zu einem einzigen bestimmten Programmierparadigma, sondern erlaubt es, das für die jeweilige Aufgabe am besten geeignete Paradigma zu wählen. Objektorientierte und strukturierte Programmierung werden vollständig unterstützt, weiterhin gibt es Spracheigenschaften für funktionale und aspektorientierte Programmierung. Quelle: Wikipedia Quelle:
7
Interne Abläufe Compiler Interpreter
Der Quelltext eines Python Programms wird mit einem Texteditor geschrieben (z.B. Idle oder PyScripter). Der Python-Compiler erzeugt einen (maschinenunabhängigen) Byte-Code. Der Compiler entscheidet selbst, ob der Byte-Code nur als Zwischenprodukt im Arbeitsspeicher erzeugt wird, oder ob er auch als .pyc-Datei gespeichert wird. Compiler Der Python-Interpreter führt den vom Compiler erzeugten Byte-Code aus. Derselbe Byte-Code kann auf verschiedenen Plattformen ausgeführt werden, sofern diese einen Python-Interpreter zur Verfügung stellen. Interpreter
8
Entwicklungsumgebung Idle
Standard-Entwicklungsumgebung
9
Entwicklungsumgebung PyScripter
„Portable Python is not being developed anymore.“
10
Entwicklungsumgebung Thonny
„Python IDE for beginners“
11
Literatur Johannes Ernesti, Peter Kaiser: Python 3. Das umfassende Handbuch. Galileo Computing (Preis: 40 €) Michael Weigend: Objektorientierte Programmierung mit Python. mitp (Preis: 40 €) Michael Weigend: Python Ge-Packt. mitp (Preis: 16 €) Thomas Theis: Einstieg in Python 3. Galileo Computing (Preis: 25 €) Gregor Lingl: Python für Kids. bhv (Preis: 20 €) P. Barry, D. Griffiths: Programmieren von Kopf bis Fuß. O´Reilly 2010 (Preis: 20 €) ...
12
Materialien Internet: Python Official Website http://www.python.org/
Python-Tutorium von Guido van Rossum: offenes eBook von von Peter Kaiser und Johannes Ernesti (Python 2.5): PythonWiki: Python-Kurs von W.Spiegel: Python, Programmieren macht Spaß : BICS: Unterrichtsmaterialien von Klaus Merkert: Unterrichtsmaterialien auf
13
Teil 1 Datenverwaltung mit Variablen -
Miniprojekt: Populationsentwicklung
14
Populationsentwicklung
Zielsetzung: Im Folgenden soll die Entwicklung einer Mäusepopulation simuliert werden. Ziel ist es, sich mit Hilfe automastisierter Berechnungen einen Überblick über die Größe und Zusammensetzung einer sich fortpflanzenden Mäusepopulation zu verschaffen. Modellannahmen: Unterteilung in drei Alterklassen: junge Mäuse, erwachsene Mäuse und alte Mäuse. In jedem Schritt erfolgt ein Wechsel der Altersklasse: Junge Mäuse werden erwachsen, erwachsene werden alt (und alte Mäuse leider nicht mehr jung). Nur ein bestimmter Anteil (siehe Diagramm) erreicht die nächste Altersstufe. Im Diagramm sind zusätzlich die Geburtenraten eingetragen. Wir gehen davon aus, dass jede erwachsene Maus (im Durchschnitt) vier junge Mäuse erzeugt und dass jede alte Maus (im Durchschnitt) zwei junge Mäuse erzeugt.
15
Berechnung der Populationswerte
Aufgabe: Berechne die Populationswerte (ohne Python). Zur Kontrolle: Nach 5 Schritten besteht die gesamte Population aus knapp 300 Mäusen. Schritt 1 2 3 4 5 ... jung 6 60 = 4*9+2*12 erwachsen 9 3 = 6:2 alt 12 3 = 9:3
16
Python als Taschenrechner
>>> jung = 6 >>> erwachsen = 9 >>> alt = 12 >>> jung 6 >>> erwachsen 9 >>> alt 12 >>> alt = erwachsen // 3 >>> erwachsen = jung // 2 >>> jung = erwachsen*4 + alt*2 ... Aufgabe: (a) Probiere das selbst aus. Versuche auch zu verstehen, wie die ausgegebenen Zahlenwerte zustande kommen. (b) Irgend etwas stimmt aber nicht. Eigentlich sollten es nach einem Simulationsschritt 60 junge Mäuse sein. Woran liegt es, dass hier ein falsches Ergebnis herauskommt? (c) Benutze Hilfsvariablen, um noch benötigte Zahlenwerte zwischenzuspeichern. (d) Kann man die Berechnungen auch mit Hilfe einer einzigen Hilfsvariablen durchführen?
17
Experimente mit dem Python-Tutor
Aufgabe: Benutze den Python Tutor ( um die Verarbeitung der Daten zu verdeutlichen. Experimente mit dem Python-Tutor
18
Experimente mit dem Python-Tutor
Aufgabe: (a) Die Gesamtanzahl der Mäuse soll auch verwaltet werden. Führe hierzu eine geeignete Variable und geeignete Berechnungen ein. (b) Zusätzlich soll auch noch der jeweilige Schrittzahl verwaltet werden. Ergänze die Anweisung und teste. (c) Bei der Berechnung des nächsten Populationszustands wurde ein etwas merkwürdig aussehendes Divisionszeichen // benutzt. Teste, wie es sich auswirkt, wenn man anstatt des Divisionszeichens // das geläufigere Zeichen / benutzt. Was stellst du fest?
19
Experimente mit Thonny
In der Einstellung [View][Variables] zeigt Thonny stets den aktuellen Variablenzustand an.
20
Experimente mit Thonny
Aufgabe: (a) Die Gesamtanzahl der Mäuse soll auch verwaltet werden. Führe hierzu eine geeignete Variable und geeignete Berechnungen ein. (b) Zusätzlich soll auch noch der jeweilige Schrittzahl verwaltet werden. Ergänze die Anweisung und teste. (c) Bei der Berechnung des nächsten Populationszustands wurde ein etwas merkwürdig aussehendes Divisionszeichen // benutzt. Teste, wie es sich auswirkt, wenn man anstatt des Divisionszeichens // das geläufigere Zeichen / benutzt. Was stellst du fest?
21
Fachkonzept - Variable
Variablen dienen in der Informatik dazu, Daten zu verwalten. Eine Variable ist ein Name, der (in der Regel) mit einem Datenobjekt verknüpft ist. Variable Wert jung 6 erwachsen 9 alt 12 Variablenzustand Als Wert einer Variablen wird das Datenobjekt angesehen, das von der Variablen verwaltet wird. Ein Variablenzustand beschreibt die aktuell vorliegenden Variablen mit den verwalteten Daten.
22
Fachkonzept - Zuweisung
Mit einer Zuweisung kann man eine Variable mit einem neuen Datenobjekt verknüpfen. Zustand - vorher Zuweisungszeichen {jung -> 6; erwachsen -> 9; alt -> 12} alt = erwachsen // 3 alt = erwachsen // 3 Auswertung alt -> 3 Variable Term {jung -> 6; erwachsen -> 9; alt -> 3} Zustand - nachher Aufbau einer Zuweisung: Eine Zuweisung besteht aus einer Variablen (der ein Wert zugewiesen wird) and einem Term (der den zuzuweisenden Wert festlegt). Auswertung einer Zuweisung: Erst wird der Wert des Terms mit Hilfe des aktuellen Variablenzustands ermittelt. Dieser Wert wird dann der Variablen als neuer aktueller Wert zugewiesen.
23
Dialog im Ausführfenster
Wenn man bei einem Dialog im Ausführfenster einen Fehler macht, muss man neu anfangen. >>> jung = 6 >>> erwachsen = 9 >>> alt = 12 >>> jung 6 >>> erwachsen 9 >>> alt 12 >>> alt = erwachsen // 3 >>> erwachsen = jung // 2 >>> jung = erwachsen*4 + alt*2 18 3 >>> jung = 6 >>> erwachsen = 9 >>> alt = 12 >>> jung 6 >>> erwachsen 9 >>> alt 12 >>> hilf = erwachsen*4 + alt*2 >>> alt = erwachsen // 3 >>> erwachsen = jung // 2 >>> jung = hilf 60 3 Fehler! Dialog im Ausführfenster
24
Ausführung eines Programms
jung = 6 erwachsen = 9 alt = 12 hilf = erwachsen*4 + alt*2 alt = erwachsen // 3 erwachsen = jung // 2 jung = hilf Aufgabe: Öffne ein Programmfenster und gib die Anweisungen zur Berechnung der Entwicklung der Mäusepopulation hier ein. Speichere die Anweisungen in einer Datei ab. Mit einen Run-Befehl kann man jetzt die Anweisungen von Python ausführen lassen. Anschließend kann man sich im Ausführfenster die aktuell von den Variablen verwalteten Werte anzeigen lassen. Programmfenster Run Module >>> >>> jung 60 >>> erwachsen 3 >>> alt Ausführfenster
25
Programm mit Ausgabeanweisungen
jung = 6 erwachsen = 9 alt = 12 hilf = erwachsen*4 + alt*2 alt = erwachsen // 3 erwachsen = jung // 2 jung = hilf print(jung) print(erwachsen) print(alt) Aufgabe: Teste auch die folgenden Ausgabeanweisungen: (a) Version 1: print(jung, erwachsen, alt) (b) Version 2 print('Anzahl junger Mäuse: ', jung) print('Anzahl erwachsener Mäuse: ', erwachsen) print('Anzahl alter Mäuse: ', alt) Programmfenster Run Module >>> 60 3 Ausführfenster
26
Programm mit Kommentaren
# Initialisierung jung = 6 erwachsen = 9 alt = 12 # Verarbeitung hilf = erwachsen*4 + alt*2 alt = erwachsen // 3 erwachsen = jung // 2 jung = hilf # Ausgabe: print('Die berechneten Populationswerte sind:') print('Anzahl junger Mäuse: ', jung) print('Anzahl erwachsener Mäuse: ', erwachsen) print('Anzahl alter Mäuse: ', alt) Aufgabe: Teste das Programm. Erkläre sämtliche Bestandteile des Programms. Erkläre, wie die Ausgaben zustande kommen. Programmfenster Run Module >>> Die berechneten Populationswerte sind: Anzahl junger Mäuse: 60 Anzahl erwachsener Mäuse: 3 Anzahl alter Mäuse: 3 Ausführfenster
27
Fachkonzept - Programm
Ein (Python-) Programm ist eine Folge von (Python-) Anweisungen und Kommentaren. Der Programmtext wird auch Quelltext genannt. # Initialisierung jung = 6 erwachsen = 9 alt = 12 # Verarbeitung hilf = erwachsen*4 + alt*2 alt = erwachsen // 3 erwachsen = jung // 2 jung = hilf # Ausgabe print('Die berechneten Populationswerte sind:') print('Anzahl junger Mäuse: ', jung) print('Anzahl erwachsener Mäuse: ', erwachsen) print('Anzahl alter Mäuse: ', alt) Beachte: Jede Anweisung wird im Quelltext in eine neue Zeile geschrieben. Quelltext
28
Verständlichkeit von Programmen
Programme sollten immer so geschrieben werden, dass man sie leicht versteht und man sie so später gut überarbeiten kann. # Initialisierung jung = 6 erwachsen = 9 alt = 12 # Verarbeitung hilf = erwachsen*4 + alt*2 alt = erwachsen // 3 erwachsen = jung // 2 jung = hilf # Ausgabe print('Die berechneten Populationswerte sind:') print('Anzahl junger Mäuse: ', jung) print('Anzahl erwachsener Mäuse: ', erwachsen) print('Anzahl alter Mäuse: ', alt) Die Verständlichkeit eines Programms wird durch sogenannte sprechende Bezeichner deutlich erhöht. Ein sprechende Bezeichner ist ein Name (z. B. für eine Variable), der die Bedeutung des bezeichneten Gegenstands möglichst gut wiedergibt. Kommentare dienen dazu, die Bedeutung von Programmteilen zu erläutern. Kommentare werden eigentlich nur für die Menschen ergänzt, die den Quelltext bearbei-ten. Bei der Ausführung von Programmen werden sie ignoriert. Quelltext
29
Jeder macht Fehler! # Initialisierung Aufgabe: jung = 6
erwachsen = 9 alt = 12 # Verarbeitung hilf = erwachsen*4 + alt*2 alt = erwachsen // 3 erwachsen = jung // 2 jung = hilf # Ausgabe print('Die berechneten Populationswerte sind:' print('Anzahl junger Mäuse: ', jung) print('Anzahl erwachsener Mäuse: ', erwachsen) print('Anzahl alter Mäuse: ', alt) Aufgabe: Irgendwo hat sich ein Fehler eingeschlichen. Aber wo? Wie ist die Fehlermeldung hier zu verstehen? Achtung: Tippfehler Run Module Bei einem Syntaxfehler hat man eine Regel der gewählten Programmiersprache nicht beachtet.
30
Jeder macht Fehler! # Initialisierung Aufgabe: jung = 6
erwachsen = 9 alt = 12 # Verarbeitung hilf = erwachen*4 + alt*2 alt = erwachsen // 3 erwachsen = jung // 2 jung = hilf # Ausgabe print('Die berechneten Populationswerte sind:') print('Anzahl junger Mäuse: ', jung) print('Anzahl erwachsener Mäuse: ', erwachsen) print('Anzahl alter Mäuse: ', alt) Aufgabe: Hier gibt es ebenfalls eine Fehlermeldung. Warum? Achtung: Tippfehler Run Module >>> Traceback (most recent call last): File … line 6, in <module> hilf = erwachen*4 + alt*2 NameError: name 'erwachen' is not defined Laufzeitfehler treten während der Abarbeitung des Programms (zur Laufzeit) auf.
31
Jeder macht Fehler! # Initialisierung Aufgabe: jung = 6
erwachsen = 9 alt = 12 # Verarbeitung hilf = erwachsen*4 + alt*2 alt = erwachsen // 3 erwachen = jung // 2 jung = hilf # Ausgabe print('Die berechneten Populationswerte sind:') print('Anzahl junger Mäuse: ', jung) print('Anzahl erwachsener Mäuse: ', erwachsen) print('Anzahl alter Mäuse: ', alt) Aufgabe: Irgendwo hat sich ein Fehler eingeschlichen. Aber wo? Warum ist es so schwierig, den zu finden? Tipp: Benutze im Ausführfenster die folgende Anweisung: >>> globals() Achtung: Tippfehler Run Module >>> Die berechneten Populationswerte sind: Anzahl junger Mäuse: 60 Anzahl erwachsener Mäuse: 9 Anzahl alter Mäuse: 3 Logische Fehler liegen vor, wenn das System nicht die beabsichtigten Ausgaben erzeugt.
32
Fehlersuche Python Tutor
Die Fehlersuche ist manchmal ganz schön schwierig. Die Erzeugung von Variablen und die Veränderung von Variablenzuständen kann man sehr gut mit dem Python Tutor nachverfolgen.
33
Debugging mit Thonny [F5] Wechsel in den Debugging-Modus
[F6] großer Schritt bei der Ausführung [F5] kleiner Schritt bei der Ausführung [Stop] Ende des Debugging-Modus
34
Fachkonzept - Debugger
Ein Debugger ist ein Werkzeug zum Diagnostizieren und Auffinden von Fehlern. Aufgabe: Teste den Debugger von Thonny.
35
Wiederholte Berechnungen
# Initialisierung ... # Verarbeitung schritt = 0 hilf = erwachsen*4 + alt*2 alt = erwachsen // 3 erwachsen = jung // 2 jung = hilf schritt = schritt + 1 # Ausgabe: Zur Simulation der Entwicklung der Mäusepopulation haben wir bisher ein Programm entwickelt, das die Berechnungen für einen einzigen Simulationsschritt durchführt. Interessanter wird es, wenn die Simulation über mehrere Schritte laufen soll. Aufgabe: Wie müsste man das Programm ergänzen, wenn genau 10 (bzw. 100) Simulationsschritte durchgeführt werden sollen? Warum ist der gezeigte Lösungsansatz nicht praktikabel? Programm mit einer Folge von Zuweisungen
36
Wiederholte Berechnungen
# Initialisierung jung = 6 erwachsen = 9 alt = 12 # Verarbeitung schritt = 0 while schritt < 10: hilf = erwachsen*4 + alt*2 alt = erwachsen // 3 erwachsen = jung // 2 jung = hilf schritt = schritt + 1 # Ausgabe print("Neue Populationswerte:") print("Anzahl der Schritte: ", schritt) print("Anzahl junger Maeuse: ", jung) print("Anzahl erwachsener Maeuse: ", erwachsen) print("Anzahl alter Maeuse: ", alt) Aufgaben: (a) Erkläre, warum der Si-mulationsschritt hier genau 10 mal durchgeführt wird. (b) Ändere das gezeigte Programm so ab, dass folgende Aufgaben erledigt werden können: - In jedem Berechnungs-schritt sollen die aktuellen Populationswerte ausgegeben werden. - Die Anzahl der Wiederholungen wird mit einer Variablen verwaltet. - Es wird vorab eine Gesamtanzahl von Mäusen vorgegeben, bis zu der die Simulation durchgeführt werden soll. Ausgabe: Anzahl der Schritte. Programm mit Wiederholungsanweisung
37
Fachkonzept - Wiederholung
Eine Solange-Wiederholung besteht aus einer Bedingung und einer Anweisungssequenz. Solange die Bedingung erfüllt ist, wird die Anweisungssequenz ausgeführt. Aufbau SOLANGE [Bedingung]: [Anweisungssequenz] Struktogramm Flussdiagramm
38
Implementierung in Python
# Initialisierung jung = 6 erwachsen = 9 alt = 12 # Verarbeitung schritt = 0 while schritt < 10: hilf = erwachsen*4 + alt*2 alt = erwachsen // 3 erwachsen = jung // 2 jung = hilf schritt = schritt + 1 # Ausgabe print("Neue Populationswerte:") print("Anzahl der Schritte: ", schritt) print("Anzahl junger Maeuse: ", jung) print("Anzahl erwachsener Maeuse: ", erwachsen) print("Anzahl alter Maeuse: ", alt) Python-Syntax Schlüsselwort Doppelpunkt while [Bedingung]: [Anweisungssequenz] Einrückung
39
Exkurs: Variablen und Zuweisungen
Teil 2 Exkurs: Variablen und Zuweisungen
40
Fachkonzept - Variable
Variablen dienen in der Informatik dazu, Daten zu verwalten. Eine Variable ist ein Name, der (in der Regel) mit einem Datenobjekt verknüpft ist. Variable Wert jung 6 erwachsen 9 alt 12 Variablenzustand Als Wert einer Variablen wird das Datenobjekt angesehen, das von der Variablen verwaltet wird. Ein Variablenzustand beschreibt die aktuell vorliegenden Variablen mit den verwalteten Daten.
41
Fachkonzept - Zuweisung
Mit einer Zuweisung kann man eine Variable mit einem neuen Datenobjekt verknüpfen. Zustand - vorher Zuweisungszeichen {jung -> 6; erwachsen -> 9; alt -> 12} alt = erwachsen // 3 alt = erwachsen // 3 Auswertung alt -> 3 Variable Term {jung -> 6; erwachsen -> 9; alt -> 3} Zustand - nachher Aufbau einer Zuweisung: Eine Zuweisung besteht aus einer Variablen (der ein Wert zugewiesen wird) and einem Term (der den zuzuweisenden Wert festlegt). Auswertung einer Zuweisung: Erst wird der Wert des Terms mit Hilfe des aktuellen Variablenzustands ermittelt. Dieser Wert wird dann der Variablen als neuer aktueller Wert zugewiesen.
42
Variablenbezeichner Bei der Wahl der Variablenbezeichner (d.h. der Namen, die man den Variablen gibt) ist man recht flexibel: Verwendung von Buchstaben, Ziffern und dem Unterstrich; Unterscheidung zwischen Groß- und Kleinschreibung; keine Ziffern am Anfang; Umlaute sind erlaubt, machen aber gelegentlich Schwierigkeiten. >>> a = 20 >>> b2 = 12 >>> gewinn_2017 = 1000 >>> _hilf = 4 Bei der Wahl der Variablenbezeichner sollte man sprechende Namen benutzen. Das sind Namen, die möglichst gut erklären, welche Daten mit den Variablen verwaltet werden. >>> a = 20 >>> b = 12 >>> c = a + b >>> d = a >>> a = a // * b >>> b = d // 2 + b // 2 >>> jung = 20 >>> alt = 12 >>> gesamt = jung + alt >>> hilf = jung >>> jung = jung // * alt >>> alt = hilf // 2 + alt // 2 Was beschreibt a? Sprechende Namen
43
Exkurs: Was ist eine Variable?
Variablen dienen in der Informatik dazu, Daten zu verwalten. Eine Variable ist ein Name, der mit einer Speicherzelle verknüpft ist. Mit der Variable kann man auf den in der zugehörigen Speicherzelle abgelegten Datenwert zugreifen. "Behältersemantik" Speicherzelle mit Datenwert Name Variablen dienen in der Informatik dazu, Daten zu verwalten. Eine Variable ist ein Name, der (in der Regel) mit einem Datenobjekt verknüpft ist. "Zeigersemantik" Name Zeiger Datenobjekt Variablen dienen in der Informatik dazu, Daten zu verwalten. Eine Variable ist ein Name, der (in der Regel) mit einem Wert verknüpft ist. "Wertsemantik" {jung -> 6; erwachsen -> 9; alt -> 12} Name Datenwert
44
Exkurs: Variablen in Python
Variablen dienen in der Informatik dazu, Daten zu verwalten. Eine Variable ist ein Name, der (in der Regel) mit einem Datenobjekt verknüpft ist. "Zeigersemantik" Name Zeiger Datenobjekt Jedes Datenobjekt in Python hat eine Identitätsnummer, einen Typ und einen Wert. Die Identitätsnummer ist die Adresse des Objekts im Speicher. Sie ist also eine Zahl, mit der man ein Datenobjekt eindeutig identifizieren kann. Eine Variable ist ein Name, der (in der Regel) mit einem Datenobjekt verknüpft ist. Die Verknüpfung wird durch einen Verweis (Referenz) auf die Speicheradresse des Datenobjekts hergestellt. >>> id(2) >>> zahl = 2 >>> id(zahl) >>> type(zahl) <class 'int'> >>> zahl 2 >>> id(2) >>> type(2) <class 'int'> >>> 2 2
45
Exkurs: Zuweisungen in Python
Eine Veränderung eines Variablenwerts kann mit Hilfe einer Zuweisung erfolgen. Erst wird der Wert des Terms (auf der rechten Seite der Zuweisung) mit Hilfe des aktuellen Variablenzustands ermittelt. Dann wird ein Datenobjekt mit diesem Wert an die Variable (auf der linken Seite der Zuweisung) gebunden. Dieses Datenobjekt kann ein bereits existierendes Datenobjekt sein oder ein neu erzeugtes. Python entscheidet nach internen Strategien, welche Version günstiger ist. Je nach Programmablaufsituation können gleiche Zuweisungen durchaus zu unterschiedlichen Datenobjektkonstellationen führen. Entscheidend ist nur, dass der Variablen ein Datenobjekt zugeordnet wird, das den gewünschten Datenwert hat. [variable] = [term] Struktur Auswertung >>> a = "Test" >>> b = "Test" >>> id(a) >>> id(b) Beachte: Auch wenn zwei Variablen denselben Wert haben, müssen sie nicht auf dasselbe Datenobjekt verweisen. >>> a = 2 >>> id(a) >>> b = a >>> id(b)
46
Blick hinter die Kulissen mit Thonny
Name Referenz / Adresse Wert
47
Blick hinter die Kulissen mit Thonny
48
Exkurs: Mehrfachzuweisungen in Python
Python erlaubt Zuweisungen der Gestalt [variablentupel] = [termtupel]. >>> (jung, erwachsen, alt) = (6, 9, 12) >>> jung 6 >>> erwachsen 9 >>> alt 12 >>> (jung, erwachsen, alt) = (erwachsen*4+alt*2, jung//2, erwachsen//3) >>> (jung, erwachsen, alt) (60, 3, 3) Variablentupel Termtupel
49
Variablenerzeugung in Python
# Initialisierung jung = 6 erwachsen = 9 alt = 12 # Verarbeitung hilf = erwachsen*4 + alt*2 alt = erwachsen // 3 erwachen = jung // 2 jung = hilf # Ausgabe print('Die berechneten Populationswerte sind:') print('Anzahl junger Mäuse: ', jung) print('Anzahl erwachsener Mäuse: ', erwachsen) print('Anzahl alter Mäuse: ', alt) Beachte: Variablen werden in Python nicht (wie in anderen Programmiersprachen) vorab deklariert. Variablen werden in Python während der Ausführung des Programms dynamisch erzeugt. Wenn ein noch nicht benutzter Bezeicher auf der linken Seite einer Zuweisung vorkommt, dann wird eine neue Variable erzeugt. Run Module >>> … >>> globals() {..., 'erwachsen': 9, 'jung': 60, ..., 'erwachen': 3, ..., 'alt': 3, ..., 'hilf': 60}
50
Verfolgung von Variablenzuständen
Python Tutor Die Erzeugung von Variablen und die Veränderung von Variablenzuständen kann man sehr gut mit dem Python Tutor oder mit der Entwicklungsumgebung Thonny nachverfolgen.
51
Trace-Tabelle Eine Trace-Tabelle protokolliert die Veränderungen von Variablenzuständen, wenn mehrere Zuweisungen (bzw. sonstige Anweisungen) ausgeführt werden. Das folgende Beispiel zeigt eine solche Trace-Tabelle. Zuweisung schritt jung erwachsen alt hilf schritt = jung = erwachsen = alt = schritt = schritt hilf = erwachsen * 4 + alt * alt = erwachsen // erwachsen = jung // jung = hilf
52
Übungen >>> a = 5 Aufgabe 1 >>> b = 3
>>> b = a >>> a ... >>> b Aufgabe 1 (a) Die Werte der Variablen a und b sollen mit Hilfe geeigneter Zuweisungen ausgetauscht werden. Hier ein erster Versuch. {} a = 5 {a -> 5} b = 8 {a -> 5; b -> 8} a = b - a {a -> ...; b -> ...} a = a - b. b = a + b (b) Ergänze die Variablenzustände im Ablaufprotokoll. Die Zuweisungsfolge vertauscht ebenfalls die Werte der Variablen a und b. Teste, ob das auch für andere Ausgangswerte zutrifft. (c) Was bewirkt die Mehrfachzu-weisung? Probiere es auch einmal aus. (a, b) = (b, a)
53
Übungen >>> a = 65 Aufgabe 2 >>> b = 1.7
>>> c = a/(b*b) >>> c Aufgabe 2 (a) P. hat den folgenden Python-Dialog geführt. Warum weiß man nicht so recht, was P. hier berechnet hat? (b) Informiere dich über den sogenannten Body-Mass-Index (kurz BMI). Kannst du jetzt erklären, wofür die im Python-Dialog benutzten Variablen stehen? (c) Führe einen Python-Dialog zur Berechnung deines BMI-Werts. Benutze aber Variablenbezeichner, die besser erklären, welche Daten mit den Variablen verwaltet werden. (d) Welche Vorteile hat es, wenn bei der Wahl der Variablenbezeichner immer sprechende Namen benutzt?
54
Übungen Aufgabe 3 Ergänze die fehlenden Werte in der Trace-Tabelle. Was wird hier berechnet?
55
Teil 3 Datenverwaltung mit Variablen -
Miniprojekt: Cäsar-Verschlüsselung
56
Cäsar-Veschlüsselung
Zielsetzung: Im Folgenden soll die Verschlüsselung von kurzen Textnachrichten nach der Cäsar-Methode automatisiert werden. A B C D E F G H I J K L M N O P Q R S T U V W X Y Z D E F G H I J K L M N O P Q R S T U V W X Y Z A B C Schlüssel: 3 Quelltext: Geheimtext: SALVECAESAR VDOYHFDHVDU
57
Umwandlung von Zeichen in Zahlen
Zeichen werden intern im Rechner durch Bitfolgen codiert. Da man die Bitmuster auch als Zahlen deuten kann, lässt sich jedem Zeichen (aus einem vorgegebenen Zeichenvorrat) eine natürliche Zahl (aus einem passenden Zahlenbereich) zuordnen und umgekehrt. Dem Zeichen 'A' lässt sich beispielsweise nach dem ASCII-Code die Zahl 65 zuordnen. >>> ord('A') 65 >>> ord('Z') 90 >>> chr(67) 'C' >>> chr(80) 'P' Aufgabe Mit den vordefinierten Funktionen ord und chr lassen sich Zeichen in Zahlen und umgekehrt umwandeln. Probiere das selbst aus. Quelle:
58
Verschiebung von Zeichen
>>> zeichen = 'A' >>> zeichen 'A' >>> zahl = ord(zeichen) >>> zahl 65 >>> neuezahl = zahl + 3 >>> neuezahl 68 >>> neueszeichen = chr(neuezahl) >>> neueszeichen 'D' >>> zeichen = 'a' >>> zeichen 'a' … >>> neueszeichen 'A' Aufgabe: Analysiere und erläutere den Python-Dialog. Probiere das auch selbst aus. Bei welchen Zeichen gibt es bei dem gezeigten Verfahren Schwierigkeiten? Aufgabe: Entwickle analog einen Python-Dialog, mit dem man Kleinbuchstaben in Großbuchstaben umwandeln kann.
59
Zugriff auf Zeichen einer Zeichenkette
>>> klartext = 'HALLO' >>> klartext[0] 'H' >>> klartext[1] 'A' >>> klartext[5] Traceback (most recent call last): File "<pyshell#8>", line 1, in <module> klartext[5] IndexError: string index out of range Aufgabe: Der Python-Dialog zeigt, wie man auf einzelne Zeichen einer Zeichenkette zugreifen kann. Probiere das mit einer selbst gewählten Zeichenkette aus. Bei welchen Zugriffen gibt es Schwierigkeiten?
60
Fachkonzept - Zeichenkette
Eine Zeichenkette ist eine (evtl. leere) Folge von Zeichen (aus einer vorgegebenen Zeichenmenge), die zu einer Dateneinheit zusammengefasst ist. Eine Zeichenkette ist ein sequentielles Datenobjekt, das aus einzelnen Zeichen besteht. Die Elemente eines solchen sequentiellen Datenobjekts sind der Reihe nach durchnummeriert. Die Nummerierung beginnt dabei mit 0. Die Nummer eines sequentiellen Datenobjekts wird auch Index genannt. >>> klartext = 'HALLO' >>> klartext[0] 'H' >>> klartext[1] 'A' >>> klartext[4] 'O' >>> klartext[5] Traceback (most recent call last): ... klartext[5] IndexError: string index out of range lesender Zugriff auf einzelne Zeichen beachte den Indexbereich
61
Eine neue Zeichenkette aufbauen
>>> text = 'HALLO' >>> neuerText = '' >>> zeichen = text[0] >>> neuerText = zeichen + neuerText >>> neuerText 'H' >>> zeichen = text[1] 'AH' >>> zeichen = text[2] 'LAH' >>> … Aufgabe: Analysiere den gezeigten Python-Dialog. Führe ihn entsprechend fort. Was leistet das gezeigte Verfahren? Was bewirkt der +-Operator bei Zeichenketten? Beschreibe die Idee, wie hier eine neue Zeichenkette aufgebaut wird. Konkatenation von Zeichenketten
62
Eine neue Zeichenkette aufbauen
# Initialisierung klartext = 'HALLO' # Verarbeitung geheimtext = '' zeichen = klartext[0] zahl = ord(zeichen) neuezahl = zahl + 3 neueszeichen = chr(neuezahl) geheimtext = geheimtext + neueszeichen zeichen = klartext[1] … # Ausgabe print(geheimtext) Aufgabe: Ergänze das Programm zur Verschlüsselung nach der Caesar-Methode. Benutze auch den Python Tutor ( um die Verarbeitung der Zeichenkette zu verdeutlichen. Warum ist das Programm in der vorliegenden Form noch unbefriedigend? Programmfenster Run Module >>> … Ausführfenster
63
Durchlaufen von Zeichenketten
text = 'HALLO' laenge = len(text) index = 0 neuerText = '' for index in range(laenge): zeichen = text[index] neuerText = zeichen + neuerText print(neuerText) Programmfenster H text A L O 1 2 3 4 for-Schleife über den Indexbereich Run Module >>> OLLAH Ausführfenster Aufgabe: Das Programm zeigt eine Möglichkeiten, wie man eine Zeichenkette Schritt für Schritt durchläuft (und dabei verarbeitet). Teste selbst (auch mit dem Python Tutor). Erkläre, wie das Verfahren zum Durchlaufen funktioniert.
64
Durchlaufen von Zeichenketten
text = 'HALLIHALLO' neuerText = '' for zeichen in text: neuerText = zeichen + neuerText print(neuerText) Programmfenster H text A L O 1 2 3 4 for-Schleife für sequentielle Datenobjekte Run Module >>> OLLAHILLAH Ausführfenster Aufgabe: Das Programm zeigt eine Möglichkeiten, wie man eine Zeichenkette Schritt für Schritt durchläuft (und dabei verarbeitet). Teste selbst (auch mit dem Python Tutor). Erkläre, wie das Verfahren zum Durchlaufen funktioniert.
65
Automatisierte Verschlüsselung
# Initialisierung klartext = 'HALLO' # Verarbeitung geheimtext = '' for zeichen in klartext: zahl = ord(zeichen) neuezahl = zahl + 3 if neuezahl > ord('Z'): neuezahl = neuezahl - 26 neuesZeichen = chr(neuezahl) geheimtext = geheimtext + neuesZeichen # Ausgabe print(geheimtext) Aufgabe: Entwickle entsprechend ein Programm zur Entschlüsselung von Texten, die nach dem Caesar-Verfahren verschlüsselt wurden.
66
Automatisierte Vorbereitung
# Initialisierung text = 'Dieser Text müßte "bereingt" werden.' # Verarbeitung textNeu = '' for zeichen in text: if ord(zeichen) >= ord('A') and ord(zeichen) <= ord('Z'): # zeichen ist ein Großbuchstabe textNeu = textNeu + zeichen elif ord(zeichen) >= ord('a') and ord(zeichen) <= ord('z'): # zeichen ist ein Kleinbuchstabe … elif zeichen == 'ä' or zeichen == 'Ä': # zeichen ist der Umlaut ä bzw. Ä else: # zeichen ist ein anderes Zeichen # Ausgabe print(text) print(textNeu) Aufgabe: Wir sind bisher davon ausgegangen, dass ein vorgegebener Text nur aus Großbuchstaben besteht. Einen beliebigen Text müsste man erst einmal in einen Text aus Großbuchstaben umwandeln, um das Verschlüsselungsverfahren anwenden zu können. Ergänze das Programm.
67
Mehrzeilige Texte # Initialisierung klartext = '''Hallo Caesar,
Viele Grüße aus Gallien! Asterix''' # Verarbeitung … # Ausgabe Aufgabe: Ein mehrzeiliger Text lässt sich ebenfalls als Zeichenkette darstellen. Teste selbst.
68
Darstellung von Zeichenketten
Zeichenketten lassen sich in Python auf unterschiedliche Weisen darstellen. >>> z1 = 'Hallo' >>> z1 'Hallo' >>> z2 = "Hallo" >>> z2 >>> z = '' >>> z >>> text = """Dieser Text geht ... über mehrere ... Zeilen.""" >>> text 'Dieser\nText geht\nüber mehrere\nZeilen.' >>> print(text) Dieser Text geht über mehrere Zeilen. Darstellung von Zeichenketten
69
Benutzereingaben # Eingabe klartext = input('Klartext: ')
# Verarbeitung … # Ausgabe Aufgabe: Teste selbst die Verwendung des input-Operators.
70
Fachkonzept - EVA-Prinzip
Viele Programme lassen sich wie im Beispiel nach dem EVA-Prinzip strukturieren. EVA steht hier für Eingabe - Verarbeitung - Ausgabe. Auf einen Eingabeteil folgt ein Verarbeitungsteil und schließlich ein Ausgabeteil. # Eingabe ... klartext = input('Text: ') ... # Verarbeitung … neuerText = '' # Ausgabe ... print('neuer Text: ', neuerText) Eingabe Verarbeitung Ausgabe Eingaben in Python: Der input-Operator gibt zunächst den Aufforderungstext aus, wartet dann, bis der Benutzer seine Eingabe mit der Return-Taste abgeschlossen hat und liefert diese Eingabe als Zeichenkette vom Typ str zurück. Ausgaben in Pythen: Die print-Anweisung gibt alle übergebenen Werte der Reihe nach (in einer Zeile) auf dem Bildschirm aus.
71
Laden aus Dateien # Eingabe
datei = open('klartext.txt', 'r', encoding='iso ') klartext = datei.read() datei.close() # Verarbeitung … # Ausgabe Aufgabe: Teste selbst die Verwendung des input-Operators.
72
Speichern in Dateien # Eingabe
datei = open('klartext.txt', 'r', encoding='iso ') klartext = datei.read() datei.close() # Verarbeitung … # Ausgabe datei = open('geheimtext.txt', 'w', encoding='iso ') datei.write(text) Aufgabe: Teste selbst die Verwendung des input-Operators.
73
Teil 4 Exkurs: Datentypen
74
Beispiel: Temperaturumrechnungen
°F °C 104 40 86 30 68 20 50 10 32 Hitzrekord im Death Valley: Temperatur steigt auf 130°. tC = (tF − 32)· 5/9 Umrechnung: °Fahrenheit -> °Celsius tF = tC· Umrechnung: °Celsius -> °Fahrenheit
75
Programm zur Umrechnung
# Eingabe tFahrenheit = input('Temperatur in Fahrenheit: ') # Verarbeitung tCelsius = (tFahrenheit - 32) * 5/9 # Ausgabe print('Temperatur in Celsius: ', tCelsius) Programmfenster Run Module >>> Temperatur in Fahrenheit: 130.0 Traceback (most recent call last): File …, line 4, in <module> tCelsius = (tFahrenheit - 32) * 5/9 TypeError: unsupported operand type(s) for -: 'str' and 'int' Ausführfenster Aufgabe: Fehler bei der Verarbeitung der Eingabe! Worin könnte der Fehler bestehen?
76
Programm zur Umrechnung
# Eingabe tFahrenheit = float(input('Temperatur in Fahrenheit: ')) # Verarbeitung tCelsius = (tFahrenheit - 32) * 5/9 # Ausgabe print('Temperatur in Celsius: ', tCelsius) Programmfenster Run Module >>> Temperatur in Fahrenheit: 130.0 Temperatur in Celsius: Ausführfenster float(input('Temperatur in Fahrenheit: ')) input-Operator liefert Datenobjekt vom Typ str '130.0' float-Operator wandelt in Datenobjekt vom Typ float um 130.0
77
Experimente zur Typumwandlung
>>> tF = 130.0 >>> type(tF) <class 'float'> >>> tF = round(tF) <class 'int'> >>> tF >>> 130 >>> tF = 87.7 >>> tF = int(tF) >>> type(tF) <class 'int'> >>> tF 87 >>> tC = 35.2 >>> t = str(tC) >>> type(t) <class 'str'> >>> t '35.2'
78
Experimente zur Typumwandlung
>>> tC = 35.2 >>> t = str(tC) + '°C' >>> t '35.2°C' >>> tC = 35.2 >>> tF = tC* >>> t = (tC, tF) >>> type(t) <class 'tuple'> >>> t (35.2, ) >>> 40.3 > 40 True >>> type(True) <class 'bool'>
79
Fachkonzept - Datentyp
Ein Datentyp beschreibt eine Menge von Datenobjekten, die alle die gleiche Struktur haben und mit denen die gleichen Operationen ausgeführt werden können. >>> 40.3 40.3 >>> type(40.3) <class 'float'> >>> round(40.3) 40 >>> type(40) <class 'int'> >>> str(40.3) + ' °C' '40.3 °C' >>> type('40.3 °C') <class 'str'> >>> (40.3, '°C') (40.3, '°C') >>> type((40.3, '°C')) <class 'tuple'> >>> 40.3 > 40 True >>> type(True) <class 'bool'> 40 30 20 10
80
Datentypen in Python >>> 2 2 Datentyp: ganze Zahl int
>>> 2.0 2.0 Datentyp: Dezimalzahl float >>> True True Datentyp: Wahrheitswert bool >>> 'Hallo!' 'Hallo!' >>> "Hallo!" 'Hallo!' Datentyp: Zeichenkette string >>> ('Hans', 'Meier', 34) ('Hans', 'Meier', 34) Datentyp: Tupel tuple >>> [1, 2, 3, 4, 5] [1, 2, 3, 4, 5] Datentyp: Liste list ... ...
81
Typumwandlungen in Python
Häufig benötigt man Operatoren, mit denen man aus einem Datenobjekt ein entsprechendes mit einem anderen Datentyp erzeugen kann. Der folgende Python-Dialog zeigt einige Möglichkeiten auf. >>> int('3') 3 >>> float('3.0') 3.0 >>> int(3.0) >>> int(3.5) >>> float(3) >>> str(3) '3' >>> list('[1, 2, 3]') ['[', '1', ',', ' ', '2', ',', ' ', '3', ']'] >>> eval('[1, 2, 3]') [1, 2, 3]
82
Übungen >>> 1 + 1 2 Aufgabe: >>> 1 + 1.0
2.0 >>> >>> '1' + '1' '11' >>> 1,0 + 1,0 (1, 1, 0) >>> (1, 0) + (1, 0) (1, 0, 1, 0) >>> 1,0 + 1 (1, 1) >>> (1, 0) + 1 Traceback (most recent call last): File ... TypeError: can only concatenate tuple (not "int") to tuple >>> 1 + '1' TypeError: unsupported operand type(s) for +: 'int' and 'str' Aufgabe: Erkläre die Ergebnisse des Python-Dialogs. Benutze die Datentypen bei der Argumentation.
83
Teil 5 Datenverarbeitung mit Funktionen -
Miniprojekt: Bausteine zur Verschlüsselung
84
Nochmal: Cäsar-Veschlüsselung
Zielsetzung: Ziel ist es jetzt, flexible Bausteine zur Verschlüsselung von Texten zu entwickeln. Wir beginnen nochmal mit dem Verschiebeverfahren (einer Verallgemeinerung des Cäsar-Verfahrens). Verschiebeverfahren A B C D E F G H I J K L M N O P Q R S T U V W X Y Z D E F G H I J K L M N O P Q R S T U V W X Y Z A B C Schlüssel: D Quelltext: Geheimtext: SALVEASTERIX VDOYHDVWHULA
85
Verschiebungsverfahren
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z D E F G H I J K L M N O P Q R S T U V W X Y Z A B C Schlüssel: D Quelltext: Geheimtext: SALVEASTERIX VDOYHDVWHULA Ziel ist es, eine Verarbeitungseinheit zu entwickeln, die bei Übergabe einer zu verschlüsselnden Zeichenkette (aus Großbuchstaben) und einem Schlüsselbuchstaben die mit dem Verschiebeverfahren verschlüsselte Zeichenkette ermittelt und zurückgibt. Black-Box-Diagramm
86
Verschiebung einzelner Buchstaben
Schlüsselbuchstabe Quelltextzeichen A B C D E F G H I J K L M N O P Q R S T U V W X Y Z H H I J K L M N O P Q R S T U V W X Y Z A B C D E F G Geheimtextzeichen Zunächst soll hierzu eine Verarbeitungseinheit zum Verschieben einzelner Zeichen (hier nur Großbuchstaben) mit einem vorgegebenen Schlüsselbuchstaben entwickelt werden. Black-Box-Diagramm
87
Verschiebung von Buchstaben
Konzeption einer Verarbeitungseinheit zum Verschieben einzelner Zeichen mit einem vorgegebenen Schlüsselbuchstaben: Funktion Realisierung der Verarbeitungseinheit: Hilfsfunktionen ord 80 <- P H -> 7 +7 … verschiebezahl 87 -> W chr
88
Funktion als Verarbeitungseinheit
ord 80 <- P H -> 7 +7 … verschiebezahl 87 -> W chr Selbst zu definierende Funktion Vordefinierte Funktionen
89
Bestimmung der Verschiebezahl
Konzeption einer Funktion zur Bestimmung der Verschiebezahl Funktion Implementierung der Funktion: Programmfenster def verschiebezahl(zeichen): return ord(zeichen) - ord('A') Funktionsdefinition Run Module >>> verschiebezahl('H') 7 Funktionsaufruf Ausführfenster
90
Bestimmung der Verschiebezahl
Programmfenster def verschiebezahl(zeichen): return ord(zeichen) - ord('A') Funktionsdefinition Run Module >>> verschiebezahl('H') 7 Funktionsaufruf Ausführfenster Aufgabe: Implementiere die Funktion verschiebezahl und teste sie im Ausführfenster mit mehreren Funktionsaufrufen.
91
Bestimmung d. verschlüsselten Zeichens
Konzeption einer Verarbeitungseinheit / Funktion zur Bestimmung der verschlüsselten Zeichens Funktion Implementierung der Verarbeitungseinheit: def verschluesseltesZeichen(zeichen, schluessel): … return … Funktionsdefinition
92
Bestimmung d. verschlüsselten Zeichens
Programmfenster def verschluesseltesZeichen(zeichen, schluessel): schluesselzahl = verschiebezahl(schluessel) # zeichen -> zahl # neueZahl ermitteln # falls neueZahl zu groß, … # neueZahl -> neuesZeichen return neuesZeichen Funktionsdefinition Run Module >>> … … Funktionsaufruf Ausführfenster Aufgabe: Implementiere die Funktion verschluesseltesZeichen und teste sie im Ausführfenster mit mehreren Funktionsaufrufen.
93
Bestimmung d. verschlüsselten Textes
Konzeption einer Verarbeitungseinheit / Funktion zur Bestimmung der verschlüsselten Zeichens Funktion Implementierung der Verarbeitungseinheit: def verschluesselterText(klartext, schluessel): … return … Funktionsdefinition
94
Bestimmung d. verschlüsselten Zeichens
Programmfenster def verschluesselterText(klartext, schluessel): # initialisiere die Variable geheimtext # für alle Zeichen c in klartext: # ermittle mit dem schluessel das zu c verschobene Zeichen d # füge d am Ende an die von geheimtext verwaltete Zeichenkette an return geheimtext Funktionsdefinition Run Module >>> … … Funktionsaufruf Ausführfenster Aufgabe: Implementiere die Funktion verschluesselterText und teste sie im Ausführfenster mit mehreren Funktionsaufrufen.
95
Fachkonzept - Funktion
Eine Funktion ist eine Verarbeitungseinheit, die übergebene Daten verarbeitet und den berechneten Funktionswert als Ergebnis zurückgibt. Eine Funktion hat einen Funktionsnamen. Den Funktionsnamen sollte man so wählen, dass das berechnete Ergebnis damit möglichst gut beschrieben wird. Zu verarbeitende Daten werden an Funktionsvariablen (man sagt auch Parameter) übergeben. Eine Funktion gibt das Verarbeitungsergebnis als Funktionswert zurück. Funktionsname Daten-übergabe Daten-rückgabe zu verarbeitende Daten Funktions- variablen / Parameter Funktionswert / zurückgegebene Daten
96
Fachkonzept - Funktion
Die Verarbeitung wird über eine Funktionsdefinition (man sagt oft auch Funktionsdeklaration) festgelegt. Aktiviert wird eine Verarbeitung durch einen Funktionsaufruf. Funktionsname Funktionsvariablen /Parameter def verschluesseltesZeichen(zeichen, schluessel): verschiebung = verschiebezahl(schluessel) zahl = ord(zeichen) neueZahl = zahl + verschiebung if neueZahl > ord('Z'): neueZahl = neueZahl - 26 neuesZeichen = chr(neueZahl) return neuesZeichen Funktionsdefinition Aktuelle Daten >>> verschluesseltesZeichen('P', 'H') 'W' >>> verschluesseltesZeichen('V', 'K') 'F' Funktionsaufruf
97
Entschlüsselung von Texten
Aufgabe: Entwickle analog eine Funktion entschluesselterText zur Entschlüsselung nach dem Verschiebeverfahren. Benutze eine Hilfsfunktion entschluesseltesZeichen. Erstelle jeweils erst ein Black-Box-Diagramm. Entwickle dann eine Funktionsdefinition.
98
Vorbereitung von Zeichenketten
Aufgabe: Wir sind bisher davon ausgegangen, dass ein vorgegebener Text nur aus Großbuchstaben besteht. Einen beliebigen Text müsste man erst einmal in einen Text aus Großbuchstaben umwandeln, um das Verschlüsselungsverfahren anwenden zu können. Wir gehen dabei nach folgendem Verfahren vor: Alle Kleinbuchstaben werden in entsprechende Großbuchstaben umgewandelt. Alle Umlaute und das ß werden durch Kleinbuchstaben ersetzt. (z.B.: ä -> ae; ß -> ss). Alle Leerzeichen und alle Sonderzeichen werden weggelassen. Entwickle eine Funktion, die das leistet. Beschreibe zunächst das Verhalten mit einem Black-Box-Diagramm. Entwickle und teste dann eine Funktionsdefinition.
99
Das Vigenère-Verfahren
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z K K L M N O P Q R S T U V W X Y Z A B C D E F G H I J A B C D E F G H I J K L M N O P Q R S T U V W X Y Z U U V W X Y Z A B C D E F G H I J K L M N O P Q R S T A B C D E F G H I J K L M N O P Q R S T U V W X Y Z H H I J K L M N O P Q R S T U V W X Y Z A B C D E F G Schlüssel: KUH Quelltext: Geheimtext: VIG ENE RE FCN OHL BY
100
Das Vigenère-Verfahren
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z B C D E F G H I J K L M N O P Q R S T U V W X Y Z A C D E F G H I J K L M N O P Q R S T U V W X Y Z A B D E F G H I J K L M N O P Q R S T U V W X Y Z A B C E F G H I J K L M N O P Q R S T U V W X Y Z A B C D F G H I J K L M N O P Q R S T U V W X Y Z A B C D E G H I J K L M N O P Q R S T U V W X Y Z A B C D E F H I J K L M N O P Q R S T U V W X Y Z A B C D E F G I J K L M N O P Q R S T U V W X Y Z A B C D E F G H J K L M N O P Q R S T U V W X Y Z A B C D E F G H I K L M N O P Q R S T U V W X Y Z A B C D E F G H I J L M N O P Q R S T U V W X Y Z A B C D E F G H I J K M N O P Q R S T U V W X Y Z A B C D E F G H I J K L N O P Q R S T U V W X Y Z A B C D E F G H I J K L M O P Q R S T U V W X Y Z A B C D E F G H I J K L M N P Q R S T U V W X Y Z A B C D E F G H I J K L M N O Q R S T U V W X Y Z A B C D E F G H I J K L M N O P R S T U V W X Y Z A B C D E F G H I J K L M N O P Q S T U V W X Y Z A B C D E F G H I J K L M N O P Q R T U V W X Y Z A B C D E F G H I J K L M N O P Q R S U V W X Y Z A B C D E F G H I J K L M N O P Q R S T V W X Y Z A B C D E F G H I J K L M N O P Q R S T U W X Y Z A B C D E F G H I J K L M N O P Q R S T U V X Y Z A B C D E F G H I J K L M N O P Q R S T U V W Y Z A B C D E F G H I J K L M N O P Q R S T U V W X Z A B C D E F G H I J K L M N O P Q R S T U V W X Y Schlüsselbuchstabe Klartextbuchstabe Schlüssel, Klartext K U H K U H K U V I G E N E R E F C N O H L B Y Geheimtext
101
Automatisierung d. Vigenère-Verfahrens
Ziel ist es, eine Funktion zur Automatisierung des Vigenère-Verfahrens zu entwickeln. Es ist günstig, dabei die bereits implementierte Funktion verschluesseltesZeichen zu verwenden. >>> verschluesseltesZeichen('G', 'H') 'N' >>> verschluesseltesZeichen('E', 'U') 'Y' >>> verschluesseltesZeichen('H', 'N') 'U' >>> verschluesseltesZeichen('E', 'D') 'H' >>> verschluesseltesZeichen('I', 'H') 'P' ...
102
Automatisierung d. Vigenère-Verfahrens
Ziel ist es, eine Funktion zur Automatisierung des Vigenère-Verfahrens zu entwickeln. >>> schluessel = 'HUND' >>> verschluesseltesZeichen('G', schluessel[0]) 'N' >>> verschluesseltesZeichen('E', schluessel[1]) 'Y' >>> verschluesseltesZeichen('H', schluessel[2]) 'U' >>> verschluesseltesZeichen('E', schluessel[3]) 'H' >>> verschluesseltesZeichen('I', schluessel[0]) 'P' Aufgabe: Entwickle eine Funktionsdefinition für die Funktion verschluesseltesZeichenVigenere. Teste ausführlich.
103
Teil 6 Exkurs: Funktionen
104
Fachkonzept - Funktion
Eine Funktion ist eine Verarbeitungseinheit, die übergebene Daten verarbeitet und den berechneten Funktionswert als Ergebnis zurückgibt. Eine Funktion hat einen Funktionsnamen. Den Funktionsnamen sollte man so wählen, dass das berechnete Ergebnis damit möglichst gut beschrieben wird. Zu verarbeitende Daten werden an Funktionsvariablen (man sagt auch Parameter) übergeben. Eine Funktion gibt das Verarbeitungsergebnis als Funktionswert zurück. Funktionsname Daten-übergabe Daten-rückgabe zu verarbeitende Daten Funktions- variablen / Parameter Funktionswert / zurückgegebene Daten
105
Fachkonzept - Funktion
Die Verarbeitung wird über eine Funktionsdefinition (man sagt oft auch Funktionsdeklaration) festgelegt. Aktiviert wird eine Verarbeitung durch einen Funktionsaufruf. Funktionsname Funktionsvariablen /Parameter def verschluesseltesZeichen(zeichen, schluessel): verschiebung = verschiebezahl(schluessel) zahl = ord(zeichen) neueZahl = zahl + verschiebung if neueZahl > ord('Z'): neueZahl = neueZahl - 26 neuesZeichen = chr(neueZahl) return neuesZeichen Funktionsdefinition Aktuelle Daten >>> verschluesseltesZeichen('P', 'H') 'W' >>> verschluesseltesZeichen('V', 'K') 'F' Funktionsaufruf
106
Black-Box-Diagramm Ein Black-Box-Diagramm dient dazu, die Verwendungsmöglichkeiten und das Verhalten einer Funktion zu beschreiben. Die Verwendungsmöglichkeiten werden über die Signatur der Funktion bechrieben: Wie wird die Funktion aufgerufen? -> Funktionsname Wie viele Daten müssen in welcher Reihenfolge übergeben werden? -> Parameter Welchen Datentyp dürfen die übergebenen Daten haben? -> Datentypen Welche Werte werden als Rückgaben erzeugt? -> Datentyp des Funktionswerts Das Verhalten der Funktion wird exemplarisch mit einem Testfall beschrieben.
107
Testfälle als Docstring
Testfälle dienen dazu, das Verhalten eines Testobjekts wie z.B. einer Funktion zu beschreiben. Jeder Testfall beschreibt dabei das erwartete Ergebnis bei ganz speziellen Übergabedaten. def verschluesseltesZeichen(zeichen, schluessel): """ >>> verschluesseltesZeichen('P', 'H') 'W' >>> verschluesseltesZeichen('V', 'K') 'F' >>> verschluesseltesZeichen('G', 'A') 'G' verschiebung = verschiebezahl(schluessel) zahl = ord(zeichen) neueZahl = zahl + verschiebung if neueZahl > ord('Z'): neueZahl = neueZahl - 26 neuesZeichen = chr(neueZahl) return neuesZeichen Testfälle als Docstring
108
Überprüfung von Testfällen
def verschiebezahl(zeichen): """ >>> verschiebezahl('H') 7 >>> verschiebezahl('A') … def verschluesseltesZeichen(zeichen, schluessel): >>> verschluesseltesZeichen('P', 'H') 'W' >>> verschluesseltesZeichen('V', 'K') 'F' >>> verschluesseltesZeichen('G', 'A') 'G' from doctest import testmod testmod(verbose=True) >>> Trying: verschiebezahl('H') Expecting: 7 ok verschiebezahl('A') verschluesseltesZeichen('P', 'H') 'W' verschluesseltesZeichen('V', 'K') 'F' …
109
Überprüfung von Testfällen
… from doctest import testmod testmod(verbose=True) Die Anweisung testmod wird ausgeführt. Sie liefert eine dataillierte (geschwätzige) Rückmeldung zu den Testfällen. … from doctest import testmod testmod() Die Anweisung testmod wird ausgeführt. Es gibt keine Rückmeldung, wenn kein Fehler gefunden wurde. … if __name__ == "__main__": from doctest import testmod testmod() Hier wird die Anweisung testmod() nur dann ausgeführt, wenn der Quelltext direkt (als Hauptprogramm) ausgeführt wird. Es gibt auch keine Rückmeldung, wenn kein Fehler gefunden wurde.
110
Ergänzung von Testfällen
Aufgabe: Probiere die Überprüfung von Testfällen selbst aus. Ergänze auch Testfälle zur Überprüfung der Implementierung des Verschiebeverfahrens (Verschlüsselung und Entschlüsselung).
111
Übungen Aufgabe 1 (a) Was leistet die folgende Funktion? Entwickle analog eine Funktion celsiusToFahrenheit. Teste die beiden Funktionen im Ausführfenster. def fahrenheitToCelsius(temperatur): return (temperatur - 32)*(5/9) (b) Hätte man die Funktion fahrenheitToCelsius auch so definieren können? Was kann man bei einer Funktionsdefinition alles variieren, ohne dass sich das Verhalten der Funktion ändert? def fahrenheitToCelsius(tFahrenheit): tCelsius = (tFahrenheit- 32)*(5/9) return tCelsius tC = (tF − 32)· 5/9 Umrechnung: °Fahrenheit -> °Celsius tF = tC· Umrechnung: °Celsius -> °Fahrenheit
112
Übungen Aufgabe 2 (a) Was leistet die folgende Funktion? Warum liefert der Testaufruf in Version 2 kein Ergebnis im Ausführfenster. Programmfenster Programmfenster def laenge(text): zaehler = 0 for z in text: zaehler = zaehler + 1 return zaehler def laenge(text): zaehler = 0 for z in text: zaehler = zaehler + 1 return zaehler # Test laenge('Alles klar?') Run Module >>> laenge('Alles klar?') 11 Run Module >>> Ausführfenster Ausführfenster (b) Ändere den Test in Version 2 ab in print(laenge('Alles klar?')). Warum klappt es jetzt?
113
Übungen Aufgabe 3 Betrachte die Funktion neuesWort mit gegebenem Black-Box-Diagramm und der folgenden Funktionsdefinition: def neuesWort(anfang, mitte, ende, anzahl): return anfang + anzahl*mitte + ende (a) Welche Fehler wurden bei den folgenden Funktionsaufrufen gemacht? (b) Mit welchen Funktionsaufrufen erhält man folgende Ergebnisse? >>> neuesWort('TOR', 10) … >>> neuesWort(10, 'T', 'o', 'r') >>> neuesWort(…) 'Hallihallihallihallihallihallo' 'Blablablablablablablabla!' 'Das ist sehr sehr sehr gut.' 'Was?????'
114
Übungen Aufgabe 4 from random import randint
Die Funktion wuerfelErgebnis hat keine Parameter. Teste diese Funktion mit geeigenten funktionsaufrufen. from random import randint def wuerfelErgebnis(): augen = randint(1, 6) return augen Aufgabe 5 Die Funktion printTemperatur hat keine Rückgabe. Teste diese Funktion mit geeigneten Funktionsaufrufen. def printTemperatur(t): print(str(t) + '°C')
115
Übungen Aufgabe 6 def bruch(zaehler, nenner):
Eine Funktion kann auch mehrere Daten zurückgeben. Man fasst sie dann zu einer neuen Dateneinheit – einem Datentupel – zusammen. Bei Funktionsaufrufen muss man dann beachten, dass jeweils ein Datentupel zurückgegeben wird. Teste das selbst. def bruch(zaehler, nenner): return (zaehler, nenner) >>> bruch(2, 3) (2, 3) >>> b = bruch(4, 7) >>> b (4, 7) >>> (z, n) = bruch(4, 7) >>> z 4 >>> n 7
116
Übungen Aufgabe 7 >>> jung = 6
Hier noch einmal ein Python-Dialog zur Berechnung eines neuen Populationszustand. Erstelle eine geeignete Funktion, die aus dem aktuellen den neuen Populationszustand erzeugt. Teste die Funktion. >>> jung = 6 >>> erwachsen = 9 >>> alt = 12 >>> jung 6 >>> erwachsen 9 >>> alt 12 >>> hilf = erwachsen*4 + alt*2 >>> alt = erwachsen // 3 >>> erwachsen = jung // 2 >>> jung = hilf 60 3
117
Übungen Aufgabe 8 Entwickle geeignete Funktionen für folgende Berechnungssituationen. (a) Der Body-Mass-Index (kurz: BMI) ist eine Zahl, mit der man abschätzen kann, ob man Unter-, Normal oder Übergewicht hat. Man berechnet diese Zahl nach der folgenden Formel: BMI = Gewicht/ (Größe * Größe). Dabei wird das Gewicht in kg und die Größe in m angegeben. (b) optimaler Puls: Der optimale Puls bei Ausdauersportarten hängt vom Alter ab. Er lässt sich mit der Formel P = *A bestimmen. Schreibe ein Programm, das folgenden Dialog ermöglicht: Alter: 18 optimaler Puls: 151.5 (c) Anhalteweg: In der Fahrschule lernt man folgende Faustformeln zur Berechnung von Anhaltewegen: Reaktionsweg (in Metern) = (Geschwindigkeit (in km/h) geteilt durch 10) mal 3 Bremsweg (in Metern) = (Geschwindigkeit (in km/h) geteilt durch 10) mal (Geschwindigkeit (in km/h) geteilt durch 10) Anhalteweg (in Metern) = Reaktionsweg plus Bremsweg
118
Übungen Aufgabe 9 Konzipiere selbst Funktionen (Black-Box-Diagramm, Funktionsdefinition mit Testfällen) für folgende Probleme: - Umkehrung von Zeichenketten - Bestimmung der Anzahl eines Buchstabens in einem Text - Verschlüsselung nach folgender Methode: Im dem Buch Die wilden Hühner von Cornelia Funke benutzt eine Gruppe von Schüler(innen) eine Art Geheimschrift, um Nachrichten verschlüsselt weiterzugeben. Hier ein Beispiel: Geheimtext: neffert mmedfua knehcdä shcänol esuapet rowedoc nhuht Klartext: treffenaufdemmädchenklonächstepausecodeworthuhn
119
Exkurs: lokale und globale Variablen
Teil 7 Exkurs: lokale und globale Variablen
120
Beispiel: Preisberechnungen
Was, so viel? Der Listenpreis beträgt 159€. Mit Mehrwertsteuer kostet das Handy dann 189,21€. Quelle: Info: Der Listenpreis ist der Grundpreis, von dem die Rechnung ausgeht. Als Beispiel betrachten wir einen Listenpreis von €. Zum Listenpreis kommt die Mehrwertsteuer hinzu. Bis auf einige Ausnahmen wie Bücher beträgt der Mehrwertsteuersatz derzeit in Deutschland 19%. Im Beispiel ergibt sich eine Mehrwertsteuer von 30.21€ und somit ein Gesamtbetrag von €. Ziel ist es, für solche Preisberechnungen eine geeignete Funktion bereitzustellen.
121
Lokale und globale Variablen
Aufgabe: Teste selbst mit dem Python Tutor. Beobachte die Erzeugung und Verwaltung der Variablen. Welche Besonderheiten fallen auf?
122
Lokale und globale Variablen
globaler Namensraum lokale Variable Lokaler Namensraum Eine globale Variable ist (vereinfacht gesagt) eine Variable, die im Hauptprogramm eingeführt wird. Eine lokale Variable ist (vereinfacht gesagt) eine Variable, die nur innerhalb einer Funktionsdefinition benutzt wird. Beachte, dass die Funktionsvariablen bzw. Parameter eines auch zu diesen lokalen Variablen zählen. Sämtliche im Hauptprogramm definierten Namen (von Variablen, Funktionen, ...) bilden den sog. globalen Namensraum. Entsprechend bilden sämtliche in einer Funktionsdefinition definierten Namen (von Variablen, Funktionen, ...) einen sog. lokalen Namensraum.
123
Lebensdauer und Gültigkeitsbereich
Beachte: Eine lokale Variable ist nur innerhalb der Funktionsdefinition, in der sie eingeführt ist, gültig bzw. sichtbar. Beachte, dass lokale Variablen nach der Ausführung eines Funktionsaufrufs nicht mehr existieren. Auf eine lokale Variable einer Funktionsdefinition kann man im Hauptprogramm also nicht zugreifen.
124
Namenskonflikte Beachte:
Das Beispiel zeigt, dass es gleichnamige globale und lokale Variablen geben kann, ohne dass es dabei zu einem Namenskonflikt kommt.
125
Zugriff auf Variablen Beachte:
Bei der Ausführung eines Funktionsaufrufs werden Variablen immer erst im lokalen Namensraum gesucht. Werden sie hier gefunden, so werden diese lokalen Namen zur Verwaltung der berechneten Daten benutzt. Werden sie nicht gefunden, so wird im globalen Namensraum weitergesucht.
126
Zugriff auf Variablen Verändert man innerhalb einer Prozedur den Wert einer globalen Variablen, so spricht man auch von einem Seiteneffekt. Seiteneffekte sind in der Regel nicht erwünscht. Seiteneffekte können die Ursache für schwer auffindbare Fehler sein, da sie Veränderungen von Variablen in Programmteilen bewirken können, die mit der für den Seiteneffekt verursachenden Funktionsdefinition nichts zu tun haben.
127
Teil 8 Ablaufmodellierung mit Kontrollstrukturen -
Miniprojekt: Reaktionszeit
128
Reaktionszeit Wie lange brauchst du, um auf ein bestimmtes Ereignis zu reagieren? Das lässt sich leicht mit einem Reaktionszeitmesser herausfinden. Ziel ist es, einen einfachen Reaktionszeitmesser selbst zu entwickeln. Quelle:
129
Bestimmung der Reaktionszeit
Eine Testperson erhält zu einem nicht vorhersehbaren Zeitpunkt ein Startsignal und soll dann möglichst schnell eine Aktion ausführen (z.B. die [return]-Taste drücken). Gemessen wird die Zeit, die die Testperson benötigt. Anweisungssequenz
130
Bestimmung der Reaktionszeit
from time import * from random import * def reaktionszeit(minZeit, maxZeit): wartezeit = randint(minZeit, maxZeit) print("Achtung!") sleep(wartezeit) # Start print("Start!") t1 = clock() # Stopp eingabe = input("Stopp!") t2 = clock() t = t2 - t1 return t Aufgabe: Analysiere und teste das vorgegebene Programm.
131
Auswertung der Reaktionszeit
Aus der gemessenen Reaktionszeit soll als Testergebnis eine Rückmeldung nach folgender Verarbeitungslogik bestimmt werden. def auswertung(zeit, vergleichswert): if …: … else: return rueckmeldung Aufgabe: Ergänze die Funktionsdefinition und teste das Verhalten der Funktion. Fallunterscheidung
132
Auswertung der Reaktionszeit
Aufgabe: Die Auswertung der Reaktionszeit soll jetzt etwas differenzierter erfolgen: Zeit < 80% des Vergleichswerts: sehr gutes Ergebnis 80% des Vergeichswerts <= Zeit < Vergleichswert: gutes Ergebnis Zeit == Vergleichswert: mittleres Ergebnis Vergeichswerts < Zeit <= 120% des Vergleichswert: mäßiges Ergebnis 120% des Vergleichswert < Zeit: schlechtes Ergebnis Benutze mehrere ineinandergeschachtelte Fallunterscheidungen. def auswertung(zeit, vergleichswert): if …: … else: …. return rueckmeldung
133
Fachkonzept - Fallunterscheidung
Eine Fallunterscheidung dient dazu, alternative Abläufe zu beschreiben. WENN [Bedingung]: [Anweisungssequenz] SONST: WENN [Bedingung]: [Anweisungssequenz] zweiseitige Fallunterscheidung einseitige Fallunterscheidung
134
Fachkonzept - Fallunterscheidung
Eine Fallunterscheidung dient dazu, alternative Abläufe zu beschreiben. zweiseitige Fallunterscheidung einseitige Fallunterscheidung Doppelpunkt Schlüsselwort if [Bedingung]: [Anweisungssequenz] else: if [Bedingung]: [Anweisungssequenz] Einrückung
135
Exkurs: Mehrfachfallunterscheidung
if [Bedingung]: [Anweisungssequenz] elif [Bedingung]: ... else: Schlüsselwort Doppelpunkt Einrückung
136
Auswertung der Reaktionszeit
Aufgabe: Die Auswertung der Reaktionszeit soll jetzt etwas differenzierter erfolgen: Zeit < 80% des Vergleichswerts: sehr gutes Ergebnis 80% des Vergeichswerts <= Zeit < Vergleichswert: gutes Ergebnis Zeit == Vergleichswert: mittleres Ergebnis Vergeichswerts < Zeit <= 120% des Vergleichswert: mäßiges Ergebnis 120% des Vergleichswert < Zeit: schlechtes Ergebnis Benutze das Python-Muster für Mehrfachfallunterscheidungen. def auswertung(zeit, vergleichswert): if …: … elif … …. … else: …. return rueckmeldung if [Bedingung]: [Anweisungssequenz] elif [Bedingung]: ... else: Schlüsselwort Doppelpunkt Einrückung
137
Mittlere Reaktionszeit
Um bessere Aussagen über das Reaktionsvermögen einer Person machen zu können, sollte man die Reaktionszeit mehrfach messen und aus den Messergebnissen eine mittlere Reaktionszeit berechnen. Wiederholung
138
Mittlere Reaktionszeit
Aufgabe: Entwickle eine Funktion mittlereReaktionszeit, die bei der Übergabe einer vorgegebenen Anzahl von Wiederholungen die Reaktionszeit mehrfach bestimmt und aus den Ergebnissen den Durchschnittwert berechnet und zurückgibt. Benutze eines der gezeigten Muster zur Implementierung der Zählschleife. zaehler = 0 while zaehler < anzahlWiederholungen: … zaehler = zaehler + 1 Zählschleife for zaehler in range(anzahlWiederholungen): … Zählschleife
139
Schwellenwert unterbieten
Hier soll jetzt ein Programm zur Bestimmung der Anzahl der Versuche, bis die Testperson eine vorgegebene Reaktionszeit (von z.B. 0.5s) erreicht hat, entwickelt werden. Der Reaktionstest hierzu ggf. mehrfach durchgeführt werden. Aufgabe: Entwickle eine geeignete Funktion anzahlReaktionstests Benutze eine while-Anweisung zur Implementierung der Wiederholung. Wiederholung mit Abbruchbedingung
140
Fachkonzept - Wiederholung
Eine Solange-Wiederholung besteht aus einer Bedingung und einer Anweisungssequenz. Solange die Bedingung erfüllt ist, wird die Anweisungssequenz ausgeführt. Aufbau SOLANGE [Bedingung]: [Anweisungssequenz] Struktogramm Python-Syntax Schlüsselwort Doppelpunkt while [Bedingung]: [Anweisungssequenz] Flussdiagramm Einrückung
141
Schwellenwert unterbieten
Wenn die Testperson es in 10 Versuchen nicht schafft, einen vorgegebenen Schwellenwert zu unterbieten, dann soll die Wiederholung abgebrochen werden. Aufgabe: Benutze einen logischen Operator, um mehrere Bedingungen miteinander zu verknüpfen. … while t >= schwellenwert and zaehler < 10: Komplexe Bedingung
142
Schwellenwert unterbieten
Wenn die Testperson es in 10 Versuchen nicht schafft, einen vorgegebenen Schwellenwert zu unterbieten, dann soll die Wiederholung abgebrochen werden. Aufgabe: Manchmal ist es günstig, logische Werte mit einer Variablen zu verwalten. Teste das selbst. … genug = (t < schwellenwert) or (zaehler == 10) while not genug: Logische Variable
143
Eine Aufgabe lösen Es geht um das Lösen kleiner Aufgaben (z.B um das schnelle Eintippen einer vorgegebenen zufälligen Buchstabenfolge). Wenn die Lösung nicht korrekt ist, dann soll es eine Rückmeldung und maximal 3 weitere Versuche geben. Für die Bearbeitung der Aufgabe soll die Zeit gemessen und zurückgegeben werden. Schafft man das nicht, soll als Zeit ein spezieller wert (z.B. -1) zurückgegeben werden.
144
Eine Aufgabe lösen Denke dir selbst einen Test aus (z.B. eine vorgegebene Zeichenfolge in umgekehrter Reihenfolge wiedergeben). Entwickle geeignete Funktionen für die Durchführung des Tests.
145
Exkurs: Wahrheitswerte
Teil 9 Exkurs: Wahrheitswerte
146
Beispiel: Pasch Wenn man mehrere Würfel wirft, dann bezeichnet man einen Wurf, bei dem alle Würfel dieselbe Augenzahl liefern, als Pasch. Es dauert manchmal ziemlich lange, bis man einen Pasch beim Würfeln mit 3 (bzw. n) Würfeln erhält. Im Folgenden soll ein Programm entwickelt werden, mit dessen Hilfe man die Anzahl der Versuche durch Simulation bestimmen kann. Aufgaben Die Bedingung ist im Algorithmus noch umgangssprachlich in der Form "kein Pasch" dargestellt. Diese Bedingung soll jetzt präzisiert werden. Das folgende Testprogramm gibt die Werte von 4 Bedingungen aus. Welche dieser Bedingungen kann man zur Implementierung von "kein Pasch" benutzen? Implementiere den oben gezeigten Algorithmus. from random import randint # Würfelergebnisse w1 = randint(1, 6) w2 = randint(1, 6) w3 = randint(1, 6) print(w1, w2, w3) # Bedingung print((w1 != w2) and (w2 != w3)) print((w1 != w2) or (w1 != w3)) print(not((w1 == w2) and (w1 == w3))) print(not((w1 == w2) or (w2 == w3)))
147
Pasch Aufgabe: Was leistet das folgende Programm? Analysiere hierzu den Quelltext und erkläre die einzelnen Anweisungen. Teste anschließend deine Vermutung. Aufgabe: Was leistet das folgende Programm? Analysiere hierzu den Quelltext und erkläre die einzelnen Anweisungen. Teste anschließend deine Vermutung from random import randint # Verarbeitung pasch = False versuche = 0 while not pasch: w1 = randint(1, 6) w2 = randint(1, 6) w3 = randint(1, 6) versuche = versuche + 1 if w1 == w2 and w1 == w3: pasch = True # Ausgabe print(versuche) from random import randint # Initialisierung n = 5 # Verarbeitung (mit Ausgaben) pasch = True w1 = randint(1, 6) print(w1) for i in range(n-1): w = randint(1, 6) print(w) if w != w1: pasch = False # Ausgabe if pasch: print('Pasch') else: print('kein Pasch')
148
Logische Operatoren A: Die Augenzahl von Würfel 1 ist gleich der Augenzahl von Würfel 2. B: Die Augenzahl von Würfel 2 ist gleich der Augenzahl von Würfel 3. "Pasch": A und B "kein Pasch": (nicht A) oder (nicht B) a not a False True True False a b a and b False False False False True False True False False True True True a b a or b False False False False True True True False True True True True nicht Negation Konjunktion und Disjunktion oder
149
Fachkonzept - Wahrheitswerte
Der Datentyp Wahrheitswerte beschreibt die Menge {wahr, falsch} der Wahrheitswerte zusammen mit den Operationen, die man mit Wahrheitswerten ausführen kann. Wahrheitswerte treten bei der Auswertung von Bedingungen auf. Wahrheitswerte können aber auch direkt mit logischen Variablen verwaltet werden. from random import randint # Verarbeitung w1 = randint(1, 6) w2 = randint(1, 6) w3 = randint(1, 6) versuche = 1 while not (w1 == w2 and w1 == w3): versuche = versuche + 1 # Ausgabe print(versuche) from random import randint # Initialisierung n = 5 # 5er-Pasch # Verabeitung gefunden = False versuche = 0 while not gefunden: versuche = versuche + 1 pasch = True w1 = randint(1, 6) for i in range(n-1): w = randint(1, 6) pasch = pasch and (w == w1) if pasch: gefunden = True # Ausgabe print(versuche) zusammengesetzte Bedingung logische Variable
Ähnliche Präsentationen
© 2025 SlidePlayer.org Inc.
All rights reserved.