Mal mit Beschreibung:
Code: Alles auswählen
from itertools import accumulate
from random import randint
itertools und random sind Module in der Standardbibliothek. Ersteres beinhaltet Funktionen zur Verarbeitung von Abfolgen im weitesten Sinne (das nennt man in Python
Iteratoren), zweiteres dient zur Erzeugung von Zufallszahlen und was damit zusammenhängt.
accumulate() ist eine Funktion, die eine laufende Akkumulation von Werten vornimmt. Angenommen die Folge
1, 2, 3, 4, 5, dann erzeugt
accumulate() daraus die Folge
1, 3, 6, 10, 15, d.h.
(1), (1 + 2), (1 + 2 + 3), (1 + 2 + 3 + 4), (1 + 2 + 3 + 4 + 5).
randint() ist eine Funktion, die eine Zufallszahle (ein Integer) zwischen zwei Zahlen (einschließlich) erzeugt. Das Ergebnis von
randint(10, 20) ist also irgendeine Zahl von 10 bis 20.
Hier verwende ich
range(30) um dreißig Zahlen zu erzeugen. An den Zahlen bin ich jedoch gar nicht interessiert, nur daran, dass es dreißig sind. Mein Desinteresse bringe ich dadurch zum Ausdruck, dass ich die Zahlen an _ binde, was ein geläufiges Idiom in Python darstellt. Für jede dieser ignorierten Zahlen rufe ich einmal
randint(1, 9) auf und erhalte so dreißig Zufallszahlen im Bereich 1 bis 9. Die Konstruktion mit der for-Schleife in eckigen Klammern nennt man
list comprehension.
Code: Alles auswählen
counted = accumulate(1 if m == 2 else 0 for m in numbers)
Für jede der Zahlen teste ich sie gleich zwei ist. Wenn ja, erzeuge ich eine Eins und andernfalls eine Null. Wenn ich über der so entstehenden Folge von Einsen und Nullen mit
accumulate() die laufende Summe bilde, wird für jede gefundene Zwei die Summe um eins erhöht.
Code: Alles auswählen
for i, (n, c) in enumerate(zip(numbers, counted), start=1):
Mit
zip() kann man aus mehreren Folgen eine machen, so dass das neue erste Element ein Tupel der ersten Elemente der ursprünglichen Folgen ist (die Reihenfolge der Elemente bleibt dabei dieselbe wie die der Ausgangsfolgen). Nehmen wir zB. die Listen
[1, 2, 3] und
[4, 5, 6], dann ergibt
list(zip([1, 2, 3], [4, 5, 6])) die neue Liste
[(1, 4), (2, 5), (3, 6)].
enumerate() erzeugt ebenfalls eine Folge von Tupeln. Die bestehen aus dem Index des Elements und dem Element selbst. Angenommen die Liste
x = ['Tische', 'Stühle', 'Bierseidel'], dann erzeugt
list(enumerate(x)) die Liste [(0, 'Tische'), (1, 'Stühle'), (2, 'Bierseidel')]. Wenn man nicht mit Null beginnen möchte, kann man einen anderen Startwert angeben, im o.s. Fall die Eins.
Für Strings gibt es eine Formatsprache für Templates, mit der man angeben kann, wie Werte formatiert werden sollen. Das '{0:.2%}' bedeutet, dass das Argument von
.format(c / i), also das Ergebnis der Rechnung
(c / i) als Prozentzahl mit zwei Nachkommastellen dargestellt wird, wobei man nichtmal selbst mit 100 Multiplizieren muss, denn das geschieht automatisch. Die Zahl 0.256789 wird also als 25.68% dargestellt.
In specifications, Murphy's Law supersedes Ohm's.