Let's code Python

 
 
Rheinwerk (Verlag)
  • 1. Auflage
  • |
  • erschienen am 28. Dezember 2018
  • |
  • 364 Seiten
 
E-Book | ePUB mit Wasserzeichen-DRM | Systemvoraussetzungen
978-3-8362-6516-4 (ISBN)
 

Python macht Spaß! Steige einfach in die Programmierung ein: Mit eigenen kleinen Programmen und Spielen, selbst gebauten Kreaturen, Grafik und mehreren Leveln. Mit der Entwicklungsumgebung TigerJython ist es besonders einfach, zügig loszulegen. Sie bietet viele Hilfen eigens für Anfänger und für den Fall, dass du mal einen Fehler finden musst. Ohne Vorkenntnisse lernst du Python in überschaubaren Projekten kennen. Neue Sprachelemente werden ausführlich vorgestellt, mit farbigen Hervorhebungen und Erklärungen direkt am Code.

Aus dem Inhalt:

  • Installation und erste Schritte
  • Quiz, Vokabeltrainer, Würfel-Poker
  • Fehler finden leicht gemacht
  • Ein Grafik-Framework benutzen
  • Ein Roboter, der zeichnen kann
  • Dateien bearbeiten und speichern
  • Mathematische Graphen und Diagramme
  • Spiele nachprogrammieren: Breakout, Tic Tac Toe und mehr
  • Selbst gebaute Kreaturen
  • Multi-Level-Spiele
weitere Ausgaben werden ermittelt
Hauke Fehr programmiert seit 30 Jahren in verschiedenen Sprachen. Mit wachsender Begeisterung entwickelt er mit LiveCode kommerzielle Apps im Auftrag seiner Kunden und als eigene Produkte. Die Anwendungsgebiete reichen vom Sprachenlernen bis zur Auftragsverwaltung für KMUs. Als Linguist und Hochschuldozent hat er ein besonderes Gespür fürs Lernen und Lehren. Seine Programmierkenntnisse und Ideen gibt er gern an Kunden, Kursteilnehmer und natürlich seine Leser weiter.


Materialien zum Buch ... 13


Geleitwort ... 15


1. Programme schreiben -- wie geht das? ... 17


2. Wie funktionieren Computer überhaupt? ... 21


Innenleben eines PCs ... 21

Eingabe, Verarbeitung, Ausgabe ... 22

Bits und Bytes ... 24

Prozessortakt -- wie schnell läuft mein PC? ... 26



3. Python -- die Programmiersprache ... 27


Maschinensprache -- die Muttersprache des Prozessors ... 27

Interpreter und Compiler ... 28

Python -- einfach und universell ... 29

Jython -- was ist das? ... 30

TigerJython -- deine Lernumgebung ... 31



4. TigerJython installieren -- einfacher geht's nicht ... 33


Installation unter Windows ... 33

Installation auf dem Mac ... 35

TigerJython unter Linux installieren ... 37



5. Die ersten Schritte -- Python im Dialog ... 39


Direkte Befehle -- die Konsole ... 40

Ausgabe mit Zahlen ... 40

Die »Syntax« muss stimmen ... 45

Zeichenketten statt Zahlen ... 46



6. Variablen -- jetzt wird es flexibel ... 49


Variablennamen ... 51

Der »input«-Befehl -- Eingaben zum Verarbeiten ... 54



7. Programme schreiben -- es geht los! ... 57


Ein Programm in TigerJython eingeben ... 57

Das allererste Programm: Ein Zahlenzaubertrick ... 58

Zweites Programm: Ein Umrechner ... 60

Programme speichern ... 62

Eingabe, Verarbeitung, Ausgabe -- diesmal mit Text ... 63

Rechner mit Rest ... 65

Das magische Quadrat ... 66

Variation: Magisches Quadrat mit fester Summe ... 70



8. Bedingungen -- Was passiert, wenn ... ... 73


»if«-Abfragen in Python ... 74

»if« mit »else« ... 77

Mehrere Bedingungen verknüpfen ... 79

»elif« -- »else if« ... 80

»if« -- »else« im Überblick ... 81

Wahr und falsch beim Verknüpfen ... 83

Programm: Eintrittsprüfung ... 84



9. Befehle und Module ... 87


Was sind Module? ... 87

Das Modul »math« ... 88

Das Modul »random« ... 92

Roulette ... 93

Programm: Entscheidungshilfe ... 94



10. Schleifen -- Wiederholungen machen Programme stark ... 97


Die Zählschleife mit »repeat« ... 98

Würfeln ohne Ende ... 100

Schleifen verschachteln ... 103

Die »while«-Schleife ... 105

Würfelpoker ... 106

Klassisches Zahlenraten ... 109

Das kleine Einmaleins ... 112

Mehr Möglichkeiten für »while«-Schleifen ... 117

Primzahlentester ... 119

Das Probeverfahren ... 119

Das Schachrätsel ... 124

Zins und Zinseszins ... 126



11. Listig: Mit Listen arbeiten ... 127


Zeichenketten sind Listen ... 127

Listen in Python ... 130

Wochentag nachschlagen ... 132

Listen per Programm erzeugen ... 133

Die »for«-Schleife mit einer Liste ... 134

Mehr Befehle, Methoden und Funktionen für Listen ... 137

Ein Lottozahlen-Tipp ... 140

Das Lottospiel: Selbst tippen und gewinnen ... 144

Mehrdimensionale Listen ... 148

Zusammenfassung: Listen ... 151



12. Die Schildkröte -- ein grafischer Roboter ... 153


Die Schildkröte steuern ... 154

Weitere Turtle-Befehle ... 162

Grafik mit Koordinaten ... 166

Funktionsgraphen programmieren ... 168

Zufallsbilder erstellen ... 170

Variationen: Zufallsmuster ... 172

Eingebaute Funktionen nutzen ... 175



13. Funktionen selber schreiben ... 177


Was sind Funktionen noch mal genau? ... 177

Eigene Funktionen schreiben ... 178

Eigene Funktion »zahlwort« ... 182

Ein eigenes Modul erstellen ... 186

Zeichnen mit Funktionen ... 188

Rekursive Funktionen ... 190



14. Sound programmieren ... 195


Sound in Python abspielen ... 195

Was sind denn eigentlich Klangdateien? ... 195

WAV-Dateien abspielen ... 196

mp3-Dateien abspielen ... 197

Eigene Musik machen ... 198

Sprachsynthese: Lass den Computer sprechen! ... 200



15. Objekte programmieren ... 203


Was sind Objekte? ... 204

Objekte in Python ... 204

Klassen und Instanzen ... 207

Objekte für alles ... 212



16. Eigene Objekte definieren ... 215


Die Funktion »__init__« ... 216

Eigene Methoden definieren ... 218

Die Funktion »__str__« ... 220

Ableitung und Vererbung -- ein Supertoaster ... 223



17. gamegrid -- Spiele bauen mit Objekten ... 227


Ein Spielfeld erzeugen ... 228

Actor -- jetzt kommen die Figuren ins Spiel ... 232

Der Fisch soll leben ... 234

Spielfiguren mit Eigenleben ... 236

Das Spielfeld kontrolliert den Takt ... 239

Die Steuerungsleiste in gamegrid ... 244



18. Steuerung und Ereignisse in gamegrid ... 247


Erweiterung der Spielidee ... 252

Kollision: Interaktion zwischen Spielfiguren ... 253

Klang hinzufügen ... 258

Ein Spiel braucht Gegner ... 259



19. Neues Spiel: Breakball ... 267


Das Spielprinzip ... 267

Elemente des Programms ... 267

Erste Schritte: Spielfeld und Ball ... 268

Nächstes Element: Das Brett ... 273

Dritter Schritt: Die Blöcke ... 277

Die Spielsteuerung ... 282



20. Space Attack -- ein Klassiker ... 289


Das Spielprinzip ... 289

Technik: Was brauchen wir? ... 289

Das Spielfeld ... 290

Das Raumschiff ... 290

Jetzt wird geschossen ... 292

Die Aliens ... 296

Erweiterungen ... 306

Weiterer Ausbau: deine Aufgabe ... 309



21. Flappy Ball -- geschicktes Hüpfen ... 311


Die Spielidee ... 311

Benötigte Elemente ... 311

Das Spielfeld ... 312

Der Ball ... 312

Die Ballsteuerung mit der Maus ... 314

Die Balken -- als Spielgegner ... 317

Das Spiel erweitern und verbessern ... 324

Weitere Ideen ... 326



22. TicTacToe -- Brettspiele mit gamegrid ... 329


Das Spielprinzip ... 329

Welche Elemente werden benötigt? ... 329

Das Spielfeld ... 330

Auf die Maus reagieren ... 332

Die Spielverwaltung ... 334

Ein Objekt für die Spieldaten ... 335

Erweiterungen von TicTacToe ... 343

Der Computer als Gegner ... 344

Am einfachsten: Die Zufallsmethode ... 345

Cleverer: Die doppelte Prüfmethode ... 349

Echte KI: Die Minimax-Methode ... 353



23. Wie geht es weiter? ... 355


Mit TigerJython weitermachen ... 356

Andere Python-Systeme ... 357

Andere Programmiersprachen? ... 358



Index ... 361

Das Probeverfahren


Was muss das Programm machen? Vereinfacht gesagt muss es versuchen, die eingegebene Zahl durch alle Zahlen außer der 1 und sich selbst zu teilen, und prüfen, ob das Ergebnis eine ganze Zahl ist. Wenn das auch nur einmal der Fall ist, ist die Zahl keine Primzahl.

Fangen wir also ganz einfach an. Später wirst du das Programm noch verfeinern und optimieren.

Als Erstes wird die Zahl x eingegeben.

x = input("Gib eine Zahl ein")

Zum Prüfen der Teiler musst du natürlich wieder eine Schleife verwenden. Die Schleife geht alle denkbaren Teiler durch und wird beendet, wenn entweder alle Teiler ohne Ergebnis geprüft wurden - oder wenn ein Teiler »aufgeht«, dann ist es nämlich keine Primzahl.

Wie prüft man nun, ob eine Zahl durch einen Teiler teilbar ist? »Teilbar« ist ja eigentlich jede Zahl, nur eben nicht mit Ganzzahl-Ergebnis. Und das musst du prüfen. Ist das Ergebnis x / teiler eine ganze Zahl?

Du kannst das mit den Mitteln, die du schon kennst, machen. Erinnere dich an den Anfang des Buches mit dem Rechnen auf der Konsole. Es gibt einen Operator (das %-Zeichen), mit dem man den Rest einer Division ermitteln kann (das nennt man auch Modulo). Wenn der Rest 0 ist, dann ist die Zahl glatt teilbar.

if (x % teiler) == 0:
primzahl = False

Wenn diese Bedingung zutrifft, dann ist x keine Primzahl, weil sie glatt durch einen der teiler teilbar ist (der Rest der Division ergibt 0). Also wird in dem Fall die Variable primzahl auf den Wert False gesetzt (»nicht wahr«). Zu Beginn muss primzahl natürlich auf True gesetzt werden, denn im Ausgangspunkt vermuten wir, dass jede Zahl eine Primzahl ist, bis der Gegenbeweis gefunden wird. Wenn die Variable nach dem Prüfen aller Teiler noch immer auf True steht, ist die Zahl eine Primzahl; wenn sie auf False steht, ist die Zahl keine Primzahl.

Jetzt zur Schleife. Welche Schleife eignet sich besser - eine Zählschleife oder eine while-Schleife?

Nun, man könnte meinen, eine Zählschleife wäre gut geeignet, denn wir wollen ja einfach alle Zahlen von 2 bis x-1 durchprüfen. Dann könnten wir diese Zahlen einfach per Zähler durchgehen und anschließend sehen, ob primzahl auf False gesetzt wurde.

Ja, das würde funktionieren, aber es wäre sehr ineffizient. Angenommen, wir prüfen die Zahl 999. Gleich bei der zweiten Prüfung käme heraus, dass sie durch 3 teilbar ist (also keine Primzahl). Trotzdem würde das Programm noch 995 weitere Teiler ausprobieren, bevor das Ergebnis angezeigt wird. Das kostet unnötig Zeit, vor allem bei großen Zahlen. Wenn die Zahl auch nur durch einen einzigen Teiler teilbar ist, dann kann die Prüfung sofort beendet werden.

Es läuft also wieder auf eine while-Schleife heraus, die dann beendet wird, wenn entweder alle Teiler geprüft wurden oder wenn primzahl == False ist. Oder positiv ausgedrückt: Die while-Schleife läuft solange, wie der teiler kleiner als die Zahl x und der Wert von primzahl wahr ist. Der Teiler beginnt mit 2, und in der Schleife wird er natürlich immer um 1 erhöht, solange wir noch keinen Teiler gefunden haben.

Damit wird die while-Schleife zur Primzahlprüfung von x so aussehen:

teiler = 2
primzahl = True
while (teiler < x) and (primzahl):
if (x % teiler) == 0:
primzahl = False
else:
teiler = teiler +1

Am Ende nach der Schleife kann dann das Ergebnis ausgegeben werden. Es ist klar: Wenn die Variable primzahl auf True steht (wahr ist), dann handelt es sich um eine Primzahl. Ansonsten handelt es sich um keine Primzahl, und die Variable teiler ist der Gegenbeweis (der erste Teiler, den das Programm gefunden hat und dann die Schleife beendet hat).

if primzahl:
print x,"ist eine Primzahl."
else:
print x,"ist keine Primzahl. Teiler:",teiler

Das gesamte Programm sieht jetzt also so aus und funktioniert:

x = input("Gib eine Zahl ein")
teiler = 2
primzahl = True
while (teiler < x) and (primzahl):
if (x % teiler) == 0:
primzahl = False
else:
teiler = teiler + 1
if primzahl:
print x , "ist eine Primzahl."
else:
print x , "ist keine Primzahl. Teiler:" , teiler

Teste das Programm einmal mit kleineren und dann auch mit größeren Zahlen. Es ist absolut zuverlässig und sagt dir sicher, welche Zahl eine Primzahl ist und welche nicht. Bei Nicht-Primzahlen läuft es auch sehr schnell - klar, wenn eine Zahl durch 2 oder 3 teilbar ist, dann braucht die Schleife ja auch nur ein bis zwei Mal durchlaufen werden, und schon ist das Ergebnis da.

Aber bei echten Primzahlen, die richtig hoch sind, spürt man dann doch, dass es eine ganze Weile dauern kann. Gib zum Beispiel mal »9999083« ein (eine Primzahl). Auf meinem Rechner dauert die Prüfung etwa 5 Sekunden. Die Zahl ist sehr hoch: fast zehn Millionen - und deshalb muss das Programm auch fast zehn Millionen Teiler durchprüfen. Zehn Millionen Divisionen und Überprüfungen, da sind 5 Sekunden Rechenzeit immer noch beeindruckend. Aber: Müssen es denn wirklich so viele Überprüfungen sein? Nein - müssen es nicht.

Wenn man darüber etwas nachdenkt, kommt man vielleicht erst einmal zu dem Ergebnis, dass spätestens bei der Hälfte der Zahl eigentlich Schluss sein müsste, denn wenn das Ergebnis der Division kleiner als 2 ist, kann keine sinnvolle Ganzzahl mehr dabei herauskommen. Denkt man weiter nach, reduziert es sich noch viel mehr. Mathematischer Fakt ist: Schon bei der Wurzel der geprüften Zahl kann man mit der Überprüfung Schluss machen, denn ab da wäre der Teiler so groß wie das Divisionsergebnis, und anschließend dreht es sich nur noch um. Wenn also bis zur Wurzel von x kein Teiler gefunden wurde, wird es auch danach keinen mehr geben. Das macht einen riesigen Unterschied. Bei der Zahl 9.999.083 müsste das Programm dann nicht mehr fast zehn Millionen Rechnungen und Überprüfungen machen, sondern nur noch 3.161. So wird das Programm natürlich extrem viel effizienter und schneller.

Wir legen jetzt also einen Maximalwert fest, bis zu dem der Teiler gehen muss, bevor die Schleife beendet ist. Die Variable nennen wir max, und in ihr ist die Wurzel von x. (Die Wurzel können wir auch ohne das Modul math ermitteln, indem wir x ** 0.5 rechnen.) Die Schleife ändert sich also folgendermaßen:

maximum = x ** 0.5
while (teiler <= maximum) and (primzahl):

Achte darauf, dass in der ersten Klammer jetzt <= steht, denn komplett bis einschließlich zur Wurzel von x sollen alle Teiler durchgeprüft werden. Ändere das Programm und prüfe die Zahl 9.999.083 noch einmal. Merkst du, wie viel schneller es jetzt geht? Da kommt das Ergebnis wieder sofort.

So ist das Programm auf jeden Fall auch für hohe Zahlen schnell und brauchbar - jedenfalls bis zu einer Grenze, die sicherlich für alle normalen Maßstäbe akzeptabel ist.

Es gäbe aber durchaus noch mehr Möglichkeiten, das Programm zu optimieren - zum Beispiel könnte man die Zahl gleich am Anfang darauf überprüfen, ob sie gerade ist (also durch 2 teilbar). Wenn ja, dann ist sie sowieso keine Primzahl, und die Überprüfung braucht gar nicht erst begonnen werden. Wenn nein, dann ist es auf jeden Fall eine ungerade Zahl, und die Variable teiler kann bei 3 beginnen und immer um 2 erhöht werden, denn gerade Teiler brauchen wir nicht zu prüfen - sie können bei einer ungeraden Zahl nicht mehr zutreffen. Wenn du möchtest, kannst du das Programm selbst dahin weiter optimieren. Das würde die Zeit der Überprüfung noch einmal halbieren! Du findest Beispiele für alle Optimierungen auch auf der DVD zum Buch oder auf der Webseite des Buches.

Aufgabe

Zum Schluss der Primzahlenberechnung noch eine Aufgabe für dich:

Angenommen, jemand fragt dich nach einer Liste aller Primzahlen von 1 bis 1.000, damit er darin jederzeit nachschlagen kann. Wie kannst du das Primzahltestprogramm so umbauen, dass es diese Liste aller Primzahlen von 1 bis 1.000 erzeugt?

Versuche, diese Aufgabe selber zu lösen. Du brauchst nicht viel Neues dafür. Anstatt die Zahl x mit input einzugeben, setzt du x am Anfang auf 2 und verwendest dann eine Zählerschleife (repeat), die 999 Mal durchgeht und die Überprüfung macht. Nur wenn die Zahl eine Primzahl ist, wird sie mit print ausgegeben. Am Schluss der Schleife erhöhst du x um 1.

Alles klar?

Hier die Lösung zum Vergleichen:

x = 2
repeat 999:
teiler = 2
primzahl = True
maximum = x ** 0.5
while (teiler <= maximum) and (primzahl):
if (x % teiler) == 0:
primzahl = False
else:
teiler = teiler +1
if primzahl:
print x
x = x + 1

Abbildung 10.9    Eine Liste aller Primzahlen unter 1.000. In nur einer Sekunde...

Dateiformat: ePUB
Kopierschutz: Wasserzeichen-DRM (Digital Rights Management)

Systemvoraussetzungen:

Computer (Windows; MacOS X; Linux): Verwenden Sie eine Lese-Software, die das Dateiformat EPUB verarbeiten kann: z.B. Adobe Digital Editions oder FBReader - beide kostenlos (siehe E-Book Hilfe).

Tablet/Smartphone (Android; iOS): Installieren Sie bereits vor dem Download die kostenlose App Adobe Digital Editions (siehe E-Book Hilfe).

E-Book-Reader: Bookeen, Kobo, Pocketbook, Sony, Tolino u.v.a.m. (nicht Kindle)

Das Dateiformat ePUB ist sehr gut für Romane und Sachbücher geeignet - also für "fließenden" Text ohne komplexes Layout. Bei E-Readern oder Smartphones passt sich der Zeilen- und Seitenumbruch automatisch den kleinen Displays an. Mit Wasserzeichen-DRM wird hier ein "weicher" Kopierschutz verwendet. Daher ist technisch zwar alles möglich - sogar eine unzulässige Weitergabe. Aber an sichtbaren und unsichtbaren Stellen wird der Käufer des E-Books als Wasserzeichen hinterlegt, sodass im Falle eines Missbrauchs die Spur zurückverfolgt werden kann.

Weitere Informationen finden Sie in unserer E-Book Hilfe.


Download (sofort verfügbar)

21,90 €
inkl. 7% MwSt.
Download / Einzel-Lizenz
ePUB mit Wasserzeichen-DRM
siehe Systemvoraussetzungen
E-Book bestellen