Название: Routineaufgaben mit Python automatisieren
Автор: Al Sweigart
Издательство: Bookwire
Жанр: Математика
isbn: 9783960889571
isbn:
Damit wissen wir nun, wie viele lebende Nachbarn die Zelle in currentCells[x] [y] hat, sodass wir nextCells[x][y] dementsprechend auf '#' oder ' ' setzen können. Nachdem wir alle möglichen x- und y-Koordinaten durchlaufen haben, lassen wir das Programm durch den Aufruf von time.sleep(1) eine Pause von einer Sekunde einlegen. Danach geht die Programmausführung zum Anfang der Hauptschleife zurück, um mit dem nächsten Schritt weiterzumachen.
Je nach Ausgangsverteilung der Zellen können verschiedene bekannte Muster auftreten, für die Namen wie »Gleiter«, »Propeller« oder »schweres Raumschiff« geprägt wurden. Das in Abb. 4–8 gezeigte Gleitermuster bewegt sich alle vier Schritte in diagonaler Richtung fort. Um einen einzelnen Gleiter zu erzeugen, ersetzen Sie die folgende Zeile in conway.py:
if random.randint(0, 1) == 0:
durch diese Zeile:
if (x, y) in ((1, 0), (2, 1), (0, 2), (1, 2), (2, 2)):
Wenn Sie mehr über die faszinierenden Muster erfahren möchten, die Sie erzeugen können, suchen Sie im Web nach »Conways Spiel des Lebens« oder »Conway’s Game of Life«. Ähnliche Python-Programme wie das hier vorgestellte finden Sie auf https://github.com/asweigart/pythonstdiogames.
Zusammenfassung
Listen bilden einen sehr nützlichen Datentyp, da Sie damit Code schreiben können, der eine beliebige Anzahl von Werten in einer einzigen Variablen bearbeiten kann. Weiter hinten in diesem Buch werden Sie Programme kennenlernen, in denen Listen für Aufgaben eingesetzt werden, die ohne sie nur sehr schwer oder überhaupt nicht zu erledigen wären.
Listen gehören zu den sequenziellen Datentypen und sind veränderbar, d. h., ihr Inhalt kann sich ändern. Tupel und Strings dagegen, die zwar auch zu den sequenziellen Datentypen zählen, sind unveränderbar. Eine Variable, die ein Tupel oder einen String enthält, kann mit einem neuen Tupel oder String überschrieben werden, aber das ist nicht das Gleiche wie die unmittelbare Veränderung eines Wertes, wie sie beispielsweise mit den Methoden append() und remove() für Listen möglich ist.
In Variablen werden Listen nicht direkt gespeichert, sondern nur in Form von Verweisen auf die Listen. Dieser Unterschied ist von großer Bedeutung, wenn Variablen kopiert oder Listen als Argumente an Funktionsaufrufe übergeben werden. Da der kopierte Wert nur der Verweis auf die Liste ist, können sich jegliche Änderungen, die Sie an der Liste vornehmen, auch auf andere Variablen in dem Programm auswirken. Wenn Sie eine Liste in einer Variablen bearbeiten wollen, ohne dabei die ursprüngliche Liste zu ändern, müssen Sie sie mit copy() oder deepcopy() kopieren.
Wiederholungsfragen
1 Was ist []?
2 Wie weisen Sie den Wert 'hello' als drittes Element der Liste zu, die in der Variablen spam gespeichert ist? (Nehmen Sie an, spam enthält [2, 4, 6, 8, 10].)
Nehmen Sie für die folgenden drei Fragen an, dass spam die Liste ['a','b', 'c', 'd'] enthält.
1 3.Wozu wird spam[int('3' * 2) // 11] ausgewertet?
2 4.Wozu wird spam[-1] ausgewertet?
3 5.Wozu wird spam[:2] ausgewertet?
Nehmen Sie für die folgenden drei Fragen an, dass bacon die Liste [3.14, 'cat', 11, 'cat', True] enthält.
1 6.Wozu wird bacon.index('cat') ausgewertet?
2 7.Wie sieht der Listenwert in bacon nach der Ausführung von bacon.append(99) aus?
3 8.Wie sieht der Listenwert in bacon nach der Ausführung von bacon.remove('cat') aus?
4 9.Wie sehen die Operatoren für die Listenverkettung und die Listenwiederholung aus?
5 10.Was ist der Unterschied zwischen den Listenmethoden append() und insert()?
6 11.Welche beiden Möglichkeiten gibt es, um Elemente aus einer Liste zu entfernen?
7 12.Nennen Sie einige Ähnlichkeiten zwischen Listen- und Stringwerten!
8 13.Worin unterscheiden sich Listen und Tupel?
9 14.Wie geben Sie einen Tupelwert an, der nur den Integerwert 42 enthält?
10 15.Wie können Sie die Tupelform eines Listenwertes erzeugen? Wie die Listenform eines Tupelwertes?
11 16.In Variablen, die Listenwerte »enthalten«, ist die eigentliche Liste gar nicht gespeichert. Was enthalten sie in Wirklichkeit?
12 17.Was ist der Unterschied zwischen copy.copy() und copy.deepcopy()?
Übungsprojekte
Schreiben Sie zur Übung Programme, die die folgenden Aufgaben erledigen.
Kommacode
Nehmen Sie an, Sie haben einen Listenwert wie den folgenden:
spam = ['apples', 'bananas', 'tofu', 'cats']
Schreiben Sie eine Funktion, die einen Listenwert als Argument entgegennimmt und einen String zurückgibt, in dem alle Listenelemente durch ein Komma und ein Leerzeichen getrennt sind und vor dem letzten Eintrag and steht. Wenn Sie beispielsweise die vorstehende Liste spam an diese Funktion übergeben, sollte sie 'apples, bananas, tofu, and cats' zurückgeben. Die Funktion muss allerdings bei jedem beliebigen Listenwert funktionieren. Prüfen Sie insbesondere den Fall, dass der Funktion eine leere Liste (also []) übergeben wird.
Münzwurffolgen
In dieser Übung sollen Sie ein Experiment durchführen. Wenn Sie hundertmal eine Münze werfen und dabei jeweils K für Kopf und Z für Zahl notieren, erhalten Sie eine Liste wie »Z Z Z Z K K K K Z Z«. Soll sich aber jemand eine Folge von einhundert zufälligen Münzwürfen ausdenken, ist das Ergebnis gewöhnlich eher etwas wie »K Z K Z K K Z K Z Z«, was für Menschen zwar zufällig aussieht, aber nicht zufällig im mathematischen Sinne ist. Ein Mensch wird sich praktisch nie eine Serie von sechs Kopf- oder Zahlwürfen hintereinander ausdenken, obwohl so etwas bei zufälligen Münzwürfen sehr wahrscheinlich ist. Menschen sind nicht gut darin, zufällige Muster zu erzeugen.
Schreiben Sie ein Programm, um herauszufinden, wie oft in einer zufällig generierten Folge von simulierten Münzwürfen sechsmal Kopf oder sechsmal Zahl hintereinander erscheinen. Im ersten Teil muss das Programm also eine Liste zufällig ausgewählter Kopf- und Zahlwerte anlegen und im zweiten Teil überprüfen, ob eine Serie darin vorkommt. Stellen Sie den gesamten Code in eine Schleife, die das Experiment 10.000 Mal durchführt, sodass Sie auch ermitteln können, in welchem Prozentsatz СКАЧАТЬ