Leseprobe - Kapitel 1: Thomas Theis Einstieg in Python Inhalt A Einführung 15 A.1 Dieses Buch 15 A.2 Python-Programmierkurs 15 A.3 Schnelle Anwendungs-Entwicklung 16 A.4 Installation 17 B Programmierkurs 19 B.1 B.1.1 B.1.2 B.1.3 B.1.4 B.1.5 Python als Taschenrechner 19 Aufruf der Python Shell 19 Addition, Subtraktion und Multiplikation 19 Division 20 Rangfolge der Rechenoperatoren, Klammern 21 Variablen, Zuweisung 22 B.2 B.2.1 B.2.2 B.2.3 B.2.4 B.2.5 B.2.6 Ein erstes Programm 23 Eingabe eines Programms 23 Speicherung eines Programms 25 Aufruf des Programms über die Python Shell 26 Aufruf des Programms aus der Kommandozeile 27 Kommentare 30 Verkettung von Ausgaben 30 B.3 B.3.1 B.3.2 B.3.3 B.3.4 B.3.5 B.3.6 Verzweigungen 31 Vergleichsoperatoren 31 Einfache Verzweigung 31 Mehrfache Verzweigung 34 Logische Operatoren 35 Geschachtelte Verzweigung 38 Rangfolge der bisher genutzten Operatoren 39 B.4 B.4.1 B.4.2 B.4.3 Schleifen 39 for-Schleife 40 Exkurs: Formatierte Ausgabe 43 while-Schleife 45 B.5 B.5.1 B.5.2 B.5.3 B.5.4 Fehler und Ausnahmen 46 Basisprogramm mit Fehlern 47 Programmabbruch vermeiden 48 Fehler abfangen 50 Fehler erzeugen 52 B.6 B.6.1 B.6.2 Funktionen und Module 53 Einfache Funktionen 54 Funktionen mit einem Parameter 57 Inhalt 5 6 B.6.3 B.6.4 B.6.5 Funktionen mit mehreren Parametern 58 Funktionen mit Rückgabewert 60 Module 61 B.7 B.7.1 B.7.2 B.7.3 Programmierprojekt Rechnungserstellung 63 Aufgabenstellung 63 Ablaufplan des Programms 64 Ausgelagerte Funktionen 64 C Numerische Objekttypen 69 C.1 C.1.1 C.1.2 C.1.3 C.1.4 C.1.5 Reelle Zahlen 69 Ganze Zahlen 70 Lange ganze Zahlen 72 Zahlen mit Nachkommastellen 73 Rechenoperatoren für reelle Zahlen 74 Funktionen für reelle Zahlen 76 C.2 C.2.1 C.2.2 Komplexe Zahlen 79 Komplexe Zahlen, Rechenoperatoren 79 Funktionen für komplexe Zahlen 81 C.3 Zufallszahlen 82 D Sequenzielle Objekttypen 87 D.1 D.1.1 D.1.2 D.1.3 D.1.4 D.1.5 Strings, Sequenzen allgemein 87 Strings 87 Operatoren für Sequenzen 88 Slices, Operationen für Sequenzen 89 Funktionen für Strings 92 Konvertierung zwischen Strings und Zahlen 94 D.2 D.2.1 Listen 96 Operationen und Funktionen für Listen 100 D.3 Tupel 103 D.4 D.4.1 Dictionaries 104 Operationen und Funktionen für Dictionaries 106 D.5 Wahrheitswerte 109 D.6 Kopie, Referenz und Identität 113 Inhalt E Erweiterungen 117 E.1 E.1.1 E.1.2 E.1.3 E.1.4 Grundlagen 117 Kombinierte Zuweisungsoperatoren 117 Tupel entpacken, mehrfache Zuweisung 119 Anweisung in mehreren Zeilen 121 Kommentierte Eingabe 122 E.2 E.2.1 E.2.2 E.2.3 E.2.4 E.2.5 Verzweigungen und Schleifen 123 Anweisung pass 123 Bedingung mit mehreren Vergleichsoperatoren 124 Schleifensteuerung mit break und continue 125 Funktion range() 126 Formatierte Ausgabe-Ausdrücke 128 E.3 E.3.1 Fehler und Ausnahmen 132 Unterscheidung von Ausnahmen 132 E.4 E.4.1 E.4.2 E.4.3 E.4.4 E.4.5 E.4.6 E.4.7 Funktionen 134 Variable Anzahl von Parametern 134 Aufruf mit benannten Parametern 135 Voreingestellte Parameter 136 Mehrere Rückgabewerte 138 Auswirkungen der Veränderung von Parametern 138 Lokaler und globaler Namensraum 142 Lambda 144 E.5 E.5.1 E.5.2 E.5.3 E.5.4 Datum und Zeit 144 Aktuelle Zeit ermitteln und ausgeben 145 Beliebige Zeitangabe erzeugen 148 Mit Zeitangaben rechnen 149 Programm anhalten 151 E.6 E.6.1 E.6.2 E.6.3 E.6.4 E.6.5 E.6.6 Multi-Threading 152 Was ist Multi-Threading 152 Erzeugung eines Threads 153 Identifizierung eines Threads 155 Gemeinsame Objekte 156 Threads und Exceptions 158 Sperren von Objekten 159 E.7 Reguläre Ausdrücke 163 Inhalt 7 8 F Objektorientierte Programmierung 171 F.1 Was ist OOP? 171 F.2 Klassen, Objekte und eigene Methoden 172 F.3 Konstruktoren und Destruktoren 174 F.4 Weitere eingebaute Methoden 176 F.5 Überladen von Operatoren 178 F.6 Kopie, Referenz und Identität 179 F.7 Vererbung 181 F.8 Mehrfachvererbung 184 G Dateien und Internet 187 G.1 Parameter der Kommandozeile 187 G.2 G.2.1 G.2.2 G.2.3 G.2.4 G.2.5 G.2.6 G.2.7 G.2.8 Dateien 190 Dateitypen 190 Öffnen und Schließen einer Datei 190 Lesen einer sequenziellen Datei 192 Schreiben einer sequenziellen Datei 195 Standardausgabe verändern 197 Position in Datei verändern 198 Bearbeitung mehrerer Dateien 200 Informationen über Dateien erhalten 201 G.3 G.3.1 G.3.2 G.3.3 G.3.4 G.3.5 G.3.6 G.3.7 G.3.8 G.3.9 Programmierprojekt: Textdatei als Datenbank 202 Hauptmenü 202 Hilfsfunktion allelesen() 204 Liste aller Datensätze anzeigen 204 Hilfsfunktion zahleinlesen() 205 Einen neuen Datensatz erzeugen 206 Einen Datensatz bearbeiten 208 Hilfsfunktion alleschreiben() 209 Einen Datensatz löschen 210 Sortieren 211 G.4 G.4.1 G.4.2 G.4.3 G.4.4 G.4.5 Laden und Senden von Internet-Daten 212 Lokaler Webserver 212 Lesen 213 Kopieren 214 Daten senden 215 Vereinfachte Codierung von Sendedaten 217 G.5 G.5.1 Webserver-Programmierung 218 Ein erstes Programm 219 Inhalt G.5.2 G.5.3 G.5.4 G.5.5 Beantworten einer Benutzer-Eingabe 220 Verbesserte Version 223 Formular-Elemente mit mehreren Werten 224 Verschiedene Typen von Formular-Elementen 227 H Programmierung von Benutzeroberflächen 233 H.1 H.1.1 H.1.2 Einführung 233 Eine erste GUI-Anwendung 233 Ändern von Eigenschaften 235 H.2 H.2.1 H.2.2 H.2.3 H.2.4 H.2.5 H.2.6 H.2.7 H.2.8 H.2.9 H.2.10 H.2.11 H.2.12 H.2.13 Widget-Typen 236 Anzeigefeld, Label 236 Einzeilige Textbox, Entry 239 Versteckte Eingabe 242 Mehrzeilige Textbox, Text 244 Scrollende Textbox, ScrolledText 246 Listbox mit einfacher Auswahl 247 Listbox mit mehrfacher Auswahl 249 Scrollbar, scrollende Widgets 251 Radiobuttons zur Auswahl, Widget-Variablen 253 Radiobuttons zur Auswahl und Ausführung 256 Checkbuttons zur mehrfachen Auswahl 257 Schieberegler, Scale 260 Weitere Ereignisse 262 H.3 H.3.1 H.3.2 H.3.3 H.3.4 H.3.5 H.3.6 H.3.7 Geometrische Anordnung von Widgets 267 Frame-Widget, Methode pack() 268 Ein einfacher Taschenrechner 271 Methode grid() 275 Methode place(), absolute Koordinaten 278 Methode place(), relative Koordinaten 279 Absolute Veränderung von Koordinaten 281 Relative Veränderung von Koordinaten 283 H.4 H.4.1 H.4.2 H.4.3 Menüs und MessageBoxes 287 Menüleisten 287 Kontextmenüs 292 MessageBoxes 296 H.5 H.5.1 H.5.2 H.5.3 H.5.4 Canvas-Grafik 301 Rechteck, Linie, Oval, Polygon, Widget 301 Bogen, Bild und Text 304 Farbtafel 307 Animation 310 Inhalt 9 10 I Zope 313 I.1 I.1.1 I.1.2 I.1.3 I.1.4 Einführung 313 Beschreibung 313 Vorkenntnisse 313 Installation und Start 314 Anmeldung an der Management-Oberfläche 314 I.2 I.2.1 I.2.2 I.2.3 I.2.4 Erstes Dokument erstellen 316 Verzeichnis erstellen 316 DTML-Dokument erstellen und betrachten 317 DTML-Code und HTML-Code 320 Dokument verändern, Vorschau 322 I.3 I.3.1 I.3.2 I.3.3 I.3.4 I.3.5 I.3.6 Website erweitern 323 Externe HTML-Dokumente laden 323 Bild einfügen 324 Hyperlink einfügen 326 Objekte bearbeiten und organisieren 326 Variablen erzeugen und einfügen 328 Suche nach Variablen 330 I.4 I.4.1 I.4.2 I.4.3 I.4.4 Dynamische Websites 330 Formularverarbeitung 330 Python einfügen 333 Verzweigungen mit DTML 337 Schleifen mit DTML 339 I.5 I.5.1 I.5.2 Kataloge 341 Katalog anlegen, Standardsuche 341 Standardsuche aufbereiten 346 J Zope und Datenbanken 349 J.1 Einführung 349 J.2 Zugriff auf SQL-Datenbanken mit Zope 350 J.3 Datenbank erzeugen, Verbindung herstellen 351 J.4 J.4.1 J.4.2 Tabelle erzeugen 353 SQL-Anweisung zur Erzeugung einer Tabelle 353 Tabelle erzeugen 353 J.5 J.5.1 J.5.2 J.5.3 J.5.4 Eingabe von Daten 356 SQL-Anweisung zur Eingabe von Daten 356 Eingabemethode erzeugen 356 Standard-Objekte zur Eingabe erzeugen 359 Standard-Objekte zur Eingabe aufbereiten 360 J.6 J.6.1 J.6.2 Auswahl von Daten 362 SQL-Anweisung zur Auswahl von Daten 362 Auswahlmethode erzeugen 363 Inhalt J.6.3 J.6.4 Standard-Objekt zur Auswahl erzeugen 364 Standard-Objekt zur Auswahl aufbereiten 364 J.7 J.7.1 J.7.2 J.7.3 Löschen von Daten 366 SQL-Anweisung zum Löschen von Daten 366 Alle Datensätze zum Löschen anzeigen 367 Einen Datensatz löschen 368 J.8 J.8.1 J.8.2 J.8.3 J.8.4 Aktualisieren von Daten 370 SQL-Anweisung zum Aktualisieren von Daten 370 Alle Datensätze zum Aktualisieren anzeigen 371 Einen Datensatz zum Aktualisieren anzeigen 372 Einen Datensatz aktualisieren 374 J.9 Schnittstelle zur Datenbank 376 K HTML 379 K.1 Sonderzeichen im Quellcode 379 K.2 Markierungen 380 K.3 Dokumentaufbau 381 K.4 K.4.1 K.4.2 Hyperlinks 383 URL 384 Anker 385 K.5 Zentrale Einstellungen 386 K.6 K.6.1 K.6.2 Grafische Markierungen 386 Schriftformatierung 387 Absatzformatierung 389 K.7 Logische Markierungen 390 K.8 K.8.1 Bilder 391 Bilder als Hyperlinks 392 K.9 Listen 393 K.10 K.10.1 K.10.2 K.10.3 Tabellen 395 Tabelle erzeugen 395 Breite, horizontale Ausrichtung und Rahmen 396 Zellen verbinden, vertikale Ausrichtung 398 K.11 K.11.1 K.11.2 K.11.3 K.11.4 Frames 399 Erstellen von Frames 400 Frames schachteln, Größe verändern 402 Namen, Targets 403 Beispiel 404 K.12 Image Maps 407 K.13 Formulare 409 Inhalt 11 12 L Python und MySQL 413 L.1 L.1.1 L.1.2 L.1.3 Projekt 413 Beschreibung 413 Voraussetzung 413 Datenbank und Tabelle erzeugen 414 L.2 L.2.1 L.2.2 L.2.3 L.2.4 L.2.5 L.2.6 L.2.7 Python-Programm 415 Haupt-Menü 415 Liste aller Datensätze anzeigen 417 Hilfs-Funktion zahleinlesen() 419 Einen neuen Datensatz erzeugen 419 Einen Datensatz bearbeiten 422 Einen Datensatz löschen 424 Sortieren 425 L.3 L.3.1 L.3.2 L.3.3 Informationen über Datenbanken 426 Anzeige der Datenbanken 427 Anzeige der Tabellen einer Datenbank 427 Anzeige der Felder einer Tabelle 428 M Datenbanken mit MySQL 431 M.1 M.1.1 M.1.2 Datenbanken 431 Datenbanken allgemein 431 Datenbanken mit MySQL 432 M.2 M.2.1 M.2.2 M.2.3 Benutzung unter Windows 432 Installation 432 Start 433 MySQL-Monitor 433 M.3 M.3.1 M.3.2 M.3.3 M.3.4 M.3.5 Struktur von Datenbank und Tabelle 434 Datenbank erzeugen, benutzen, löschen 434 Tabelle erzeugen 435 Tabelle komprimieren, löschen 436 Tabellenstruktur ändern 436 Informationen über Datenbanken und Tabellen anzeigen 437 M.4 M.4.1 M.4.2 M.4.3 M.4.4 M.4.5 M.4.6 M.4.7 Datensätze bearbeiten 438 Datensätze erzeugen 438 Datensätze auswählen und anzeigen 439 Vergleichs-Operatoren, logische Operatoren 441 Vergleichsoperator like 442 Sortierung 442 Datensätze ändern 443 Datensätze löschen 444 Inhalt M.5 M.5.1 M.5.2 M.5.3 Eindeutigkeit von Datensätzen, Index 445 Neue Tabelle mit Index erzeugen 446 Index zu vorhandener Tabelle hinzufügen 446 Index löschen 447 M.6 Hilfsmittel für MySQL-Datenbanken 448 M.7 Alle MySQL-Befehle 448 N Anhang 451 N.1 N.1.1 N.1.2 Anhang zu Kapitel B 451 Liste der reservierten Worte 451 Vollständige Rangfolge der Operatoren 452 N.2 N.2.1 N.2.2 Anhang zu Kapitel C 453 Funktionen des Moduls math 453 Funktionen des Moduls cmath 454 O Lösungen 457 O.1 Lösungen zu Kapitel B 457 O.2 Lösungen zu Kapitel C 466 Index 469 Inhalt 13 A Einführung In diesem Kapitel werden die beiden Themen dieses Buches, Python und Zope, kurz vorgestellt. Der Leser wird zur eigenen Programmierung in Python angeleitet. Die Installation von Python unter Windows wird beschrieben. A.1 Dieses Buch Im vorliegenden Buch wird dem Leser eine Einführung in zwei Themen vermittelt: Python und Zope. 왘 Python ist eine sehr einfach zu erlernende Programmiersprache und ideal als Einstieg in die Welt der Programmierung geeignet. Trotz ihrer Einfachheit bietet diese Sprache auch die Möglichkeit, komplexe Programme für vielfältige Anwendungsgebiete zu schreiben. 왘 Zope dient als Werkzeug zur Herstellung dynamischer Websites. Alle Komponenten, die dazu benötigt werden, sind in Zope enthalten. Es ist mit Hilfe von Python entstanden und kann in Zusammenarbeit mit Python-Programmen eingesetzt werden. Die Kapitel B bis H dieses Buches widmen sich den verschiedenen Aspekten der Programmierung mit Python. In den Kapiteln I und J wird die Entwicklung von Websites mit Zope, auch im Hinblick auf Datenbanken, vorgestellt. Kapitel L behandelt die Zusammenarbeit zwischen Python und MySQL-Datenbanken. Die Kapitel K und M frischen die Grundlagen zu den Themen HTML und MySQL auf. Es wird besonderer Wert darauf gelegt, dass der Leser selber praktisch mit Python und Zope arbeitet. Er wird von Anfang an dazu aufgefordert, dem logischen Faden von Erklärungen und Beispielen zu folgen. A.2 Python-Programmierkurs Im ersten Kapitel, dem Programmierkurs, werden Übungsaufgaben gestellt, die unmittelbar gelöst werden sollten. Auf diese Weise kann der Leser seine Kenntnisse prüfen, bevor er zum nächsten Thema übergeht. Die Lösungen der Übungsaufgaben finden sich in Kapitel O am Ende des Buches. Dabei ist Folgendes zu beachten: Übungsaufgaben 왘 Es gibt für jedes Problem viele richtige Lösungen. Der Leser sollte sich nicht davon beunruhigen lassen, dass seine Lösung eventuell nicht Einführung 15 genau so aussieht wie die angegebene. Die angegebene Lösung ist als Anregung zu betrachten, was man anders und gegebenenfalls besser machen kann. 왘 Bei der eigenen Lösung der Aufgaben wird sicherlich der eine oder andere Fehler auftreten. Man sollte sich dadurch nicht entmutigen lassen. 왘 Nur aus Fehlern kann man lernen. Auf die vorgeschlagene Art und Weise wird man eine Programmiersprache wirklich erlernen – nicht allein durch das Lesen von Programmierregeln. A.3 Schnelle Anwendungs-Entwicklung Python bietet besonders gute Möglichkeiten zur schnellen Entwicklung umfangreicher Anwendungen. Diese Technik ist unter dem Stichwort RAD (=Rapid Application Development) bekannt geworden. Python vereint zu diesem Zweck folgende Vorteile: einfach 왘 Einfache, eindeutige Syntax: Python ist eine ideale Programmierspra- che für Einsteiger. Sie beschränkt sich auf einfache, klare Anweisungen. In anderen Programmiersprachen werden vielfältige Lösungswege für das gleiche Problem angeboten, so dass der Entwickler weniger geleitet als verunsichert wird. Python beschränkt sich häufig auf einen einzigen möglichen Lösungsweg. Dieser prägt sich ein und wird dem Entwickler vertraut. klar 왘 Klare Strukturen: Ein Entwickler wird in Python gezwungen, in einer gut lesbaren Struktur zu schreiben. Die Anordnung der Programmzeilen ergibt gleichzeitig die logische Struktur des Programms. wiederverwendbar 왘 Wiederverwendung von Code: Die Modularisierung, d.h. die Zerle- einheitliche Objekte 왘 Objekt-Bearbeitung: In Python werden alle Daten als Objekte gespei- 16 gung eines Problems in Teil-Probleme und die anschliessende Zusammenführung der Teil-Lösungen zu einer Gesamt-Lösung, wird in Python sehr leicht gemacht. Die vorhandenen Teil-Lösungen können sehr unkompliziert für weitere Aufgabenstellungen genutzt werden, so dass ein Entwickler nach einiger Zeit über einen umfangreichen Pool an Modulen verfügt. chert. Dies führt zu einer einheitlichen Daten-Behandlung für Objekte unterschiedlichen Typs. Andererseits wird die physikalische Speicherung der Objekte von Python automatisch, ohne Eingriff des Entwick- Einführung lers vorgenommen. Er muss sich nicht um die Reservierung bzw. Freigabe geeigneter Speicherbereiche kümmern. 왘 Interpreter / Compiler: Python-Programme werden unmittelbar inter- interpretiert pretiert. Sie müssen nicht erst kompiliert und gebunden werden. Dies ermöglicht einen häufigen, schnellen Wechsel zwischen Codierungsund Testphase. 왘 Betriebssystem-Unabhängigkeit: Sowohl Programme, die von der unabhängig Kommandozeile aus bedient werden, als auch Programme mit grafischen Benutzeroberflächen können auf unterschiedlichen Betriebssystemen (Windows, Unix, Mac OS) ohne Neu-Entwicklung und Anpassung eingesetzt werden. A.4 Installation Python ist eine frei verfügbare Programmiersprache, die auf verschiedenen Betriebssystem-Plattformen eingesetzt werden kann. Auf der CD zu diesem Buch findet sich die Version 2.2.1 für Windows. Die jeweils neueste Version kann man sich von der offiziellen Python-Website http://www.python.org aus dem Internet laden. Zur Installation unter Windows ruft man die ausführbare Datei, z.B. [CDRom-Laufwerk]:\Python\Python-2.2.1.exe auf. Die Voreinstellungen des Installationsvorganges können unverändert übernommen werden. Dabei wird Python im Verzeichnis c:\python22 installiert. Anschließend verfügt man über einen Eintrag im Startmenü, Programme, Python 2.2 mit dem folgenden Inhalt: Installation Abbildung A.1 Python, Eintrag im Windows-Startmenü Die Installation von Zope wird im Kapitel I unmittelbar beim Einsatz dieses Werkzeuges besprochen. Installation 17 B Programmierkurs Ein Programmierkurs mit vielen Erläuterungen führt den Leser schrittweise in die Programmierung mit Python ein. Übungsaufgaben geben ihm die Gelegenheit, seine Kenntnisse unmittelbar zu testen. Ein Programmierprojekt verknüpft zum Abschluss viele Teilaspekte zu einem Ganzen. B.1 Python als Taschenrechner B.1.1 Aufruf der Python Shell Man ruft über Startmenü, Programme, Python 2.2, IDLE (Python GUI) die nachfolgend dargestellte Entwicklungsumgebung IDLE für Python auf. Sie wird auch Python Shell genannt. Sie kann sowohl zur Programmierung als auch als »Taschenrechner« genutzt werden. Python Shell Abbildung B.1 Entwicklungsumgebung IDLE, Python Shell Zur Durchführung kleinerer Berechnungen müssen keine vollständigen Programme geschrieben und gestartet werden. Man kann die gewünschten Rechenoperationen direkt an der Eingabestelle, erkennbar an den Zeichen >>>, eingeben. Eine abschließende Betätigung der (¢)-Taste führt zur unmittelbaren Berechnung und Ausgabe des Ergebnisses. Die dabei angewendeten Rechenregeln finden auch bei der Erstellung »richtiger« Python-Programme Verwendung, es lohnt sich also eine genauere Betrachtung. B.1.2 Addition, Subtraktion und Multiplikation Nachfolgend werden Eingabe, Verarbeitung und Ausgabe einiger einfacher Berechnungen dargestellt: Programmierkurs 19 >>> 41+7.5 48.5 >>> 12–18 -6 >>> 7*3 21 Listing B.1 Einige einfache Berechnungen Berechnungen Zur Erläuterung: Der Reihe nach werden die Operatoren + (Addition), (Subtraktion) und * (Multiplikation) eingesetzt. Das Ergebnis erscheint jeweils in der Zeile darunter, nachdem man die (¢)-Taste gedrückt hat. Als Dezimalzeichen gilt der Punkt, wie bei der ersten Berechnung (41 + 7.5 = 48.5) erkennbar. B.1.3 Division Es folgen zwei Divisionsaufgaben: >>> 20/8 2 >>> 20/-8 -3 Listing B.2 Divisionsaufgaben Zur Erläuterung: Es fällt auf, dass es sich nicht um die mathematisch richtigen Ergebnisse (2.5 und -2.5) handelt. Dies liegt daran, dass beide Zahlen als ganze Zahlen eingegeben wurden. Bei Python wird das Ergebnis einer solchen Division berechnet, indem: 왘 das mathematisch richtige Ergebnis ermittelt wird 왘 die nächstkleinere ganze Zahl ermittelt wird (von 2.5 aus ist dies 2, von -2.5 aus ist dies -3) In einigen wenigen Fällen mag dieses Ergebnis erwünscht sein. Falls man bei einer Division allerdings das richtige Ergebnis haben möchte, so sollte man zumindest bei einer der beiden Zahlen angeben, dass Stellen hinter dem Komma gewünscht sind. Dies wird nachfolgend dargestellt: >>> 20/8.0 2.5 >>> 20.0/8 2.5 20 Programmierkurs >>> 20/-8.0 -2.5 >>> 20.0/-8 -2.5 Listing B.3 Ergebnisse mit Nachkommastellen Zur Erläuterung: 왘 Das richtige Ergebnis erscheint, sobald entweder die Zahl 20 oder die Zahl 8 als 20.0 bzw. 8.0 eingegeben werden. B.1.4 Rangfolge der Rechenoperatoren, Klammern Es gilt, wie in der Mathematik, Punkt- vor Strichrechnung. Multiplikation und Division haben also Vorrang vor Addition und Subtraktion. Das Setzen von Klammern führt dazu, dass die Ausdrücke innerhalb der Klammern als Erstes berechnet werden. Beides wird an den folgenden Beispielen gezeigt: Rangfolge >>> 7+2*3 13 >>> (7+2)*3 27 Listing B.4 Rangfolge der Operatoren Zur Erläuterung: Bei der ersten Rechnung werden zunächst 2 und 3 multipliziert, anschließend wird 7 addiert. Bei der zweiten Rechnung werden zunächst 7 und 2 addiert, anschließend wird mit 3 multipliziert. Übung B01 Es wird vorausgesetzt, dass Python wie angegeben installiert wurde. Rufen Sie die Entwicklungsumgebung IDLE auf. Ermitteln Sie die mathematisch richtigen Ergebnisse der folgenden vier Aufgaben: 13 - 5 * 2 + 12 / 6 7 / 2 - 5 / 4 (12 - 5 * 2) / 4 (1 / 2 - 1 / 4 + (4 + 3) / 8) * 2 Die Lösungen aller Übungsaufgaben finden Sie in Kapitel O am Ende des Buches. Python als Taschenrechner 21 B.1.5 Variablen zuweisen Variablen, Zuweisung Bisher wurde nur mit Zahlen gerechnet. Python kann, wie jede andere Programmiersprache auch, Zahlen in Variablen speichern, falls sie im Verlauf einer Berechnung mehrmals benötigt werden. Dies soll nachfolgend am Beispiel der Umrechnung von Euro in DM gezeigt werden. >>> ed=1.95583 >>> 2*ed 3.9116599999999999 >>> 5*ed 9.7791499999999996 >>> 22.5*ed 44.006174999999999 >>> 2.35*ed 4.5962005000000001 Listing B.5 Zuweisung an Variablen Zur Erläuterung: Bekanntlich entspricht 1 Euro 1.95583 DM. Dieser Umrechnungsfaktor wird zunächst in der Variablen ed gespeichert. Dadurch wird die vereinfachte Durchführung von mehreren EuroUmrechnungen nacheinander erleichtert. Anschließend werden die DMBeträge für 2 Euro, 5 Euro, 22.50 Euro und 2.35 Euro berechnet und ausgegeben. Die Speicherung des Umrechnungsfaktors geschieht mit einer Zuweisung (ed = 1.95583). Das heißt, die Variable ed bekommt den Wert, der rechts vom Gleichheitszeichen steht (1.95583). In Python-Variablen können ganze Zahlen, Zahlen mit Stellen hinter dem Komma, Zeichenketten (also Texte) und andere Objekte eines Programms mit Hilfe von Zuweisungen gespeichert werden. Eine Python-Variable hat keinen festgelegten Typ für den gesamten Verlauf eines Programms. Sie bekommt ihren Typ durch die Zuweisung eines Wertes. Der Name einer Variablen kann frei gewählt werden. Es gelten die folgenden Regeln: 왘 Er kann aus den Buchstaben a bis z, A bis Z, Ziffern oder dem Zeichen _ (=Unterstrich) bestehen. 왘 Er darf nicht mit einer Ziffer beginnen. 22 Programmierkurs 왘 Er darf keinem reservierten Wort der Programmiersprache Python entsprechen (eine Liste der reservierten Worte findet sich im Anhang). 왘 Die Groß- und Kleinschreibung ist zu beachten: Namen, Anweisungen usw. sollten immer genau so geschrieben werden wie vorgegeben. Es wäre natürlich sinnvoll, den DM-Betrag so auszugeben, dass auf zwei Stellen hinter dem Komma gerundet wird. Auf eine solche formatierte Ausgabe wird später noch eingegangen. Übung B02 1 Euro entspricht 6.55957 französischen Franc. Berechnen Sie für die folgenden Euro-Beträge den Franc-Betrag: 5 Euro, 20 Euro, 9.95 Euro und 92.70 Euro. Vereinfachen Sie Ihre Berechnungen, indem Sie den Umrechnungsfaktor zunächst in einer Variablen speichern. B.2 Ein erstes Programm Es soll nun mit Hilfe von Python ermöglicht werden, einen beliebigen Euro-Betrag, den ein Anwender eingibt und der Ihnen als Entwickler nicht bekannt ist, in DM umzurechnen. Dazu ist es notwendig, ein kleines Python-Programm einzugeben, abzuspeichern und aufzurufen. Dieser Vorgang wird nachfolgend ausführlich erklärt. Die einzelnen Schritte sind später bei jedem Python-Programm auszuführen. Eingabe, Verarbeitung, Ausgabe Dabei wird bereits das Prinzip der klassischen Programmierung verdeutlicht: 왘 Eingabe (der Anwender gibt Daten über die Tastatur ein) 왘 Verarbeitung (das Programm verarbeitet diese und andere Daten) 왘 Ausgabe (das Programm gibt das Ergebnis der Verarbeitung auf dem Bildschirm aus) B.2.1 Eingabe eines Programms Zunächst wird in der Entwicklungsumgebung IDLE im Menü File der Menübefehl New Window aufgerufen. Es öffnet sich ein neues Fenster mit dem Titel Untitled. Das Hauptfenster mit dem Titel Python Shell rückt in den Hintergrund. In dem neuen Fenster wird das Programm wie nachfolgend eingegeben: Ein erstes Programm 23 Abbildung B.2 Eingabe eines Programms print, input() Die Anweisung print gibt Text oder Werte von Variablen auf dem Bildschirm aus. Die Funktion input() veranlasst den Anwender des Programms, etwas einzugeben. Der eingegebene Wert sollte einer Variablen zugewiesen werden. Zur Erläuterung der einzelnen Programmzeilen: 왘 In der ersten Zeile wird der Umrechnungsfaktor in der Variablen ed gespeichert. 왘 In der zweiten Zeile wird mit Hilfe der Anweisung print ein Informationstext für den Anwender auf den Bildschirm geschrieben, damit er weiß, was er machen soll. 왘 In der dritten Zeile wird die Funktion input() aufgerufen, d.h., das Programm bleibt stehen und wartet auf eine Eingabe des Anwenders über die Tastatur. An dieser Stelle sollte der Anwender eine Zahl eingeben (mit oder ohne Stellen hinter dem Dezimalpunkt) und die (¢)Taste betätigen. Die eingegebene Zahl wird in der Variablen eurobetrag gespeichert. 왘 In der vierten Zeile wird mit Hilfe des eingegebenen Betrags und des Umrechnungsfaktors der DM-Betrag berechnet und gespeichert. Die Speicherung des Umrechnungsfaktors geschieht mit der Zuweisung dmbetrag = ed * eurobetrag, d.h., die Variable dmbetrag bekommt den Wert des Rechenergebnisses ed * eurobetrag. 왘 In der fünften Zeile wird mit einem kurzen Text die nachfolgende Ergebnisausgabe eingeleitet. 왘 In der sechsten und letzten Zeile wird das Ergebnis, d.h. der berech- nete DM-Betrag auf dem Bildschirm, ausgegeben. Dieses Programm wird bei einem Aufruf durch den Anwender Zeile für Zeile abgearbeitet. 24 Programmierkurs 왘 Falls der Anwender etwas Falsches eingibt, z.B. keine Zahl, sondern Zeichen, wird das Programm mit einer Fehlermeldung beendet. Zunächst soll aber vereinfacht davon ausgegangen werden, dass der Anwender keine falschen Eingaben vornimmt. Die Vermeidung bzw. das Abfangen von Fehlern wird im Abschnitt B.5, Fehler und Ausnahmen, beschrieben. B.2.2 Speicherung eines Programms Nach der Eingabe muss das Programm gespeichert werden. Dazu wird im aktuellen Fenster im Menü File der Menübefehl Save aufgerufen. Das Programm wird in der Datei mit dem Namen b03.py gespeichert, wie nachfolgend gezeigt: Speichern Abbildung B.3 Speicherung des Programms Nach Betätigung der Taste »Speichern« ist die Speicherung vollzogen. Der Name, hier b03, kann frei gewählt werden. Die Endung py ist für PythonProgramme allerdings zwingend vorgeschrieben. Das Fenster mit dem Programm hat nun das nachfolgend dargestellte Aussehen. In der Titelzeile ist der Dateiname bzw. der vollständige Pfadname erkennbar. Ein erstes Programm 25 Abbildung B.4 Gespeichertes Programm B.2.3 Aufrufen Aufruf des Programms über die Python Shell Zum Aufruf des Programms wird im Menü Edit der Menübefehl Run Script ausgeführt (Tastenkombination: (Strg) + (F5)). Das Hauptfenster der Entwicklungsumgebung (die Python Shell) rückt in den Vordergrund, der Informationstext für den Anwender erscheint und das Programm wartet auf eine Eingabe: Abbildung B.5 Eingabeposition Nach der Eingabe einer Zahl (hier 45.2) und der Betätigung der (¢)-Taste erscheint das Ergebnis. Damit endet das Programm: Abbildung B.6 Ergebnis des Programms 26 Programmierkurs Über die Task-Leiste kann man das Programmfenster wieder in den Vordergrund rücken. Falls man Veränderungen am Programm vornehmen möchte, so ist anschließend eine erneute Speicherung vorzunehmen. Dabei wird nicht mehr nach dem Dateinamen gefragt, da dieser bereits bekannt ist. Falls ein anderes Programm entwickelt werden soll, so sollte das Programmfenster geschlossen und ein neues Programmfenster über das Menü File, New Window geöffnet werden. B.2.4 Aufruf des Programms aus der Kommandozeile Das Programm in der Datei b03.py ist ein Kommandozeilen-Programm, d.h., es erwartet eine Eingabe über die Tastatur und erzeugt eine einfache Ausgabe auf dem Bildschirm ohne Erzeugung einer eigenen Benutzeroberfläche. Im Kapitel H, Programmierung von Benutzeroberflächen, wird gezeigt, wie man mit Hilfe von Python Programme mit grafischen Benutzeroberflächen erzeugen kann. Kommandozeile Für einen Aufruf des Programms aus der Kommandozeile muss unter Windows zunächst auf den DOS-Bildschirm gewechselt werden. Dazu hat man die beiden folgenden Möglichkeiten: 왘 Startmenü, Programme, MS-DOS-Eingabeaufforderung 왘 Startmenü, Ausführen, Eingabe und Bestätigung (mit OK) des Befehls command, wie nachfolgend dargestellt: Abbildung B.7 Wechsel zur Kommandozeile Es erscheint die MS-DOS-Eingabeaufforderung, hier für MS Windows 98: Ein erstes Programm 27 Abbildung B.8 MS-DOS-Eingabeaufforderung Mit Eingabe des Befehls cd\python22 wechselt man in das Verzeichnis c:\python22, in dem Python installiert und in dem das Programm b03.py abgelegt wurde: Abbildung B.9 Wechsel in das Python-Installationsverzeichnis Aufrufen Anschließend veranlasst man die Ausführung des Programms mit der Anweisung python b03.py. Der Informationstext für den Anwender erscheint und das Programm wartet auf eine Eingabe: Abbildung B.10 Eingabeposition 28 Programmierkurs Nach der Eingabe einer Zahl (hier 45.2) und der Betätigung der (¢)-Taste erscheint das Ergebnis. Damit endet das Programm: Abbildung B.11 Programm beendet Dieses DOS-Fenster kann man für spätere Aufrufe von Python-Programmen geöffnet lassen oder mit Eingabe des Befehls exit wieder schließen. Python-Programme können auch mit einem einfachen Doppelklick auf den Dateinamen im Windows-Explorer gestartet werden. Es öffnet sich ebenfalls ein DOS-Fenster, das sich allerdings nach erfolgter Eingabe unmittelbar wieder schließt, sodass das Ergebnis der Berechnung nicht zu sehen ist. Abhilfe könnte durch eine zusätzliche Eingabeaufforderung am Ende des Programms geschaffen werden. Diese hätte nur die Aufgabe, das Fenster sichtbar zu lassen. Allerdings ist diese Methode nicht empfehlenswert. Kein Doppelklick Übung B04 Schreiben Sie ein Programm zur Eingabe und Umrechnung von beliebigen Euro-Beträgen in französische Franc. Speichern Sie das Programm in der Datei b04.py. Rufen Sie das Programm sowohl unter der Entwicklungsumgebung IDLE als auch unter DOS auf. Übung B05 Schreiben Sie ein Programm zur Berechnung des monatlich zu zahlenden Steuerbetrags. Der Anwender soll zunächst dazu aufgefordert werden, sein monatliches Bruttogehalt einzugeben. Anschließend werden (hier sehr vereinfacht) 18% dieses Betrags berechnet und ausgegeben. Speichern Sie das Programm in der Datei b05.py. Ein erstes Programm 29 B.2.5 Kommentare Kommentieren Bei umfangreicheren Programmen erweist es sich als sehr nützlich, Kommentare zur Erläuterung in den Programmtext einzufügen. Kommentare werden durch das Zeichen # (Doppelkreuz) eingeleitet und gehen bis zum Zeilenende. Sie werden nicht als Programmschritte betrachtet und gelangen nicht zur Ausführung. Nachfolgend wurde das Programm in der Datei b03.py um Kommentare erweitert. ed = 1.95583 # Umrechnungsfaktor # Eingabe print "Geben Sie einen Betrag in Euro ein" eurobetrag = input() # Verarbeitung dmbetrag = ed * eurobetrag # Ausgabe print "Dies sind in DM:" print dmbetrag Listing B.6 Datei b03.py B.2.6 Verkettung von Ausgaben Mehrere Ausgaben Mit Hilfe der Anweisung print können auch mehrere Ausgaben in einer Zeile ausgegeben werden. Die einzelnen Teile der Ausgabe werden durch Kommata voneinander getrennt. Nachfolgend wurde die Ausgabe des Programms in der Datei b03.py geändert (man beachte besonders die letzte Zeile). ed = 1.95583 # Umrechnungsfaktor # Eingabe print "Geben Sie einen Betrag in Euro ein" eurobetrag = input() # Verarbeitung dmbetrag = ed * eurobetrag # Ausgabe print "Dies sind in DM:", dmbetrag Listing B.7 Datei b03.py (inklusive Verkettung) 30 Programmierkurs Der Ausgabetext wird dann in einer Zeile dargestellt: >>> Geben Sie einen Betrag in Euro ein 45.2 Dies sind in DM: 88.403516 B.3 Verzweigungen In den bisherigen Programmen wurden alle Anweisungen der Reihe nach ausgeführt. Zur Steuerung eines Programmablaufs werden allerdings häufig Verzweigungen benötigt. Innerhalb des Programms wird dann aufgrund einer Bedingung entschieden, welcher Zweig des Programms ausgeführt werden soll. B.3.1 Bedingte Ausführung Vergleichsoperatoren Bedingungen werden mit Hilfe von Vergleichsoperatoren formuliert. Es folgt eine Tabelle der Vergleichsoperatoren und ihrer Bedeutung: Operator Bedeutung > größer als < kleiner als >= größer als oder gleich <= kleiner als oder gleich == gleich != ungleich Tabelle B.1 Vergleichsoperatoren B.3.2 Einfache Verzweigung Im folgenden Beispiel wird untersucht, ob eine Variable größer als 0 ist. Wenn dies der Fall ist, so wird ausgegeben: »Diese Zahl ist größer als 0«, ansonsten wird ausgegeben: »Diese Zahl ist kleiner oder gleich 0«. Es wird also nur eine der beiden Anweisungen ausgeführt. if-else x = 12 if x > 0: print "Diese Zahl ist größer als 0" Verzweigungen 31 else: print "Diese Zahl ist kleiner oder gleich 0" Listing B.8 Datei b06.py Zur Erläuterung: 왘 In der ersten Zeile bekommt die Variable x den Wert 12 zugewiesen. 왘 In der zweiten Zeile wird mit Hilfe der Anweisung if eine Verzweigung eingeleitet. Danach wird eine Bedingung formuliert (hier x>0), die entweder wahr oder falsch ergibt. Anschließend folgt das Zeichen : (Doppelpunkt). Einrücken 왘 Es folgen eine oder mehrere Anweisungen, die nur ausgeführt wer- den, falls die Bedingung wahr ergibt. Es ist erforderlich, die Anweisungen innerhalb des so genannten if-Zweiges mit Hilfe der (ÿ__)-Taste einzurücken. Ansonsten kann Python die Zugehörigkeit zur Verzweigung nicht erkennen. Gleichzeitig wird das Programm dadurch übersichtlicher. 왘 In der vierten Zeile wird mit Hilfe der Anweisung else der alternative Teil der Verzweigung eingeleitet. Es folgt ebenfalls ein Doppelpunkt. 왘 Es folgen eine oder mehrere Anweisungen, die nur ausgeführt wer- den, falls die Bedingung falsch ergibt. Auch diese Anweisungen müssen eingerückt werden. Die Ausgabe des Programms: >>> Diese Zahl ist größer als 0 Ein weiteres Beispiel zur einfachen Verzweigung: Es soll wiederum eine Umrechnung eines Betrags von Euro in eine andere Währung erfolgen. Der Anwender entscheidet, ob dies DM oder französische Franc (FF) sein sollen. print "Geben Sie einen Betrag in Euro ein" eurobetrag = input() print "Umrechnung in DM (1) oder in Franc (2)?" antwort = input() if antwort == 1: ed = 1.95583 ubetrag = ed * eurobetrag 32 Programmierkurs else: ef = 6.55957 ubetrag = ef * eurobetrag print "Ergebnis:" print ubetrag Listing B.9 Datei b07.py Zur Erläuterung: Es werden zwei Zahleneingaben gefordert, zum einen der Betrag in Euro, zum anderen soll eine Zahl eingegeben werden, mit deren Hilfe das Programm entscheiden kann, in welche Währung umgerechnet werden soll. 왘 Falls der Anwender eine 1 eingibt, so wird der Umrechnungsfaktor für DM zugewiesen und in DM umgerechnet. 왘 Falls der Anwender eine 2 (oder eine andere Zahl) eingibt, so wird der Umrechnungsfaktor für FF zugewiesen und in FF umgerechnet. Nach der Verzweigung wird das Ergebnis ausgegeben, unabhängig davon, auf welche Art und Weise es berechnet wurde. Die zusätzlichen Leerzeilen im Programm sind nicht unbedingt erforderlich. Sie dienen nur der besseren Übersicht. Eine mögliche Ausgabe des Programms: >>> Geben Sie einen Betrag in Euro ein 24.5 Umrechnung in DM (1) oder in Franc (2)? 1 Ergebnis: 47.917835 Übung B08 Das Programm zur Berechnung des monatlich zu zahlenden Steuerbetrags soll verändert werden. Der Anwender soll zunächst dazu aufgefordert werden, sein monatliches Bruttogehalt einzugeben. Falls das Gehalt über 2.500 Euro liegt, so sind 22% Steuer zu zahlen, ansonsten 18% Steuer. Speichern Sie das Programm in der Datei b08.py. Zur Erläuterung: Es ist nur eine Eingabe erforderlich. Innerhalb des Programms muss aufgrund des Gehaltes entschieden werden, welcher Steuersatz genommen wird. Verzweigungen 33 B.3.3 Mehrfache Verzweigung In vielen Anwendungsfällen gibt es mehr als zwei Möglichkeiten, zwischen denen zu entscheiden ist. Dazu wird eine mehrfache Verzweigung benötigt. if-elif-else Im folgenden Beispiel wird untersucht, ob eine Variable größer als 0, kleiner als 0 oder gleich 0 ist. Es wird eine entsprechende Meldung ausgegeben: x = -12 if x > 0: print "Diese Zahl ist größer als 0" elif x < 0: print "Diese Zahl ist kleiner als 0" else: print "Diese Zahl ist gleich 0" Listing B.10 Datei b09.py Zur Erläuterung: 왘 Mit der Anweisung if wird die Verzweigung eingeleitet. Falls x größer als 0 ist, werden die nachfolgenden, eingerückten Anweisungen ausgeführt. 왘 Nach der Anweisung elif wird eine weitere Bedingung formuliert. Diese wird nur untersucht, falls die erste Bedingung (nach dem if) nicht zutraf. Falls x kleiner als 0 ist, werden die nachfolgenden, eingerückten Anweisungen ausgeführt. 왘 Die Anweisungen nach der Zeile mit der else-Anweisung werden nur durchgeführt, falls keine der beiden vorherigen Bedingungen zutraf (hinter dem if und hinter dem elif). In diesem Fall bedeutet das, dass x gleich 0 ist, da es nicht größer und nicht kleiner als 0 ist. Die Ausgabe des Programms: >>> Diese Zahl ist kleiner als 0 Innerhalb einer Verzweigung können mehrere elif-Anweisungen vorkommen. Diese werden der Reihe nach untersucht, bis das Programm zu der Bedingung kommt, die zutrifft. Die weiteren elif-Anweisungen oder eine else-Anweisung werden dann nicht mehr beachtet. 34 Programmierkurs Es ist nicht zwingend notwendig, dass eine else-Anweisung bei einer einfachen Verzweigung oder bei einer mehrfachen Verzweigung vorkommt. Übung B10 Das Programm zur Berechnung des monatlich zu zahlenden Steuerbetrags soll weiter verändert werden (Datei b10.py). Der Anwender soll zunächst dazu aufgefordert werden, sein monatliches Bruttogehalt einzugeben. Anschließend soll das Gehalt nach der folgenden Steuertabelle berechnet werden: Gehalt Steuersatz mehr als 4.000 Euro 26% weniger als 2.500 Euro 18% dazwischen 22% Tabelle B.2 Steuertabelle für die Übung B.3.4 Logische Operatoren Mit Hilfe der logischen Operatoren (and, or und not) können mehrere Bedingungen miteinander verknüpft werden. Logische Verknüpfung 왘 Eine Bedingung, die aus einer oder mehreren Einzelbedingungen besteht, die mit dem Operator and (=und) verknüpft sind, ergibt wahr, wenn jede der Einzelbedingungen wahr ergibt. 왘 Eine Bedingung, die aus einer oder mehreren Einzelbedingungen besteht, die mit dem Operator or (=oder) verknüpft sind, ergibt wahr, wenn eine der Einzelbedingungen wahr ergibt. 왘 Der Operator not (=nicht) kehrt den Wahrheitswert einer Bedingung um, d.h., eine falsche Bedingung wird wahr, eine wahre Bedingung wird falsch. Der gleiche Zusammenhang nachfolgend in einer Wahrheitswerttabelle dargestellt: Verzweigungen 35 Bedingung 1 Operator Bedingung 2 gesamte Bedingung wahr and wahr wahr wahr and falsch falsch falsch and wahr falsch falsch and falsch falsch wahr or wahr wahr wahr or falsch wahr falsch or wahr wahr falsch or falsch falsch not wahr falsch not falsch wahr Tabelle B.3 Ergebnis beim Einsatz von logischen Operatoren Ein Beispiel: x = 12 y = 15 z = 18 # Bedingung 1 if x<y and x<z: print "x ist die kleinste Zahl" else: print "x ist nicht die kleinste Zahl" # Bedingung 2 if y>x or y>z: print "y ist nicht die kleinste Zahl" # Bedingung 3 if not z>y: print "z ist nicht größer als y" else: print "z ist größer als y" Listing B.11 Datei b11.py 36 Programmierkurs Zur Erläuterung: 왘 Die Bedingung 1 ergibt wahr, wenn x kleiner als y und kleiner als z ist. Dies trifft bei den gegebenen Anfangswerten zu. 왘 Die Bedingung 2 ergibt wahr, wenn y größer als x oder y größer als z ist. Die erste Bedingung trifft zu, also ist die gesamte Bedingung wahr. 왘 Die Bedingung 3 ergibt wahr, wenn z nicht größer als y ist. Dies trifft nicht zu, denn z ist größer als y, also wird die Anweisung im elseZweig ausgeführt. Die Ausgabe des Programms: >>> x ist die kleinste Zahl y ist nicht die kleinste Zahl z ist größer als y Übung B12 Das Programm zur Berechnung des monatlich zu zahlenden Steuerbetrags soll wiederum verändert werden. Die Steuertabelle sieht nun wie folgt aus: Gehalt Familienstand Steuersatz > 4.000 Euro ledig 26% > 4.000 Euro verheiratet 22% <= 4.000 Euro ledig 22% <= 4.000 Euro verheiratet 18% Tabelle B.4 Steuertabelle für die Übung Der Anwender soll neben seinem Gehalt auch seinen Familienstand nennen. Dabei soll z.B. der Familienstand »ledig« mit 1 und der Familienstand »verheiratet« mit 2 angegeben werden. Verwenden Sie logische Operatoren zur Zusammenfassung von Bedingungen innerhalb einer Zeile der Steuertabelle bzw. zur Zusammenfassung der Bedingungen aus mehreren Zeilen der Steuertabelle. Diese Aufgabe ist (wie alle Programmieraufgaben) auf mehrere Arten lösbar. Sie finden in Kapitel O, Lösungen, zwei alternative Möglichkeiten (Dateien b12.py und b13.py). Betrachten Sie diese Lösungen als Ansätze zur Programmoptimierung. Verzweigungen 37 B.3.5 Geschachtelte Verzweigung Verschachtelung Verzweigungen können auch geschachtelt werden. Dies bedeutet, dass eine Verzweigung eine weitere Unterverzweigung beinhaltet. Ein Beispiel: x = -6 if x > 0: # äußeres if print "Diese Zahl ist größer als 0" else: # äußeres else if x < 0: # inneres if print "Diese Zahl ist kleiner als 0" else: # inneres else print "Diese Zahl ist gleich 0" Listing B.12 Datei b14.py Zur Erläuterung: Äußeres if Inneres if 왘 Mit der äußeren if-Anweisung wird die geschachtelte Verzweigung eingeleitet. Falls x größer als 0 ist, werden die nachfolgenden, einfach eingerückten Anweisungen ausgeführt. 왘 Falls die Bedingung hinter dem äußeren if nicht zutrifft, so wird die innere if-Anweisung hinter dem äußeren else untersucht. 왘 Trifft sie zu, so werden die nachfolgenden, doppelt eingerückten Anweisungen ausgeführt. 왘 Trifft die innere if-Anweisung nicht zu, dann werden die dem inneren else nachfolgenden, doppelt eingerückten Anweisungen ausgeführt. Zu beachten ist besonders die doppelte Einrückung, damit die richtige Verzweigungstiefe von Python erkannt werden kann. Die Ausgabe des Programms: >>> Diese Zahl ist kleiner als 0 Übung B15 Lösen Sie das Problem aus Übung B12 mit einer geschachtelten Verzweigung. 38 Programmierkurs B.3.6 Rangfolge der bisher genutzten Operatoren In vielen Ausdrücken treten mehrere Operatoren auf. Bisher sind dies Rechenoperatoren, Vergleichsoperatoren und logische Operatoren. Damit Python weiß, in welcher Reihenfolge die einzelnen Teilschritte bearbeitet werden sollen, gibt es eine festgelegte Rangfolge der Operatoren. Die Teilschritte, bei denen Operatoren mit einem höheren Rang beteiligt sind, werden als erste ausgeführt. Nachfolgend die Rangfolge der bisher verwendeten Operatoren in Python, beginnend mit den Operatoren, die den höchsten Rang haben. Operatoren, die in der gleichen Reihe stehen, haben den gleichen Rang. Teilschritte, in denen mehrere dieser Operatoren gleichen Ranges stehen, werden von links nach rechts ausgeführt. Operator Bedeutung +- positives Vorzeichen einer Zahl, negatives Vorzeichen einer Zahl */ Multiplikation, Division +- Addition, Subtraktion < <= > >= == != kleiner, kleiner oder gleich, größer, größer oder gleich, gleich, ungleich not logische Verneinung and logisches und or logisches oder Rangfolge der Operatoren Tabelle B.5 Rangfolge der bisher genutzten Operatoren Es gibt noch eine Reihe weiterer Operatoren. Im Anhang findet sich eine vollständige Rangfolge der Operatoren in Python. B.4 Schleifen Neben der Verzweigung gibt es noch eine weitere wichtige Struktur zur Steuerung von Programmen: die Schleife. Mit Hilfe einer Schleife kann man die wiederholte Ausführung eines Programmschrittes ermöglichen. Es muss zwischen zwei Typen von Schleifen unterschieden werden, der for-Schleife und der while-Schleife. Als einfaches Unterscheidungsmerkmal sollen die folgenden Regeln dienen: Schleifen Wiederholung 39 for while 왘 Man verwendet eine for-Schleife, falls ein Programmschritt für eine regelmäßige, zu diesem Zeitpunkt bekannte Folge von Werten wiederholt ausgeführt werden soll. 왘 Man verwendet eine while-Schleife, falls sich erst durch Eingaben des Anwenders ergibt, ob und wie oft ein Programmschritt wiederholt ausgeführt werden soll. Eine for-Schleife wird auch Zähl-Schleife genannt, eine while-Schleife bedingungsgesteuerte Schleife. B.4.1 for-Schleife Die for-Schleife wird anhand des folgenden Anwendungsbeispieles erläutert: for i in 2, -6, 7.5, 22: print "Zahl:", i print "Quadrat:", i*i Listing B.13 Datei b16.py Liste Die erste Zeile muss wie folgt gelesen werden: Führe die nachfolgenden, eingerückten Anweisungen für jede Zahl aus der Liste 2, -6, 7.5 und 22 aus. Nenne diese Zahl in diesen Anweisungen i. Natürlich kann auch eine andere Variable (statt i) als so genannte Schleifen-Variable genutzt werden. Die genannten Zahlen werden zusammen mit einem kurzen Informationstext ausgegeben bzw. quadriert und ausgegeben. Das Ergebnis: >>> Zahl: 2 Quadrat: 4 Zahl: -6 Quadrat: 36 Zahl: 7.5 Quadrat: 56.25 Zahl: 22 Quadrat: 484 range() 40 Im dargestellten Fall handelt es sich um eine unregelmäßige Liste von Zahlen. Meist werden Schleifen allerdings für regelmäßige Listen von Zahlen genutzt. Dabei erweist sich der Einsatz der Funktion range() als sehr nützlich. Ein Beispiel: Programmierkurs for i in range(3,11,2): print "Zahl:", i print "Quadrat:", i*i Listing B.14 Datei b17.py Range heißt übersetzt Bereich. Innerhalb der Klammern hinter range können bis zu drei ganze Zahlen, durch Komma getrennt, eingetragen werden: 왘 Die erste ganze Zahl (hier 3) gibt den Beginn des Bereiches an, für den die nachfolgenden Anweisungen ausgeführt werden sollen. 왘 Die zweite ganze Zahl (hier 11) kennzeichnet das Ende des Bereiches. Es ist die erste Zahl, für die die Anweisungen nicht mehr ausgeführt werden. 왘 Die dritte ganze Zahl (hier 2) gibt die Schrittweite für die Schleife an. Die Zahlen, für die die Anweisungen ausgeführt werden, haben also jeweils einen Abstand von +2 zueinander. Die Funktion range() ergibt somit eine regelmäßige Liste von ganzen Zahlen (3, 5, 7, 9). Das Ergebnis: >>> Zahl: 3 Quadrat: Zahl: 5 Quadrat: Zahl: 7 Quadrat: Zahl: 9 Quadrat: 9 25 49 81 Einige allgemeine Hinweise zu for-Schleifen: 왘 Eine oder mehrere der drei Zahlen können auch negativ sein. 왘 Man sollte darauf achten, dass man sinnvolle Zahlenkombinationen angibt. Die Angabe range(3,-11,2) ist nicht sinnvoll, da man nicht von der Zahl +3 in Schritten von +2 zur Zahl -11 gelangt. Python fängt solche Schleifen ab und lässt sie nicht ausführen. 왘 Ähnlich wie bei der if-Anweisung ist darauf zu achten, dass ein : (Doppelpunkt) nach der Liste von Zahlen bzw. Bereichsangaben folgt. Schleifen 41 왘 Ebenfalls ähnlich wie bei der if-Anweisung müssen die Anweisungen, die mehrmals ausgeführt werden sollen, eingerückt geschrieben werden. Ansonsten kann Python die Zugehörigkeit zur Schleife nicht erkennen. Gleichzeitig wird das Programm dadurch übersichtlicher. Übung B18 Ermitteln Sie durch Überlegung (nicht durch einen einfachen Aufruf) die Ausgabe des folgenden Programms. print "Schleife 1" for i in 2, 3, 6.5, -7: print i print "Schleife 2" for i in range(3,11,3): print i print "Schleife 3" for i in range(-3,14,4): print i print "Schleife 4" for i in range(3,-11,-3): print i Listing B.15 Datei b18.py Übung B19 Schreiben Sie ein Programm, das die folgende Ausgabe erzeugt. Beachten Sie, dass für dieses Programm keine Eingabe durch den Anwender notwendig ist. Es handelt sich um eine regelmäßige Liste von Zahlen, für die der DM-Betrag durch Umrechnung mit dem Faktor 1.95583 ermittelt werden soll. >>> 10 Euro 20 Euro 30 Euro 40 Euro 50 Euro 60 Euro 70 Euro 42 = = = = = = = 19.5583 DM 39.1166 DM 58.6749 DM 78.2332 DM 97.7915 DM 117.3498 DM 136.9081 DM Programmierkurs 80 Euro = 156.4664 DM 90 Euro = 176.0247 DM 100 Euro = 195.583 DM B.4.2 Exkurs: Formatierte Ausgabe Schleifen unterstützen u.a. die Durchführung von Berechnungen für eine Liste von Werten. Bei der Ausgabe steht man häufig vor dem Problem, diese Werte regelmäßig, in Tabellenform, anzuordnen, dabei hilft die formatierte Ausgabe. Formatierung Die Anweisung print bietet die Möglichkeit: 왘 die Mindest-Ausgabebreite der Zahlen zu bestimmen 왘 die Anzahl der Nachkommastellen zu bestimmen Das nachfolgende Programm soll dies an einigen Beispielen verdeutlichen: print "ganze Zahlen:" for zahl in range(2,13,2): quadrat = zahl * zahl print "%3i %4i" % (zahl, quadrat) print print "Zahlen mit Nachkommastellen:" for zahl in range(2,13,2): zehntel = zahl/10.0 quadrat = zehntel * zehntel print "%8.3f %8.3f" % (zehntel, quadrat) Listing B.16 Datei b20.py Zur Erläuterung: Innerhalb des ersten Blockes wird eine Liste von ganzen Zahlen quadriert und ausgegeben. Die Zeile, in der die Zahlen ausgegeben werden, ist wie folgt zu lesen: 왘 Es werden zwei ganze Zahlen ausgegeben, die erste mit der Mindest- breite 3, die zweite mit der Mindestbreite 4. Dabei steht %i als Platzhalter für eine ganze Zahl, dazwischen steht die gewünschte Breite. Hinter dem einzelnen Prozentzeichen stehen die Variablen bzw. Werte, die ausgegeben werden sollen, in Klammern. Schleifen 43 Innerhalb des zweiten Blockes wird eine Liste von Zahlen mit Nachkommastellen quadriert und ausgegeben. Die Zeile, in der die Zahlen ausgegeben werden, ist wie folgt zu lesen: 왘 Es werden zwei Zahlen mit Nachkommastellen ausgegeben, beide mit der Mindestbreite 8, davon 3 Stellen hinter dem Komma. Bei der Gesamtstellenzahl ist der Dezimalpunkt mitzurechnen, also verbleiben in diesem Fall noch 4 Stellen vor dem Komma. Hinter dem einzelnen Prozentzeichen stehen wiederum die Variablen bzw. Werte, die ausgegeben werden sollen, in Klammern. Falls man bei einer Zahl mit Nachkommastellen die Formatierung %.3f angibt, so wird nur die Anzahl der Stellen hinter dem Komma festgelegt, nicht die Mindestbreite. Die Ausgabe des Programms: >>> ganze Zahlen: 2 4 4 16 6 36 8 64 10 100 12 144 Zahlen mit 0.200 0.400 0.600 0.800 1.000 1.200 Nachkommastellen: 0.040 0.160 0.360 0.640 1.000 1.440 Übung B21 Schreiben Sie das Programm aus der vorherigen Übung so um, dass die nachfolgende Ausgabe (mit Überschrift) erzeugt wird. Die Beträge für Euro und DM sollen jeweils mit zwei Nachkommastellen angezeigt und am Dezimalpunkt ausgerichtet werden. >>> Euro 10.00 44 DM 19.56 Programmierkurs 20.00 30.00 40.00 50.00 60.00 70.00 80.00 90.00 100.00 39.12 58.67 78.23 97.79 117.35 136.91 156.47 176.02 195.58 B.4.3 while-Schleife Die while-Schleife wird anhand der folgenden Problemstellung erläutert: Bedingte Schleife Mit Hilfe des Programms sollen die Zahlen, die der Anwender eingibt, permanent addiert und ausgegeben werden. Solange die Summe der Zahlen kleiner als 50 ist, wird der Vorgang wiederholt. Trifft dies nicht mehr zu, so wird das Programm beendet. summe = 0 while summe < 50: print "Bitte eine Zahl eingeben:" eingabe = input() summe = summe + eingabe print "Zwischensumme:", summe print "Ende" Listing B.17 Datei b22.py Zur Erläuterung: 왘 Zunächst wird die Variable für die Summe der Zahlen auf 0 gesetzt. 왘 Die while-Anweisung leitet die Schleife ein. Die wörtliche Übersetzung der Zeile lautet: »solange die Summe kleiner als 50 ist«. Dies bezieht sich auf die folgenden, eingerückten Anweisungen. Hinter dem Wort while steht (wie bei einer if-Anweisung) eine Bedingung, die mit Hilfe von Vergleichsoperatoren erstellt wird. Auch hier darf der : (Doppelpunkt) am Ende der Zeile (wie bei if und for) nicht vergessen werden. Einrücken 왘 Der Anwender wird aufgefordert, eine Zahl einzugeben. 왘 Die eingegebene Zahl wird in der Variablen eingabe gespeichert. Schleifen 45 왘 Sie wird zur bisherigen Summe hinzuaddiert. Die neue Summe errech- net sich also aus der alten Summe plus der eingegebenen Zahl. 왘 Die neue Summe wird ausgegeben. 왘 Die Anweisung zur Ausgabe des Textes Ende wird erst erreicht, wenn die Summe den Wert 50 erreicht oder überschritten hat. Eine mögliche Ausgabe des Programms: >>> Bitte eine Zahl eingeben: 12 Zwischensumme: 12 Bitte eine Zahl eingeben: 6 Zwischensumme: 18 Bitte eine Zahl eingeben: 24 Zwischensumme: 42 Bitte eine Zahl eingeben: 14 Zwischensumme: 56 Ende Übung B23 Schreiben Sie ein Programm (Datei b23.py), das den Anwender wiederholt dazu auffordert, einen Euro-Betrag einzugeben. Der eingegebene Betrag soll anschließend in DM umgerechnet und ausgegeben werden. Das Programm soll beendet werden, falls der Anwender den Betrag 0 eingibt. Bei einer while-Schleife wird immer angegeben, unter welcher Bedingung wiederholt werden soll und nicht, unter welcher Bedingung beendet werden soll. Daher ist für dieses Programm die umgekehrte Bedingung zu formulieren: »solange die Eingabe ungleich 0 ist«. B.5 Fehler 46 Fehler und Ausnahmen Falls der Anwender nach einer Eingabeaufforderung etwas Falsches eingibt, z.B. keine Zahl, sondern einen Text, wird das Programm mit einer Fehlermeldung beendet. Bisher sollte vereinfacht davon ausgegangen Programmierkurs werden, dass der Anwender richtige Eingaben vornimmt. Die Vermeidung bzw. das Abfangen von Fehlern wird in diesem Abschnitt beschrieben. B.5.1 Basisprogramm mit Fehlern Durch das Abfangen von falschen Eingaben wird die Benutzung eines Programms für den Anwender deutlich komfortabler. Nachfolgend soll ein kleines Programm, in dem eine Zahl eingegeben werden soll, Schritt für Schritt dahingehend verbessert werden: print "Bitte geben Sie eine Zahl ein" eingabe = input() print "Sie haben die Zahl", eingabe, "richtig eingegeben" print "Ende des Programms" Listing B.18 Datei b24.py (Version 1) Falls der Anwender eine Zahl (z.B. 45.2) eingibt, so läuft das Programm fehlerfrei bis zum Ende und erzeugt die folgende Ausgabe: >>> Bitte geben Sie eine Zahl ein 45.2 Sie haben die Zahl 45.2 richtig eingegeben Ende des Programms Falls der Anwender dagegen z.B. 45.a2 eingibt, so bricht das Programm vorzeitig ab und erzeugt die folgende Ausgabe: >>> Bitte geben Sie eine Zahl ein 45.a2 Traceback (most recent call last): File "C:\Python22\b24.py", line 4, in ? eingabe = input() File "<string>", line 1 45.a2 ^ SyntaxError: unexpected EOF while parsing Diese Meldungen sind ein Hinweis darauf, an welcher Stelle im Programm der Fehler bemerkt wurde (Datei b24.py, Zeile 4). Außerdem wird die Art des Fehlers mitgeteilt (SyntaxError). Fehler und Ausnahmen 47 Falls der Anwender z.B. ab45 eingibt, so bricht das Programm ebenfalls vorzeitig ab und erzeugt die folgende Ausgabe: >>> Bitte geben Sie eine Zahl ein ab45 Traceback (most recent call last): File "C:\Python22\b24.py", line 4, in ? eingabe = input() File "<string>", line 0, in ? NameError: name 'ab45' is not defined In diesem Fall wurde der Fehler an der gleichen Stelle bemerkt (Datei b24.py, Zeile 4). Es handelt sich allerdings um eine andere Fehlerart (NameError). B.5.2 Programmabbruch vermeiden Der Fehler soll zunächst einmal abgefangen werden, damit ein Abbruch des Programms vermieden werden kann. Dazu ist es wichtig, die Stelle, an der der Fehler auftrat, zu kennen. An dieser Stelle muss das Programm verbessert werden. In beiden Fehlerfällen handelte es sich um die Zeile, in der der Anwender zur Eingabe aufgefordert wird. try-except Die Art des Fehlers ist zunächst nicht so wichtig, denn das Programm soll zukünftig an dieser Stelle alle Arten von Fehlern abfangen, die Python von selber erkennen kann. Dies wird in einem ersten Schritt durch folgende Verbesserung erreicht: print "Bitte geben Sie eine Zahl ein" try: eingabe = input() print "Sie haben die Zahl", eingabe, \ "richtig eingegeben" except: print "Falsche Eingabe" print "Ende des Programms" Listing B.19 Datei b24.py (Version 2) 48 Programmierkurs Zur Erläuterung: 왘 Die Anweisung try leitet eine Ausnahmebehandlung ein. Ähnlich wie bei der if-Anweisung gibt es verschiedene Zweige, die das Programm durchlaufen kann. Es wird versucht (engl.: try) die Anweisungen, die eingerückt hinter try stehen, durchzuführen. 왘 Falls die Eingabe erfolgreich ist, so wird der except-Zweig nicht ausgeführt, ähnlich wie bei dem else-Zweig der if-Anweisung. 왘 Falls die Eingabe dagegen nicht erfolgreich ist und es sich um einen Fehler handelt, der Python bekannt ist, so wird der Fehler bzw. die Ausnahme (engl.: exception) mit der Anweisung except abgefangen. Es werden dann alle eingerückten Anweisungen in diesem Zweig durchgeführt, die Fehlermeldung erscheint. 왘 Anschließend läuft das Programm ohne Abbruch zu Ende, da der Feh- ler zwar auftrat, aber abgefangen wurde. 왘 Nur die »kritische« Zeile wurde in die Ausnahmebehandlung einge- bettet. Der Programmierer muss sich also Gedanken darüber machen, welche Stellen seines Programms fehlerträchtig sind. Eine Eingabeaufforderung ist solch eine typische Stelle. Andere Fehlermöglichkeiten sind z.B. die Bearbeitung einer Datei (die eventuell nicht existiert) oder die Ausgabe auf einen Drucker (der eventuell nicht eingeschaltet ist). 왘 Man hat die Möglichkeit, unterschiedliche Fehlerarten in spezifischen except-Zweigen abzufangen. Vorteil: Die Fehlermeldung kann präzise formuliert werden. Nachteil: Es könnte ein Fehler auftreten, zu dem es keinen except-Zweig gibt. Auf diese Möglichkeit wird in Kapitel E eingegangen. Falls der Anwender in dem angegebenen Programm eine richtige Zahl eingibt, so erscheint die bereits bekannte Bestätigung: >>> Bitte geben Sie eine Zahl ein 45.2 Sie haben die Zahl 45.2 richtig eingegeben Ende des Programms Falls der Anwender eine falsche Eingabe macht, z.B. ab45, so erscheint die nachfolgende Meldung. Das Programm bricht aber nicht ab, sondern läuft bis zum Ende. Fehler und Ausnahmen 49 >>> Bitte geben Sie eine Zahl ein 45.a2 Falsche Eingabe Ende des Programms B.5.3 Fehler abfangen Fehler abfangen In einem zweiten Schritt soll dafür gesorgt werden, dass der Anwender nach einer falschen Eingabe erneut eingeben kann. Der gesamte Eingabevorgang einschließlich der Ausnahmebehandlung wird so lange wiederholt, bis er erfolgreich war. Dazu das folgende Programm: fehler = 1 while fehler == 1: try: print "Bitte geben Sie eine Zahl ein" eingabe = input() fehler = 0 except: print "Falsche Eingabe, bitte wiederholen" print "Sie haben die Zahl", eingabe, "richtig eingegeben" print "Ende des Programms" Listing B.20 Datei b25.py Zur Erläuterung: 왘 Es wird zunächst die Variable fehler auf den Wert 1 gesetzt. Diese Variable ist notwendig, um die Eingabe gegebenenfalls wiederholen zu können. 왘 Mit der while-Anweisung wird eine Schleife formuliert, in der der Eingabevorgang einschließlich der Ausnahmebehandlung eingebettet ist. Die Schleife wird wiederholt, solange die Variable fehler den Wert 1 hat. 왘 Falls die Eingabe erfolgreich ist, so wird fehler auf 0 gesetzt. Dies führt dazu, dass die Schleife beendet wird und das Programm regulär fortfahren kann. 왘 Falls die Eingabe nicht erfolgreich ist, so hat fehler nach wie vor den Wert 1. Dies führt dazu, dass der Eingabevorgang wiederholt wird. 50 Programmierkurs 왘 Die Eingabeaufforderung ist hier innerhalb des try-Zweiges untergebracht worden, da sie bei Auftreten eines Fehlers wiederum ausgegeben werden sollte. 왘 Zu beachten ist die doppelte Einrückung, ähnlich wie bei einer geschachtelten Verzweigung. Nachfolgend eine mögliche Eingabe, zunächst zweimal mit Fehlern, anschließend richtig: >>> Bitte geben Sie eine Zahl ein 45.a2 Falsche Eingabe, bitte wiederholen Bitte geben Sie eine Zahl ein ab45 Falsche Eingabe, bitte wiederholen Bitte geben Sie eine Zahl ein 45.2 Sie haben die Zahl 45.2 richtig eingegeben Ende des Programms Übung B26 Verbessern Sie das Programm zur Eingabe und Umrechnung von beliebigen Euro-Beträgen in französische Franc aus Übung B04. Eingabefehler des Anwenders sollen abgefangen werden. Das Programm soll den Anwender so lange zur Eingabe auffordern, bis sie erfolgreich war (Datei b26.py). Übung B27 Verbessern Sie das Programm zur Berechnung des monatlich zu zahlenden Steuerbetrags aus Übung B12. Eingabefehler des Anwenders (sowohl bei Gehalt als auch bei Familienstand) sollen abgefangen werden. Das Programm soll den Anwender so lange zur Eingabe auffordern, bis sie erfolgreich war (Datei b27.py). Es geht hier um das Abfangen vollständig falscher Eingaben (Zeichen statt Zahlen). Falls der Anwender beim Familienstand weder eine 1 noch eine 2 eingibt, soll dies noch nicht behandelt werden. Fehler und Ausnahmen 51 B.5.4 Fehler erzeugen Fehler erzeugen »Wieso sollte man Fehler erzeugen?«, wird man sich angesichts dieser Überschrift fragen. Es gibt, besonders im Zusammenhang mit der Eingabe von Daten durch einen Anwender, sinnvolle Gründe dafür. Im folgenden Beispiel wird der Anwender wie in Programm b25.py dazu aufgefordert, Zahlen einzugeben. Diese Zahlen sollen allerdings weder größer als 1000 noch kleiner als 0 sein. Diese Einschränkung kann mit Hilfe der Anweisung raise bearbeitet werden, wie im nachfolgenden Programm dargestellt: fehler = 1 while fehler == 1: try: print "Bitte geben Sie eine Zahl", \ "zwischen 0 und 1000 ein" eingabe = input() # Eingabe zu gross oder zu klein if eingabe > 1000 or eingabe < 0: raise fehler = 0 except: print "Falsche Eingabe, bitte wiederholen" print "Sie haben die Zahl", eingabe, "richtig eingegeben" print "Ende des Programms" Listing B.21 Datei b28.py Falls die eingegebene Zahl größer als 1000 oder kleiner als 0 ist, so wird die Anweisung raise ausgeführt. Dadurch wird ein Fehler erzeugt, als ob der Anwender Zeichen statt Zahlen eingegeben hätte. Das Programm verzweigt unmittelbar zur Anweisung except und führt die dort angegebenen Anweisungen aus. In diesem Fall handelt es sich zwar nur um einen logischen Eingabefehler, aber er wird genauso behandelt. Der Anwender wird somit veranlasst, Zahlen nur innerhalb des gewünschten Bereiches einzugeben. Nachfolgend eine mögliche Eingabe, zunächst zweimal mit Fehlern, anschließend richtig: 52 Programmierkurs >>> Bitte geben Sie eine Zahl zwischen 0 und 1000 ein 1100 Falsche Eingabe, bitte wiederholen Bitte geben Sie eine Zahl zwischen 0 und 1000 ein -5 Falsche Eingabe, bitte wiederholen Bitte geben Sie eine Zahl zwischen 0 und 1000 ein 23 Sie haben die Zahl 23 richtig eingegeben Ende des Programms Mit Hilfe der Anweisungen try, raise und except lassen sich also auch logische Eingabefehler des Anwenders abfangen und behandeln. Nachteil der vorgeführten Methode: Alle Fehler werden gleich behandelt, die Informationen für den Anwender im Fehlerfall sind noch nicht sehr genau. Dies soll in einem späteren Abschnitt verbessert werden. Übung B29 Verbessern Sie das Programm zur Berechnung des monatlich zu zahlenden Steuerbetrags aus Übung B12 bzw. B27 weiter. Zusätzlich zum Abfangen der Eingabefehler des Anwenders soll darauf geachtet werden: 왘 dass als Gehälter nur positive Zahlen eingegeben werden 왘 dass als Familienstand nur eine 1 oder eine 2 eingegeben wird Das Programm soll den Anwender so lange zur Eingabe auffordern, bis sie erfolgreich war (Datei b29.py). B.6 Funktionen und Module Theoretisch könnte ein Programmierer auf die Modularisierung, d.h. die Zerlegung seines Programms in selbst geschriebene Funktionen, verzichten. Besonders bei der Entwicklung von größeren Programmen bieten Funktionen allerdings unübersehbare Vorteile: Modularisierung 왘 Umfangreiche Programme können in übersichtliche Teile zerlegt wer- den. 왘 Pflege und Wartung von Programmen wird erleichtert. 왘 Der eigene Programmcode wird von einem anderen Programmierer oder vom Programmierer selbst (zu einem späteren Zeitpunkt) leichter verstanden. Funktionen und Module 53 왘 Programmteile, die mehrmals benötigt werden, müssen nur einmal definiert werden. 왘 Nützliche Programmteile können in mehreren Programmen verwen- det werden. Vordefinierte Funktionen Neben den selbst geschriebenen Funktionen gibt es bei Python, wie bei jeder anderen Programmiersprache auch, eine große Menge an nützlichen, vordefinierten Funktionen, die dem Entwickler bereits viel Arbeit abnehmen können. Diese Funktionen sind entweder fest eingebaut oder über die Einbindung spezieller Module verfügbar. Eine der fest eingebauten Funktionen wurde bereits eingesetzt: input() 왘 Jede Funktion hat eine spezielle Aufgabe. Im Fall der Funktion input() ist dies: das Programm anzuhalten und eine Eingabe entgegenzunehmen. 왘 Wie viele, aber nicht alle Funktionen, hat input() einen so genannten Rückgabewert, d.h., sie liefert ein Ergebnis an die Stelle des Programms zurück, von der sie aufgerufen wurde: den eingegebenen Zahlenwert. Nachfolgend wird die Entwicklung selbst geschriebener Funktionen erläutert. B.6.1 Einfache Funktionen Einfache Funktionen führen bei ihrem Aufruf immer genau das Gleiche aus. Im folgenden Beispiel führt der Aufruf der Funktion stern() jedes Mal dazu, dass eine Reihe von 20 Sternen als optische Trennlinie auf dem Bildschirm ausgegeben wird: # Definition der Funktion Definition def stern(): for i in range(1,21,1): print "*", print # Hauptprogramm x = 12 y = 5 stern() # 1. Aufruf print "x = %i, y = %i" % (x,y) stern() # 2. Aufruf 54 Programmierkurs print "x + y =", x + y stern() print "x - y =", x - y stern() print "x * y =", x * y stern() # 3. Aufruf # 4. Aufruf # 5. Aufruf Listing B.22 Datei b30.py Zur Erläuterung: Im oberen Teil des Programms wird die Funktion stern() definiert: Funktionsdefinition 왘 Nach der Anweisung def folgt der Name der Funktion (hier stern), anschließend runde Klammern und der bereits bekannte Doppelpunkt. Innerhalb der Klammern könnten Werte an die Funktion übergeben werden (dazu später). 왘 Die nachfolgenden, eingerückten Anweisungen werden jedes Mal durchgeführt, wenn die Funktion aufgerufen, d.h. benutzt wird. 왘 Es wird eine for-Schleife 20-mal durchgeführt. Innerhalb der forSchleife wird jedes Mal ein Stern auf den Bildschirm geschrieben. Das anschließende Komma sorgt nur dafür, dass nach der Ausgabe nicht in die nächste Zeile gewechselt wird. 왘 Die einzelne print-Anweisung am Ende der Funktionsdefinition sorgt für einen Zeilenwechsel nach den 20 Sternen. Eine Funktion wird zunächst nur definiert und nicht durchgeführt. Sie steht sozusagen zum späteren Gebrauch bereit. Im unteren Teil beginnt das eigentliche Programm: 왘 Es werden verschiedene Rechenoperationen mit zwei Variablen durchgeführt. 왘 Jede Ausgabezeile wird mit Hilfe der Funktion stern() in eine Reihe von Sternen eingebettet. 왘 Insgesamt findet der Aufruf der Funktion stern() 5-mal statt. 왘 Das Programm fährt nach Bearbeitung der Funktion Funktionsaufruf stern() jedes Mal mit der Anweisung fort, die dem Aufruf der Funktion folgt. Eine Funktion wird aufgerufen, indem ihr Name, gefolgt von den runden Klammern, notiert wird. Falls Informationen an die Funktion geliefert werden sollen, so werden diese innerhalb der runden Klammern angegeben (dazu später). Funktionen und Module 55 Der Name einer Funktion kann frei gewählt werden. Es gelten die gleichen Regeln wie bei den Namen von Variablen: 왘 Er kann aus den Buchstaben a bis z, A bis Z, Ziffern oder dem Zeichen _ (=Unterstrich) bestehen. 왘 Er darf nicht mit einer Ziffer beginnen. 왘 Er darf keinem reservierten Wort der Programmiersprache Python entsprechen (eine Liste der reservierten Worte findet sich im Anhang). Das Ergebnis des Programms: >>> * * x = * * x + * * x * * x * * * * * 12, * * y = * * y = * * y = * * * * y = * * 17 * * 7 * * 60 * * * * * * * * * * * * * * * * 5 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Übung B31 Erstellen Sie ein Programm (Datei b31.py), mit dessen Hilfe eine beliebige eingegebene Zahl quadriert wird (zur Vereinfachung ohne das Abfangen von Fehleingaben). Oberhalb und unterhalb des Programms soll zur optischen Verdeutlichung der Name des Programms erscheinen, wie in der nachfolgenden Ausgabe dargestellt. Schreiben Sie zu diesem Zweck eine Funktion titel(), die insgesamt zweimal aufgerufen werden soll. >>> ****************************** * Programm Quadrat * ****************************** Bitte geben Sie eine Zahl ein: 3.6 Das Quadrat von 3.6 ist 12.96 ****************************** * Programm Quadrat * ****************************** 56 Programmierkurs B.6.2 Funktionen mit einem Parameter Bei einem Aufruf können auch Informationen an Funktionen übermittelt werden, so genannte Parameter. Dies führt im Allgemeinen dazu, dass diese Informationen innerhalb der Funktion ausgewertet werden und bei jedem Aufruf zu unterschiedlichen Ergebnissen führen. Parameter Im folgenden Programm wird eine Funktion definiert, an die ein Betrag in Euro übermittelt wird. Innerhalb der Funktion wird dieser Betrag in DM umgerechnet und ausgegeben. Die Funktion wird mehrmals aufgerufen, jedes Mal mit einem anderen Euro-Betrag. Zur Vereinfachung wurde auf das Abfangen von Eingabefehlern verzichtet. # Definition der Funktion def dmaus(eurobetrag): ed = 1.95583 dmbetrag = ed * eurobetrag print "%.2f Euro ergeben %.2f DM" % \ (eurobetrag, dmbetrag) # Hauptprogramm print "Umrechnung von Euro in DM:" dmaus(24) # 1. Aufruf dmaus(12.5) # 2. Aufruf dmaus(3*5.5) # 3. Aufruf print "Bitte einen Betrag in Euro:" eingabe = input() dmaus(eingabe) # 4. Aufruf Listing B.23 Datei b32.py Zur Erläuterung: Die Definition der Funktion dmaus() beinhaltet in den Klammern eine Variable. Dies bedeutet, dass beim Aufruf der Funktion ein Wert übermittelt und dieser Variablen zugewiesen wird. Im vorliegenden Programm sind dies: 1. eine ganze Zahl, eurobetrag wird 24 zugewiesen 2. eine Zahl mit Nachkommastellen, eurobetrag wird 12.5 zugewiesen 3. das Ergebnis einer Berechnung, eurobetrag wird das Ergebnis von 3 × 5.5 zugewiesen 4. eine Variable, eurobetrag wird der Wert der Variablen eingabe zugewiesen Funktionen und Module 57 Die Funktion erwartet genau einen Wert, da sie nur sinnvoll arbeiten kann, wenn ihr ein Wert übermittelt wird. Sie darf also nicht ohne einen Wert oder mit mehr als einem Wert aufgerufen werden. Eine mögliche Ausgabe des Programms: >>> Umrechnung von Euro in DM: 24.00 Euro ergeben 46.94 DM 12.50 Euro ergeben 24.45 DM 16.50 Euro ergeben 32.27 DM Bitte einen Betrag in Euro: 9.95 9.95 Euro ergeben 19.46 DM Übung B33 Es soll für verschiedene Bruttogehälter der Steuerbetrag berechnet werden (Datei b33.py). Falls das Gehalt über 2.500 Euro liegt, so sind 22% Steuer zu zahlen, ansonsten 18% Steuer (wie Übung B08). Die Berechnung und die Ausgabe des Steuerbetrags sollen innerhalb einer Funktion mit dem Namen steuer() stattfinden. Die Funktion soll für die folgenden Gehälter aufgerufen werden: 1.800 Euro, 2.200 Euro, 2.500 Euro, 2.900 Euro. B.6.3 Funktionen mit mehreren Parametern Mehrere Parameter Eine Funktion kann noch vielseitiger werden, falls man ihr mehrere Parameter übermittelt. Dabei ist auf die übereinstimmende Anzahl und Reihenfolge der Parameter zu achten. Im folgenden Beispiel wird eine Funktion mw() definiert. Diese Funktion erwartet drei Zahlen als Parameter und berechnet den Mittelwert dieser drei Zahlen. Falls mehrere Parameter verwendet werden, so werden diese sowohl bei Definition als auch bei Aufruf durch Kommata voneinander getrennt. # Definition der Funktion def mw(z1, z2, z3): summe = z1 + z2 + z3 mittelwert = summe / 3.0 print "Der Mittelwert von", print z1, ",", z2, "und", z3, "ist", mittelwert 58 Programmierkurs # Hauptprogramm mw(3,5,10) mw(-2,55,12) mw(2.4,2.6,5) # 1. Aufruf # 2. Aufruf # 3. Aufruf Listing B.24 Datei b34.py Zur Erläuterung: Es werden genau drei Parameter erwartet, bei jedem der drei Aufrufe werden auch genau drei Werte übermittelt, z.B. wird beim 1. Aufruf: 왘 die Zahl 3 der Variablen z1 zugewiesen 왘 die Zahl 5 der Variablen z2 zugewiesen 왘 die Zahl 10 der Variablen z3 zugewiesen Die Ausgabe des Programms: >>> Der Mittelwert von 3 , 5 und 10 ist 6.0 Der Mittelwert von -2 , 55 und 12 ist 21.6666666667 Der Mittelwert von 2.4 , 2.6 und 5 ist 3.33333333333 Übung B35 Das Programm zur Berechnung des monatlich zu zahlenden Steuerbetrags soll wiederum verändert werden. Die Steuertabelle sieht wie folgt aus: Gehalt Familienstand Steuersatz > 4.000Euro ledig 26% > 4.000 Euro verheiratet 22% <= 4.000 Euro ledig 22% <= 4.000 Euro verheiratet 18% Tabelle B.6 Steuertabelle für diese Übung Es soll eine Funktion steuer() geschrieben werden, die zwei Parameter erwartet: Gehalt und Familienstand. Dabei soll z.B. der Familienstand »ledig« mit 1 und der Familienstand »verheiratet« mit 2 angegeben werden. Die Funktion soll für die folgenden Kombinationen aufgerufen werden: Funktionen und Module 59 왘 Gehalt: 2.800 Euro, Familienstand ledig 왘 Gehalt: 2.900 Euro, Familienstand verheiratet 왘 Gehalt: 4.000 Euro, Familienstand ledig 왘 Gehalt: 4.500 Euro, Familienstand verheiratet 왘 Gehalt: 5.200 Euro, Familienstand ledig B.6.4 Funktionen mit Rückgabewert Funktionen werden häufig nur zur Berechnung, aber nicht zur Ausgabe der berechneten Ergebnisse eingesetzt. Die Ausgabe bzw. weitere Verwertung der Rechenergebnisse soll dem Hauptprogramm bzw. dem aufrufenden Programm überlassen werden. Zu diesem Zweck können Funktionen ihre Ergebnisse als so genannte Rückgabewerte zurückliefern. Rückgabewert Im Unterschied zu vielen anderen Programmiersprachen können Funktionen in Python mehr als einen Rückgabewert liefern. In diesem Abschnitt sollen allerdings zunächst nur Funktionen betrachtet werden, die genau einen Rückgabewert zur Verfügung stellen. Im folgenden Beispiel wird eine Funktion, die einen Rückgabewert liefert, auf zwei verschiedene Arten im Hauptprogramm eingesetzt und aufgerufen. # Definition der Funktion def dm(eurobetrag): ed = 1.95583 dm = ed * eurobetrag return dm # 1. Aufruf euro = 24 erg = dm(euro) print "%.2f Euro ergeben %.2f DM" % (24, erg) # 2. Aufruf print "12.5 Euro ergeben", dm(12.5), "DM" Listing B.25 Datei b36.py Zur Erläuterung: 왘 Bei der Definition der Funktion wird der DM-Betrag zunächst berech- net. Anschließend wird er mit Hilfe der Anweisung return an die auf- 60 Programmierkurs rufende Stelle zurückgeliefert. Die Anweisung return beendet außerdem unmittelbar den Ablauf der Funktion. 왘 Beim ersten Aufruf wird der Rückgabewert in der Variablen erg zwischengespeichert. Er kann im weiteren Verlauf des Programms an beliebiger Stelle verwendet werden. Im vorliegenden Fall wird er kommentiert und formatiert ausgegeben. 왘 Beim zweiten Aufruf wird der Rückgabewert unmittelbar ausgegeben. Die Ausgabe des Programms: >>> 24.00 Euro ergeben 46.94 DM 12.5 Euro ergeben 24.447875 DM Übung B37 Das Programm aus Übung B35 soll umgeschrieben werden. Innerhalb der Funktion steuer() soll der Steuerbetrag nur berechnet und an das Hauptprogramm zurückgeliefert werden. Die Ausgabe des ermittelten Wertes soll im Hauptprogramm stattfinden. B.6.5 Module In den bisher genannten Beispielen wurden Funktion und eigentliches Hauptprogramm in der gleichen Datei definiert. Falls es sich um spezifische Funktionen handelt, die für ein bestimmtes Programm zugeschnitten wurden, ist dies auch sinnvoll. Nach einiger Zeit wird man aber feststellen, dass einige nützliche Funktionen immer wieder und von verschiedenen Programmen aus benötigt werden. Diese Funktionen sollten in eigenen Modulen gespeichert werden. Die Erstellung und Nutzung von Modulen ist in Python sehr einfach und soll am folgenden Beispiel erläutert werden. Externe Module Die gewünschte Funktion wird einfach in einer eigenen Datei gespeichert. Der Name der Datei ist gleichzeitig der Name des Moduls. An der Funktion selber ändert sich nichts: # Definition der Funktion def dm(eurobetrag): ed = 1.95583 dm = ed * eurobetrag return dm Listing B.26 Datei b38.py Funktionen und Module 61 Anschließend kann die Funktion in jedem Programm genutzt werden. Voraussetzung: Sie wird aus dem betreffenden Modul importiert. # Import aus dem Modul from b38 import dm # 1. Aufruf euro = 24 erg = dm(euro) print "%.2f Euro ergeben %.2f DM" % (24, erg) # 2. Aufruf print "12.5 Euro ergeben", dm(12.5), "DM" Listing B.27 Datei b39.py (Version 1) Zur Erläuterung: Die erste Anweisung (from b38 import dm) kann wie folgt gelesen werden: Importiere die Funktion dm() aus dem Modul b38 (also aus der Datei b38.py). Falls im Modul b38 mehrere Funktionen definiert wurden, die innerhalb eines Programms eingesetzt werden sollen, so kann man alternativ eine der beiden folgenden Anweisungen einsetzen: Import 왘 from b38 import * 왘 import b38 Dadurch werden jeweils alle Funktionen aus dem Modul importiert. Die zweite Version setzt allerdings voraus, dass bei den Funktionsaufrufen im importierenden Programm genau angegeben wird, aus welchem Modul sie stammen, wie in der nachfolgenden Version des Programms b39. # Import aus dem Modul import b38 # 1. Aufruf euro = 24 erg = b38.dm(euro) print "%.2f Euro ergeben %.2f DM" % (24, erg) 62 Programmierkurs # 2. Aufruf print "12.5 Euro ergeben", b38.dm(12.5), "DM" Listing B.28 Datei b39.py (Version 2) Zur Erläuterung: Die Funktion wird nicht nur mit ihrem Namen aufgerufen, sondern in der Schreibweise Modulname.Funktionsname. Dies hat auch den Vorteil der Eindeutigkeit, falls ein Funktionsname in mehreren Modulen verwendet wurde. Übung B40/B41 Das Programm aus Übung B37 soll umgeschrieben werden. Die Funktion steuer() soll in das Modul b40 ausgelagert werden. Das Hauptprogramm in Datei b41.py soll diese Funktion aus dem Modul importieren und nutzen. B.7 Programmierprojekt Rechnungserstellung In den bisherigen Abschnitten wurden alle wichtigen Elemente der klassischen Programmierung vorgestellt. In diesem Abschnitt wird ein Programm erläutert, bei dem diese Elemente im Gesamtzusammenhang eingesetzt werden. B.7.1 Aufgabenstellung Es handelt sich um eine Aufgabe aus dem Bereich Warenwirtschaft. Es soll eine Rechnung, bestehend aus einzelnen Rechnungsposten erstellt werden. Dem Programmierer ist die nachfolgende Preisliste bekannt: Artikelnummer Netto-Einzelpreis in Euro 17 2,20 22 24,50 38 15,00 47 9,95 125 12,95 Tabelle B.7 Preisliste für Programmierprojekt Programmierprojekt Rechnungserstellung 63 Der Anwender, z.B. eine Verkaufskraft an der Kasse, gibt die einzelnen Posten der Rechnung ein. Dies sind die Artikelnummer, gefolgt von der Anzahl der gekauften Artikel mit dieser Artikelnummer. Dabei sollte darauf geachtet werden, dass nur eine der vorhandenen Artikelnummern eingegeben werden kann. Die Eingabe soll beendet werden, falls der Anwender eine 0 als Artikelnummer eingibt. Allgemein sollen Eingabefehler bzw. nicht sinnvolle Eingaben abgefangen werden und zu einer Wiederholung der jeweiligen Eingabe führen. Über Artikelnummer, Menge und Einzelpreis soll im Programm der Wert eines einzelnen Rechnungspostens ermittelt werden. Die Posten werden addiert und führen zum Netto-Gesamtwert der Rechnung. Daraus wird die Umsatzsteuer und der Bruttowert errechnet und ausgegeben. Dieser wird zusätzlich noch (zur Information) in DM ausgegeben. Das Programm soll mit Hilfe von Funktionen in übersichtliche Teile zerlegt werden. Die verschiedenen Eingabeüberprüfungen auf sinnvolle Inhalte sollen in ein Modul ausgelagert werden. B.7.2 Ablaufplan des Programms Ein erster, grober Ablaufplan des Programms sieht wie folgt aus: 왘 Eingabe einer ersten Artikelnummer 왘 Schleife: Solange die eingegebene Artikelnummer ungleich 0 ist, sol- len folgende Schritte durchgeführt werden: 왘 Zur eingegebenen Artikelnummer wird der Einzelpreis ermittelt 왘 Eingabe der gekauften Menge 왘 Es wird der Wert eines einzelnen Rechnungspostens ermittelt 왘 Dieser Wert wird zum jeweiligen Netto-Gesamtwert hinzuaddiert 왘 Eingabe der nächsten Artikelnummer 왘 Berechnung der Gesamtrechnungssumme brutto 왘 Ausgabe aller Gesamtrechnungssummen B.7.3 Ausgelagerte Funktionen In das Modul b43 werden insgesamt drei Funktionen ausgelagert, die auch von anderen Programmen genutzt werden können: 왘 Eingabe der Artikelnummer 왘 Eingabe der Menge 왘 Ermittlung des Preises 64 Programmierkurs Eingabe der Artikelnummer Die Funktion eingabe_artnr() hat keinen Parameter, aber einen Rückgabewert. Die Eingabe der Artikelnummer durch den Anwender ist in eine Ausnahmebehandlung eingebettet. Dadurch wird dafür gesorgt, dass auf jeden Fall eine reguläre Artikelnummer zurückgeliefert wird. Die Eingabe von Zeichen statt Zahlen oder die Eingabe einer ungültigen Artikelnummer führen zur Wiederholung der Eingabe. # Eingabe der Artikelnummer def eingabe_artnr(): fehler = 1 while fehler == 1: try: print "Artikelnummer:" ein = input() if ein != 0 and ein != 17 and ein != 22 \ and ein != 38 and ein != 47 and ein != 125: raise fehler = 0 except: print "Es ist nur erlaubt: 0 17 22 38 47 125" print "Bitte wiederholen" return ein Listing B.29 Datei b43.py, Eingabe der Artikelnummer Das Zeichen \ am Ende der if-Anweisung weist darauf hin, dass diese Anweisung in der nächsten Zeile fortgesetzt wird. Eingabe der Menge Die Funktion eingabe_menge() hat einen Parameter und einen Rückgabewert. Die Artikelnummer wird an die Funktion übermittelt. Dadurch kann der Anwender darüber informiert werden, zu welchem Artikel er eine Menge eingeben soll. Die Eingabe der Menge ist ebenfalls in eine Ausnahmebehandlung eingebettet. Dadurch wird dafür gesorgt, dass auf jeden Fall eine sinnvolle Menge zurückgeliefert wird. Die Eingabe von Zeichen statt Zahlen oder die Eingabe einer nicht sinnvollen Mengenangabe führen zur Wiederholung der Eingabe. # Eingabe der Menge def eingabe_menge(nr): fehler = 1 Programmierprojekt Rechnungserstellung 65 while fehler == 1: try: print "Menge des Artikels", nr, ":" ein = input() if ein < 0: raise fehler = 0 except: print "Es ist nur eine Menge >= 0 sinnvoll" print "Bitte wiederholen" return ein Listing B.30 Datei b43.py, Eingabe der Menge Ermittlung des Preises Die Funktion ermitteln_epreis() hat ebenfalls einen Parameter und einen Rückgabewert. Auch hier wird die Artikelnummer an die Funktion übermittelt. Mit Hilfe der Artikelnummer wird in einer mehrfachen Verzweigung der zugehörige Einzelpreis ermittelt. # Preisermittlung def ermitteln_epreis(nr): if nr == 17: epreis = 2.2 elif nr == 22: epreis = 24.5 elif nr == 38: epreis = 15 elif nr == 47: epreis = 9.95 else: epreis = 12.95 return epreis Listing B.31 Datei b43.py, Preisermittlung Hauptprogramm Hauptprogramm 66 Der Ablauf des Hauptprogramms hält sich im Wesentlichen an den bereits bekannten groben Ablaufplan. Die Programmteile, die eine größere Schachtelungstiefe haben, die also mehrfache Verzweigungen und/oder Schleifen beinhalten, wurden ausgelagert. Sowohl Hauptprogramm als auch Funktionen sind dadurch übersichtlicher und besser zu warten. Programmierkurs Einzelne Aspekte, die diesem Programm später hinzugefügt werden können, betreffen eventuell nur eine einzelne Funktion. Der Rest des Programms kann unverändert bleiben. # Module importieren from b43 import * # Gesamtrechnungssumme auf 0 setzen nettosumme = 0 # 1. Eingabe einer Artikelnummer artnr = eingabe_artnr() # Schleife für alle Rechnungsposten while artnr != 0: # Preisermittlung epreis = ermitteln_epreis(artnr) # Eingabe der Menge menge = eingabe_menge(artnr) # Gesamtpreis des Rechnungspostens posten = menge * epreis # Summierung für Gesamtrechnungssumme nettosumme = nettosumme + posten # nächste Eingabe einer Artikelnummer artnr = eingabe_artnr() # Berechnung der Rechnungssumme brutto und in DM ust = nettosumme * 0.16 bruttosumme = nettosumme + ust bruttosumme_dm = bruttosumme * 1.95583 # Ausgabe aller Rechnungssummen print "Netto %7.2f Euro" % (nettosumme) print "Ust %7.2f Euro" % (ust) print "Brutto %7.2f Euro" % (bruttosumme) print "entspricht %7.2f DM " % (bruttosumme_dm) Listing B.32 Datei b42.py Programmierprojekt Rechnungserstellung 67