III. Programmieren mit Python III Programmieren mit Python Informatik Klasse 9 121 III.1 Grundlagen Python ist eine frei verfügbare Programmiersprache, die sich sowohl für Einsteiger eignet als auch für große Projekte nutzbar ist. Python findet unter anderem Verwendung bei Google, Youtube und verschiedenen Hollywood-Projekten. Sein Name leitet sich übrigens nicht von der aus dem Dschungelbuch bekannten Würgeschlange ab, sondern von der britischen Comedy Truppe Monthy Python. Programmiersprachen lassen sich grundsätzlich in zwei Gruppen einteilen. Compilerorientierte Programmiersprachen erstellen mittels eines Compilers ausführbare Programme, also *.exe-Dateien. Diese werden vom Betriebssystem gestartet und ihr Programmtext kann nach der Kompilation nicht mehr gelesen werden. Eine Dekompilation schließen die meisten Hersteller in ihren Nutzungsbedingungen unter Strafandrohung aus. Dementsprechend muss bei der Kompilation bereits berücksichtigt werden, welches Betriebssystem genutzt wird. Für Windows erstellte *.exeDateien sind deshalb z.B. unter Linux nicht oder nur mit Hilfe von Zusatzsoftware wie Wine nutzbar. Python ist eine interpretative Programmiersprache. Zu einem Python-Programm gehört immer ein Interpreter, der das Programm lädt und ausführt. Da es für die gängigen Betriebssysteme bereits entsprechende Python-Interpreter gibt, sind Python-Programme unter verschiedenen Betriebssystemen austauschbar. Der Quelltext lässt sich auslesen, denn das entsprechende Skript ist mit jedem Texteditor zu öffnen. Das Programm selbst ist unter herunterzuladen. Nach der Installation befindet sich auch bereits die Programmierumgebung Idle, benannt nach einem Monthy Python – Mitglied, auf dem Rechner. Diese kann über den entsprechenden Eintrag in der Programmliste oder bei Windows 8 einfach über das Eintippen des Namens Idle in der Kacheloberfläche gestartet werden. Idle startet als Shell, so dass Python – Befehle direkt ausgeführt werden. Sichtbar ist dies an der Eingabeaufforderung, die durch die drei spitzen Klammern deutlich wird. Das eintippen von print ("Hallo Welt!") führt also direkt zu der Ausgabe Hallo Welt! Informatik Klasse 9 122 Idle arbeitet hierbei mit Farben, um verschiedene Teile des Programmcodes deutlich zu machen, und gibt z.T. Hinweise zum erwarteten Code. Sollte dieses Syntax-Highlighting nicht erscheinen, dann prüfe, ob die Programmdatei mit der Endung .py abgespeichert wurde und ändere dies ggf. entsprechend. Größere Programme sind natürlich auf diese Weise nicht effektiv zu erstellen. Über den Menüeintrag Options>Configure Idle lässt sich im Registerreiter General einstellen, dass Idle immer als Editor startet. Dann erscheint ein etwas anderes Fenster. Die Eingabeaufforderung ist verschwunden. Um das Programm zu starten, muss nun die Shell wieder gestartet werden. Dies geschieht über Run>Run Module oder die Funktionstaste F5. Sollte man noch nicht gespeichert haben, wird man nun dazu aufgefordert. Der Dateiname inklusive der Pythontypischen Endung *.py erscheint im Kopf des Editorfensters. Informatik Klasse 9 123 Natürlich lassen sich Python-Programme auch über den Doppelklick ausführen. Am Beginn dieses Kurses ist dies aber noch nicht sinnvoll, denn der Programmtext wird zwar abgearbeitet, allerdings nur in der Windows – Shell und so schnell, dass der Nutzer nur ein kurzes Erscheinen der WindowsKonsole sieht. Das wird sich bald ändern. Die Entwicklungsumgebung Idle ist sehr minimalistisch gehalten, bietet aber alles, was zunächst benötigt wird. Natürlich ist es möglich, diverse andere Umgebungen zu nutzen. Die bekannteste ist wohl Eclipse, eine integrierte Programmierumgebung für verschiedenste Programmiersprachen, die unter heruntergeladen werden kann. Eclipse bietet, nach entsprechender Einrichtung, eine Menüführung in deutscher Sprache, einen Projektbrowser und eine in das Programmfenster integrierte Konsole. Das sieht besser aus, ist aber bei der Programmerstellung selbst kaum eine entscheidende Hilfe. Aufgabe: 1. Erstelle einen Ordner in deinem persönlichen Arbeitsbereich, der deine Python – Programme enthalten wird. 2. Erstelle das Programm „Hallo Welt!“ und führe es in der Idle-Shell aus. Informatik Klasse 9 124 Erste Programme in Python III.2 III.2.1 Rechnen Natürlich ist es in Python problemlos möglich, den PC rechnen zu lassen. In diesem Beispiel wurden die Rechenoperationen direkt in die Shell eingegeben und von Python ausgeführt. Bei fehlerhaften Eingaben erscheint, wie oben zu sehen, eine Fehlermeldung, die in diesem Fall auf die nicht mögliche Division durch Null hinweist. Informatik Klasse 9 125 Natürlich gelten die üblichen Rechenregeln, also z.B. Punkt- vor Strichrechnung. Neben den Grundrechenarten ist es in Python auch möglich, eine sog. Ganzzahldivision (5//2)durchzuführen. Hierbei wird als Ergebnis eine ganze Zahl zurückgegeben. Mit der Modulo-Funktion (5%2) wird der Rest einer Division zurückgegeben. Kommazahlen werden mit einem Punkt als Trennzeichen dargestellt. Rechenoperationen im Überblick Rechenoperationen Addition Subtraktion Multiplikation Division Ganzzahldivision Modulo Informatik Klasse 9 Beispiel 1+1 2-1 3*3 5/2 5//2 5%2 Ergebnis 2 1 9 2.5 2 1 126 Erklärung Kommazahlen mit Punkt! Ergibt ganzzahligen Wert Ergibt den Rest einer Division Aufgabe: Berechne a) Object 2 Ergebnis: 12.214285714285715 b) ( ( 28−30 )∗( 2−12 ) mod 25 (mod=modulo) Ergebnis: 20 Informatik Klasse 9 127 Variablen III.2.2 III.2.2.1 Grundsätzliches Variablen sind Behälter für Daten. In Python lassen sich Variablen sehr einfach erstellen. Variablen können aus Buchstaben, Ziffern und dem Unterstrich bestehen. Als erstes Zeichen sind nur Buchstaben und der Unterstrich erlaubt. Da Python zwischen Groß- und Kleinschreibung unterscheidet, sollte man Variablen entsprechend gestalten. Grundsätzlich ist Kleinschreibung zu empfehlen. Verboten sind alle in Python reservierten Wörter False None True and as assert break class continue def del elif eise except finally for from global if import in is lambda nonlocal not or pass raise return try while with yield Im Gegensatz zu anderen Programmierumgebungen müssen Variablen in Python nicht deklariert werden, d.h. der Programmierer muss nicht festlegen, welche Art von Daten eine Variable enthält. Grundsätzlich lassen sich unter anderem folgende Werttypen unterscheiden Integer - ganzzahlige Werte i=5 Float - Fließkommazahl i=5.5 String - eine Zeichenkette i=“Zeichen“ oder i=‘Zeichen‘ oder i=‘‘‘Zeichen‘‘‘ Tupel - eine unveränderliche Liste i=1,'g','Pute',8.9 Liste - eine veränderliche Liste i=[1,‘g‘,‘Pute‘,8.9] Dictionary - eine Liste von Paaren aus Schlüssel und Wert i={‚Haus‘:‘Tür‘, ‚Katze‘:‘Maus‘, ‚Wal‘:‘Speck‘} Welcher Typ von Variable vorliegt, erkennt Python automatisch. Man kann sich den Typ mit dem Befehl type(Variablenname) anzeigen lassen. Informatik Klasse 9 128 Wird einer Variablen ein anderer Wert zugewiesen, dann ändert sich auch ihr Typ, z.B. von integer zu float usw. >>> a=1 >>> type(a) <class 'int'> >>> a=1.1 >>> type(a) <class 'float'> >>> III.2.2.2 Exkurs: Fehlermeldungen Fehlerhafte Eingaben generieren in Python diverse Fehlermeldungen. Tritt der Fehler beim Umsetzen des Programms in der Shell auf, dann werden die Meldungen auch in der Shell ausgewiesen. Werden Variablen fehlerhaft benannt, dann weist das Programm darauf hin. Hier ein Beispiel mit Python-Programm und entsprechender Konsolenausgabe: Die Meldung File "C:/Users/Torsten/Documents/schwerin_sommer_2015/if_buecher_201 5-2016/Klasse_9/python/hallo_welt.py", line 4, in <module> print(type(ai)) benennt die Zeile, in der der Fehler auftrat und den dazugehörenden Befehl. Die letzte Zeile der Fehlermeldung benennt den Fehler: NameError: name 'ai' is not defined Hier wurde also eine Bezeichnung für eine Variable genutzt, die unbekannt war. Vermieden werden sollte auf jeden Fall auch die Nutzung von Programmbefehlen zu anderen Zwecken, z.B. zur Variablenbenennung. Hier ein Beispiel zum print-Befehl: Informatik Klasse 9 129 Hier wird dem print-Befehl ein Integer-Wert zugewiesen. Die Fehlermeldung weist darauf hin, dass diese Operation mit dem System nicht kompatibel ist. Bei der Nutzung reservierter Wörter erscheint die nebenstehende Mitteilung. Liegt der Fehler dagegen bereits im Programmtext, dann erscheint ein Fehlerhinweis, bevor das Programm durch die Shell abgearbeitet wird. Hier wurden die Dictionary-Paare fehlerhaft durch Semikolon und nicht durch Komma getrennt. Der Fehler wird durch eine Fehlermeldung benannt und mit einer roten Markierung im Editorfenster markiert. Korrekt wäre dies: Aufgaben 1. Erstelle eine Variable i mit dem Wert 1. 2. Zeige den Typ in der Python-Shell an. 3. Schreibe ein Programm, dass der Variablen i nacheinander Werte vom Typ integer, float, string, tuple, list und dict zuweist, die Variable und ihren Wert anzeigt und den Variablentyp anzeigt. Tipp: Informatik Klasse 9 130 Zeige Ergebnisse über print() an. In der Klammer können Werte, Variablen oder weitere Befehle stehen. Das Ergebnis könnte so aussehen: Konsolenausgabe i= 1 <class 'int'> i= 2.8 <class 'float'> i= Text! <class 'str'> i= (1, 'g', 'Pute', 8.9) <class 'tuple'> i= [1, 'g', 'Pute', 8.9] <class 'list'> i= [1, 'g', 'Pute', 8.9] <class 'list'> i= {'2': '40', 'Haus': 'Tür', '2.9': 'Speck'} <class 'dict'> Informatik Klasse 9 131 III.2.2.3 Typenumwandlungen Auch wenn Python den Variablentyp selbstständig erkennt, kann es nötig sein, Typenumwandlungen vorzunehmen. Diese sind nur möglich, wenn der Variableninhalt dies erlaubt. Die umzuwandelnde Variable steht in der Klammer hinter dem Befehl Variablentyp(i). So ergibt der Befehl >>> i=1.8 >>> int(i) 1 >>> aber >>> i="Lol" >>> int(i) Traceback (most recent call last): File "<pyshell#4>", line 1, in <module> int(i) ValueError: invalid literal for int() with base 10: 'Lol' >>> Im ersten Fall wird eine Umwandlung vorgenommen, indem die Nachkommastellen abgeschnitten werden, im zweiten Fall sind die Werte der Variablen inkompatibel und es erscheint eine Fehlermeldung. Wichtige Umwandlungen sind int(i) Umwandlung in eine Ganzzahl float(i) Umwandlung in eine Kommazahl str(i) Umwandlung in eine Zeichenkette list(i) Umwandlung in eine Liste tuple(i) Umwandlung in einen Tupel dict(i) Umwandlung in eine Liste von Paaren (dict – Wörterbuch) Hierbei steht der umzuwandelnde Wert in der Klammer. Über + können Variablen miteinander gekoppelt oder es kann mit ihnen gerechnet werden. Kopplung: >>> >>> >>> >>> [1, i= [1, 'g', 'Pute', 8.9] j= [1, 'g', 'Pute', 8.9] k=i+j print(k) 'g', 'Pute', 8.9, 1, 'g', 'Pute', 8.9] Rechnung: >>> i=1 >>> j=2 >>> k=i+j Informatik Klasse 9 132 >>> print(k) 3 Inkompatible Variablentypen führen zu Programmabbrüchen: >>> i=1 >>> j='Jetzt eine Fehler!' >>> k=i+j Traceback (most recent call last): File "<pyshell#29>", line 1, in <module> k=i+j TypeError: unsupported operand type(s) for +: 'int' and 'str' >>> Die letzte Zeile benennt den Fehler, da sich String- und Integer-Variablen nicht addieren lassen. Übung – Ein kleines Wörterbuch Dictionary-Listen eignen sich z.B., um kleine Wörterbücher zu erstellen. Zunächst benötigen wir eine Wortliste. Gebäude Building Fluss River Berg Mountain See Lake Meer Sea Die Dictionary-Liste müsste dann so aussehen: dtl_eng={'Gebäude':'Building','Fluss':'River','Berg':'Mountain' ,'See':'Lake','Meer':'Sea'} Nun kann ein Element ausgewählt werden, um die Übersetzung zu sehen: print(dtl_eng['Gebäude']) Soll die Übersetzung in beide Richtungen funktionieren, so muss ein Dictionary mit umgekehrter Zuordnung erstellt werden. Aufgabe: Erstelle ein kleines Wörterbuch-Programm in einer selbst gewählten Sprache mit 10 Begriffen für Übersetzungen in eine Richtung. Informatik Klasse 9 133 III.2.3 Benutzereingaben Ein Wörterbuch, das nur die Übersetzungen zeigt, die der Programmierer sich ausgedacht hat, ist einigermaßen unsinnig. Deshalb kommt nun der User ins Spiel. Er soll den einzugebenden Begriff schreiben und dann die Übersetzung erhalten. Für Eingabeaufforderungen wird input() genutzt. In der Klammer kann ein Text stehen, der den Nutzer zur Eingabe auffordert. Wort=input(‚Bitte geben Sie das Wort ein‘) Spätestens jetzt wird es wichtig, die korrekte Schreibung zu beachten. Python unterscheidet z.B. auch zwischen Groß- und Kleinschreibung: Hier hat der Nutzer dies nicht beachtet und bekommt im ersten Versuch eine Fehlermeldung, die natürlich vorab programmiert werden muss. Aufgabe: Ergänze das Programm um eine entsprechende Benutzereingabe! Ergebnis >>> Bitte geben Sie das Wort ein: Meer Sea >>> Informatik Klasse 9 134 III.3 Bedingungen Natürlich kann der Benutzer hier auch Unsinn eingeben oder einfach Wörter, die das Programm nicht kennt. Das Ergebnis sieht dann so aus: Bitte geben Sie das Wort ein:Test Traceback (most recent call last): File "C:/Users/Torsten/Documents/python/Schuelerskripte/programme/wo erterbuch.py", line 6, in <module> print(dtl_eng[wort]) KeyError: 'Test' Hier wird das Schlüsselwort im Dictionary nicht gefunden und eine Fehlermeldung ausgegeben. Um dies zu vermeiden, muss geprüft werden, ob das Wort überhaupt im Wörterbuch enthalten ist. Dazu wird if-else verwendet. Das Schlüsselwort in wird genutzt, um das Vorhandensein eines Schlüssels in einem Dictionary zu prüfen. If Bedingung: Befehl Else: Befehl Mehrere Alternativen können mit elif (aus else + if) gebildet werden. Den Abschluss muss immer else bilden. If Bedingung: Befehl Elif Bedingung: Befehl Else: Befehl Beispiel: if wort in dtl_eng: print(dtl_eng[wort]) else: print('Bitte geben Sie nur bekannte Wörter ein!') Informatik Klasse 9 135 Achtung: In diesem Beispiel wird eine Besonderheit von Python deutlich, die das korrekte Schreiben von Programmtexten erzwingt. Untergeordnete Befehle müssen eingerückt werden! Beachtet man dies nicht, erscheint die folgende Fehlermeldung: Das System hat eine Einrückung erwartet, aber nicht bekommen. Aufgabe 1. Ergänze dein Programm um ein Dictionary zur Rückübersetzung, also nicht nur z.B. Deutsch-Englisch, sondern auch Englisch-Deutsch! 2. Ergänze die Prüfung der Benutzereingaben, so dass erkannt wird, welches Wörterbuch das richtige ist. Informatik Klasse 9 136 Wiederholungen und Schleifen III.4 Im Folgenden soll ein kleines Tippspiel entstehen. Der Spieler soll wie beim Lotto seine Zahlen tippen und am Ende mitgeteilt bekommen, ob er richtig geraten hat. III.4.1 Spielstart Zunächst soll das Spiel persönlicher gestaltet werden und der Spieler benötigt natürlich seine Ratezahlen. Aufgabe: Fordere den Spieler auf, seinen Namen zu nennen und begrüße ihn dann mit diesem Namen. Nun müssen die Spielertipps abgerufen werden. Eine einfache Variante besteht darin, mittels des input-Befehls jede einzelne Zahl zu erfassen, also Zahl1=input(“Bitte geben Sie ihre Ratezahl 1 ein.“) Das funktioniert, ist aber nicht besonders effektiv und benötigt viel Programmtext. Eleganter ist es, mit Dictionaries und Schleifen zu arbeiten. Für die Spielertipps wird eine Menge (set) verwendet. Mengen sind ungeordnete Gruppen ohne Duplikate. Sets sind veränderlich, frozensets dagegen, wie der Name schon sagt, nicht. Im Gegensatz zu Dictionaries oder Listen können Elemente in Mengen (set) nur einmal vorkommen. Doppelte Elemente werden automatisch eliminiert. In der Konsole bedeutet das >>> a=set([1,2,2,3,4,5,8]) >>> print(a) {1, 2, 3, 4, 5, 8} >>> Die doppelte 2 ist verschwunden. (1) spielerzahlen= set() (2) for i in range(6): (3) ratezahl=input('Bitte geben Sie die Ratezahl ein!') (4) print("Sie haben die Zahl",ratezahl,"gewählt") (5) Zunächst wird dazu eine neue, leere Menge (set) mit der Bezeichnung spielerzahlen erzeugt. (1) Informatik Klasse 9 spielerzahlen.add(ratezahl) (6) print(spielerzahlen) 137 Dann verwenden wir eine sog. Zählschleife. Mit dem Befehl for i in range(6): wird festgelegt, dass die nachfolgenden Befehle sechsmal ausgeführt werden. Das Programm zählt von Null beginnend bis vor die Zahl, die in der Klammer steht, also bis Fünf. (2) In der Zählschleife wird der Variablen ratezahl der Wert der Spielereingabe zugewiesen. (3) Die gewählte Zahl wird dem Spieler angezeigt (4) und dann wird die Eingabe in die Menge geschrieben. (5) Der print-Befehl (6) am Ende wird später verschwinden. Er dient nur als Kontrolle für den Programmierer. III.4.2 Fehler abfangen Der Spieler kann hier bereits zwei Fehler machen: 1. Er kann Unsinn eingeben, z. B. einen Buchstaben. 2. Er kann eine Zahl eingeben, die außerhalb des erlaubten Bereichs liegt. Beides muss der Programmierer unterbinden. III.4.2.1 Unsinnige Eingaben abfangen Zunächst ist es sinnvoll, zu prüfen, welchen Datentyp man erhält, wenn eine Eingabe vom Spieler gefordert wird. Dazu dient der Type-Befehl. type(Variablenname) gibt den Variablentyp zurück. Um das Ergebnis zu sehen, muss natürlich print genutzt werden: print(type(Variablenname)) Aufgabe: Ergänze das Programm, so dass der Typ der Variablen ratezahl angezeigt wird. Das Ergebnis dürfte der Variablentyp String <class 'str'> sein. Ein einfacher Test, um dafür zu sorgen, dass wir eine ganze Zahl für das Lottospiel erhalten, ist eine Typenumwandlung. Über den Befehl ratezahl_int=int(ratezahl) wird eine neue Variable erzeugt, deren Inhalt ein Integer-Wert ist, also eine ganze Zahl. War die Eingabe fehlerhaft, gibt es nun eine schöne Fehlermeldung. III.4.2.2 Fehler abfangen - Ausnahmebehandlung Informatik Klasse 9 138 Der Spieler kann nun zwar keinen Unsinn mehr eingeben, aber bei einem Fehler endet das Programm einfach. Sinnvoll ist das noch nicht, denn der Spieler soll ja spielen. Deshalb müssen Fehler abgefangen werden. Erreicht wird dies über try-except-finally. Die finally-Anweisung wird nur genutzt, wenn nach dem Fehler in jedem Fall noch etwas ausgeführt werden soll. try: Nach der try-Anweisung folgt, die Bezeichnung sagt es bereits, der Programmtext, der versucht werden soll. Gelingt der Versuch nicht, wird der nach except folgende Programmtext ausgegeben. ratezahl_int=int(ratezahl) print(type(ratezahl_int)) spielerzahlen.add(ratezahl_int) except: Das Programm läuft nun durch, aber am Ende steht die folgende Ausgabe der Spielerzahlen: print("Bitte geben Sie nur korrekte Zahlen ein") {'2', '1', '4', '3', 'w', '5'} Zwei Zahlen, die Nummer 1 und 2 wurden fehlerhaft eingegeben. Nun kann das Spiel nicht laufen, denn der Spieler hat keine sechs Zahlen. Also muss er die Eingabe wiederholen. Dazu müsste das Programm erneut aufgerufen werden, aber es gibt auch eine automatische Möglichkeit. Informatik Klasse 9 139 III.4.2.3 Falsche Zahlen abfangen Falls der Spieler einfach irgendeine Zahl eingibt, muss auch dies abgefangen werden. In die tryexcept-Anweisung sollte deshalb noch eine Bedingung eingeführt werden, die die Größe des eingegebenen Werts prüft. Bedingungen, die die Bedingungsprüfung durchführen, bevor ein Befehl abgearbeitet wird, werden über if-else bzw. bei mehreren Alternativen über if-elif-else generiert. if Bedingung: Befehl else: Befehl Oder if Bedingung: Befehl elif: Befehl else: Befehl III.4.2.4 Eingaben wiederholen lassen Einen Programmneustart bekommen wir nicht hin, aber wenn man Programmteile zu sog. Funktionen zusammenfasst, dann lassen sie sich immer wieder aufrufen. Die Erstellung einer Funktion ist einfach: Def Funktionsname() Befehl in der Funktion Befehl in der Funktion Befehl in der Funktion … Achtung: Elemente in Funktionen, also z.B. Variablen, Mengen oder Dictionaries, können außerhalb von Funktionen nicht angesprochen werden. Will man dies tun, dann müssen diese Elemente auch außerhalb der Funktion deklariert werden. Die Erstellung der Menge wird deshalb aus der Funktion ausgelagert. Informatik Klasse 9 140 Hier wird nun eine Funktion spielereingabe definiert, die die Spielereingaben inklusive der Fehlerbehandlung enthält. spielerzahlen=set() def spielereingabe(): Die Raute # leitet einen Kommentar ein. Die Zählschleife ist im Prinzip bereits bekannt. Der print-Befehl dient nur der Kontrolle. for i in range(6): #gezählt wird mit Null beginnend ratezahl=input('Bitte geben Sie die Ratezahl zwischen 1 und 36 ein!') print("Sie haben die Zahl", ratezahl, "gewählt") print(type(ratezahl)) Die Typkonvertierung produziert bei falscher Eingabe den Fehler. try: ratezahl_int=int(ratezahl) Die Bedingung prüft, ob die eingegeben Zahl im erlaubten Bereich liegt. Um zwei Prüfungen durchzuführen, wird and genutzt. if ratezahl_int<37 and ratezahl_int>0: print(type(ratezahl_int)) Das break bricht die Zählschleife ab. spielerzahlen.add(ratezahl) else: break Jetzt wird die Funktion aufgerufen. Der print-Befehl dient der Kontrolle und zeigt die Länge der Menge. Hier wird für die Wiederholung bei fehlerhafter Eingabe gesorgt. Durch die Bedingung while not wird geprüft, ob die Länge der Menge tatsächlich sechs Zeichen umfasst, also sechs unterschiedliche Zahlen eingegeben wurden. except: print("Bitte geben Sie nur korrekte Zahlen ein") print(spielerzahlen) spielereingabe() print(len(spielerzahlen)) while not len(spielerzahlen) ==6: Solange dies nicht der Fall ist, wird der Inhalt der Menge gelöscht und die Funktion zur Eingabe der Zahlen neu aufgerufen. Besonders ist, dass über den Operator not zuerst das Fehlen eines Elements getestet wird. Informatik Klasse 9 141 Hinweis: Logische Operatoren dienen dazu, Bedingungen miteinander zu verknüpfen. Drei Operatoren sind zu unterscheiden: Logischer Operator and Erklärung Beispiel or alle miteinander verknüpften Bedingungen müssen wahr sein eine der Bedingungen muss wahr sein not Keine der Bedingungen darf wahr sein if 3>2 and 5<7 print(„stimmt“) if 3>6 or 5<7 print(„stimmt“) if not 3>6 or 11<7 and 3>6 and 9<7: print("stimmt") Neben logischen Operatoren sind Vergleichs- und Zuweisungsoperatoren von elementarer Bedeutung. Der Zuweisungsoperator = wird genutzt, um einem Element einen Wert zuzuweisen. Er hat nichts mit dem mathematischen Zeichen zu tun. In dem Befehl p=p+1 wird z.B. der Variablen p ein um 1 erhöhter Wert zugewiesen. Mathematisch wäre das Unsinn. Vergleichsoperator > Erklärung Größer als < Kleiner als >= größer gleich <= kleiner gleich == gleich != ungleich Informatik Klasse 9 Beispiel if 3>2: print("stimmt4") if 2<3: print("stimmt5") if 3>=3: print("stimmt6") if 2<=5: print("stimmt7") if 3==3: print("stimmt8") if 3!=4: print("stimmt9") 142 III.4.3 Zufall Der Computer soll nun seine Zahlen spielen. Python bringt bereits eine Funktion zur Erzeugung von Zufallszahlen mit. Dem modularen Konzept folgend, muss das Modul, dass Zufallszahlen generiert, zunächst aufgerufen werden. Alle Funktionen in dem Modul sind nun nutzbar. Derartige Aufrufe mit dem import-befehl erfolgen immer zu Beginn des Programms. import random Die Zufallszahl selbst wird über random.randint(Bereichsbeginn, Bereichsende) erstellt, wobei Bereichsbeginn und –ende dazugehören. In diesem Beispiel werden also zehn Zufallszahlen zwischen 100 und 300 ausgegeben: import random for i in range(10): z=random.randint(100,300) print(z) Aufgabe: Erstelle den Programmteil, der eine Menge mit sechs unterschiedlichen Zufallszahlen zwischen 1 und 36 erzeugt. Speichere in einer eigenen Datei. Orientiere dich an der Sequenz für die Eingabe der Spielerzahlen. Tipp: Erstelle die Sequenz für den Computer zunächst in einer eigenen Datei und ergänze erst dann dein Hauptprogramm. Es vereinfacht das Testen. Informatik Klasse 9 143 Gewonnen? - Mengen vergleichen III.4.4 Mengen lassen sich sehr einfach vergleichen, indem man Schnittmengen bildet. Menge 1 2 8 7 Menge 2 4 15 5 36 25 5 9 36 25 Schnittmenge 2 8 7 1 5 25 19 15 9 4 36 Sollte ein Spieler alle Zahlen richtig haben, dann hätte in unserem Spiel die Schnittmenge sechs Elemente, in diesem Beispiel sind es immerhin drei Elemente. Der Vergleich ist einfach: Schnittmenge= Menge1 & Menge2 Das kaufmännische & generiert die Schnittmenge. Informatik Klasse 9 144 Nun ist nur noch zu prüfen, wie hoch der Gewinn ist, indem die Länge der Schnittmenge bestimmt und dem Spieler mitgeteilt wird. Aufgaben: 1. Ergänze das Programm entsprechend! Entferne auch die zur Kontrolle eingebauten Anzeigen aus der Konsole, indem du sie mit dem Rautenzeichen # auskommentierst. Informatik Klasse 9 145 Turtle – Zeichnen mit Python III.5 Das Modul Turtle stellt bereits eine Reihe von Funktionen bereit, die über entsprechende Aufrufe gestartet werden können. Befehlsreferenz – Auswahl von Funktionen aus dem Modul »turtle« III.5.1 forward(schrittzahl) fd(schrittzahl) back(schrittzahl) backward(schrittzahl) bk(schrittzahl) left(winkel) lt(winkel) right(winkel) rt(winkel) circle(radius,extent) Turtle geht um die Schrittzahl vorwärts. Turtle geht um die Schrittzahl rückwärts. Turtle dreht sich um den Winkel in Grad nach links. Turtle dreht sich um den Winkel in Grad nach rechts. Turtle zeichnet einen Kreis oder, wenn extent angegeben ist, einen Kreisbogen, mit dem Winkel extent. Möglich sind Radien größer oder kleiner Null. Der Mittelpunkt liegt dann entsprechend links bzw. rechts von Turtle. penup( ) up( ) pu( ) pendown( ) Turtle hebt den Zeichenstift an. down( ) pd( ) pensize( dicke) Turtle senkt den Zeichenstift. pencolor(farbe) fillcolor( farbe) begin_fill() colormode(255) Stellt die Strichdicke ein. Stellt die Farbe für den Zeichenstift der Turtle ein. farbe ist ein String wie ‚red‘, ‚green‘ etc. Alternativ sind auch rgb-Farben möglich Stellt die Füllfarbe der Turtle ein. Schaltet Füll-Modus der Turtle ein. Wird aufgerufen, wenn das Zeichnen einer Figur begonnen wird, die gefüllt werden soll. Gibt zunächst Stiftfarbe und dann Füllfarbe an. color((40, 80, 120), (160, Möglich sind Strings, also ‚red‘ etc, Informatik Klasse 9 146 200, 240)) end_fill() speed(Tempo) undo( ) reset( ) clear( ) home( ) hideturtle( ) showturtle( ) shape( form) color(colorstring1, colorstring2), oder color((r1,g1,b1), (r2,g2,b2)) Schaltet Füll-Modus der Turtle aus. Wird aufgerufen, wenn die Figur fertig gezeichnet ist, um sie zu füllen. Stellt ein Tempo zwischen 1 und 10 ein. Macht die letzte Anweisung rückgängig Löscht alle Zeichnungen im Grafik-Fenster und setzt den Zustand der Turtle auf die Standardwerte zurück. Löscht alle Zeichnungen im Grafik-Fenster. Zustand der Turtle bleibt erhalten. Führt die Turtle in ihre Ausgangslage und Ausgangsorientierung (Nord) zurück. Macht die Turtle unsichtbar, ohne ihre sonstigen Eigenschaften zu verändern. Macht die Turtle sichtbar. Stellt die Form der Turtle ein. Als form kann unter anderem "turtle" oder "arrow" gewählt werden. Nach der Eingabe des Befehls erscheint ein Hinweis, wie weiter zu verfahren ist. Ein Kinderspiel – Das Haus vom Nikolaus III.5.2 Turtle soll das bekannte Nikolaus-Haus zeichnen. Das Programm beginnt immer mit dem Befehl from turtle import * mit dem alle turtle-Funktionen importiert werden. Tipp: Informatik Klasse 9 147 Zur korrekten Berechnung der Diagonalen benötigst Du den Satz des Pythagoras. Er lautet: „In einem rechtwinkligen Dreieck mit den Katheten a und b sowie der Hypotenuse c ist die Summe der Kathetenquadrate a² und b² gleich dem 8 − )∗9 . Hypotenusenquadrat c².“, also ( 5 2 7 Die Diagonale berechnet sich also (28−30 )∗(2−12)mod25 Zum Berechnen der Diagonalen muss außerdem das math-Modul importiert werden. from turtle import * from math import * up() back(500) down() fd(200) left(90) fd(200) Die Quadratwurzel wird mit dem Befehl sqrt() gezogen. Das Quadrat einer Zahl wird mit pow(Basis, Exponent) gebildet. Die Formel c= √ 2002 +2002 wird so in Python zu c=sqrt(pow(200,2)+pow(200,2)) Für das Dach wird die halbe Diagonale genutzt, also c/2. left(135) c=sqrt(pow(200,2)+pow(200,2)) #Diagonale 1 fd(c) right(135) #Senkrechte links fd(200) right(45) fd(c/2) right(90) fd(c/2) right(135) fd(200) left(135) fd(c) Aufgabe: 1. Ergänze das Programm um die Möglichkeit für den Nutzer, Stiftdicke, Stiftfarbe und Größe des Hauses selbst zu bestimmen. Informatik Klasse 9 148 2. Fange fehlerhafte Eingaben der Nutzer ab. Auch fast ein Kinderspiel – Triforce III.5.3 Das Triforce besteht aus drei gleichseitigen Dreiecken. In einem gleichseitigen Dreieck sind alle drei Seiten gleich groß und die Innenwinkel betragen alle 60°. Aufgabe: Entwickle ein Programm, das die Dreiecke zeichnet und füllt. Ermögliche dem User, die Maße für Seitenlänge und Stiftdicke sowie die Werte für die Stift- und Füllfarben selbst einzugeben. III.5.4 Männlich – Weiblich Aufgabe: Zeichne mittels der turtle-Grafik die Symbole für männlich und weiblich, wie sie an verschiedenen Stellen üblicherweise verwendet werden. Beachte die unterschiedlichen Strichstärken. Informatik Klasse 9 149 III.5.5 Meditation Aufgabe: Zeichne das nebenstehende Symbol. Arbeite möglichst effektiv. Zerlege das Symbol dazu in Einzelteile, die über eigene Funktionen erstellt werden. Informatik Klasse 9 150 III.6 Befehlsreferenz Python Print() Bildschirmausgabe // Ganzzahldivision % Modulo a= Variablendeklaration If Bedingung: Befehl Elif Bedingung: Befehl Else: Befehl type() Bedingung B=int() Nn_1={a:b} c=input() circle(radius,extent) Variablentyp anzeigen lassen Typkonvertierung Dictionary-Liste Eingabeaufforderung if wort in dtl_eng: Vorhandensein prüfen for i in range(6): Zählschleife d=set([1,2,3]) Menge try: forward(schrittzahl) fd(schrittzahl) back(schrittzahl) backward(schrittzahl) bk(schrittzahl) left(winkel) lt(winkel) right(winkel) rt(winkel) penup( ) up( ) pu( ) pendown( ) down( ) pd( ) pensize( dicke) pencolor(farbe) fillcolor( farbe) begin_fill() colormode(255) color((40, 80, 120), (160, 200, 240)) vorwärts um die Schrittzahl. rückwärts um die Schrittzahl. Turtle dreht sich um den Winkel in Grad nach links. Turtle dreht sich um den Winkel in Grad nach rechts. Kreis oder, wenn extent angegeben ist, einen Kreisbogen, mit dem Winkel extent. Möglich sind Radien größer oder kleiner Null. Turtle hebt den Zeichenstift an. Turtle senkt den Zeichenstift. Stellt die Strichdicke ein. Zeichenstiftfarbe‚ z.B. red‘, ‚green‘ oder rgb-Farben Füllfarbe der Turtle Füll-Modus einschalten Stiftfarbe und dann Füllfarbe als String oder RGB Ausnahmebehandlung Befehl except: Befehl and not or break Kopplungsoperator und Nicht oder Schleife abbrechen while not Solange nicht == != = Gleich Ungleich Zuweisungsoperator hideturtle( ) showturtle( ) > < sqrt() pow(Basis,Exponen t) def name(): Größer Kleiner Quadratwurzel Potenzierung Funktion Informatik Klasse 9 end_fill() Füll-Modus aus speed(Tempo) undo( ) reset( ) time.sleep(Zeit) import time from math import * from turtle import* Tempo zwischen 1 und 10 letzte Anweisung rückgängig Löscht alle Zeichnungen Löscht alle Zeichnungen, erhält Zustand der Turtle Turtle in ihre Ausgangslage und Ausgangsorientierung (Nord) Macht die Turtle unsichtbar, Macht die Turtle sichtbar. Form der Turtle ein ("turtle" oder "arrow") Wartezeit angeben Zeitfunktion importieren Mathefunktionen importieren Turtle importieren import random Zufallsfunktion importieren clear( ) home( ) shape( form) 151 III.7 Literatur J. Ernesti / P. Kaiser: Python 3. Das umfassende Handbuch. Galileo Computing, Bonn 2012, 3. Aufl. T. Theis: Einstieg in Python. Galileo Computing, Bonn 2014, 4. Aufl. M. Weigend: Python 3. Mitp, Heidelberg 2013, 5. Aufl. M. Weigend: Python GE-PACKT. Mitp, Heidelberg 2013, 5. Aufl. B. Klein: Einführung in Python. Hanser Verlag, München 2013 J. Briggs: Python kinderleicht. dpunkt.verlag, Heidelberg 2013 G. Lingl: Python für Kids. Bhv, Heidelberg, 2010, 4. Auflage Informatik Klasse 9 152