Seite 1 von 1
Automate the boring stuff with python
Verfasst: Sonntag 27. September 2020, 14:17
von namyelusbig
Hallo,
im Zuge einer Aufgabe im Buch "Automate the boring stuff with python" soll ich einen Münzwurf programmieren. Dies wird dann 10.000 mal gemacht, gleichzeitig soll überprüft werden wie oft eine bestimmte Folge sich zufällig generiert.
Im ersten Teil soll man wie es da steht eine Liste von 100 Kopf- und Zahlenwerten programmieren. Dies müsste eigentlich richtig sein.
Aber im zweiten Teil soll dann geprüft werden ob die Folge
"KZKZKKZKZZ" und ich merke gerade wo ich das schreibe, dass das gar nicht funktionieren kann, da ich ja eine Liste mit 0 und 1 erzeuge.

Wie kann ich denn dafür sorgen, dass ich aus den 0 und 1 Z und K mache ich habe versucht 1 = Z und 0 = K zu setzen aber das hat nicht funktioniert.
Außerdem weiß ich nicht ob der Code den ich geschrieben habe so geht..
Danke für eure Mühe.
Code: Alles auswählen
import random
numberOfStreaks = 0
list = []
for experimentNumber in range (10000):
#Code, der eineListe von 100 Kopf- oder Zahlenwerten erstellt
for i in range(0, 100):
list.append(random.randint(0, 1))
#Code der prüft, ob Kopf oder Zahl sechsmal hintereinander vorkommt
streaks = "KZKZKKZKZZ"
for i in range(len(list)):
if list[i] == streaks :
numberOfStreaks +=1
print("Chance of streak: %s%%" %(numberOfStreaks / 100))
Re: Automate the boring stuff with python
Verfasst: Sonntag 27. September 2020, 14:40
von Sirius3
Variablennamen schreibt man nach Konvention komplett klein: number_of_streaks.
Wenn Du Kopf und Zahl würfeln willst, dann benutze random.choice:
Und wenn Du 100 davon willst:
Ein Listenelement mit 0 oder 1 oder "K"/"Z" kann niemals gleich einem String mit 10 Buchstaben sein.
Statt über einen Index zu iterieren würde man auch über die Elemente direkt iterieren.
Hier aber würde man einfach Stringoperationen verwenden:
Code: Alles auswählen
tosses = "".join(random.choices("KZ", k=100))
number_of_streaks = tosses.count(streaks)
Re: Automate the boring stuff with python
Verfasst: Sonntag 27. September 2020, 19:44
von namyelusbig
Danke erstmal für deine Hilfe, ich habe deinen Code mal eingesetzt und so wie ich den Code verstanden habe brauche ich dann auch gar keine Schleife mehr, da "random.choices("KZ", k=100)" jetzt 100 mal eine Kombination von K und Z erstellt oder?
Außerdem wird keine Liste erstellt in der die Zeichen gespeichert werden sondern die Zeichen werden einfach in der Variable tosses gespeichert und das glaube ich dann als ein einzigen String, da du vor .join "" gesetzt hast?!
Deine Lösung ist natürlich optimal denke ich aber wie soll ich als Anfänger auf so eine komprimierte Lösung kommen, wobei deine Vorgehensweise glaube ich auch nicht so vom Autor gefordert ist. In diesen Hashtags steht ja theoretisch wie die Lösung aussehen soll, kennst du eine Möglichkeit das vielleicht "umständlicher" zu lösen wie das erwartet wird?
Nochmal vielen Dank für deine Hilfe. Ich muss schon sagen so intuitiv auf die Lösung zu kommen ist gar nicht mal so leicht als Anfänger.
Re: Automate the boring stuff with python
Verfasst: Sonntag 27. September 2020, 19:51
von Sirius3
Was heißt hier "nicht so leicht für Anfänger"? Auch Anfänger können die Dokumentation lesen, und da ist random.choice ganz weit oben für das zufällige Auswählen eines Elements. Und natürlich kann man choices auch in einer Schleife 100 mal aufrufen.
Wie man eine Liste mit Strings zu einem String zusammenbaut ist auch ganz zu Anfang von den meisten Tutorials zu Strings beschrieben.
Re: Automate the boring stuff with python
Verfasst: Sonntag 27. September 2020, 20:24
von nezzcarth
namyelusbig hat geschrieben: Sonntag 27. September 2020, 19:44
Deine Lösung ist natürlich optimal denke ich aber wie soll ich als Anfänger auf so eine komprimierte Lösung kommen, wobei deine Vorgehensweise glaube ich auch nicht so vom Autor gefordert ist.
Ich habe das Buch nicht gelesen, aber
an der entsprechenden Stelle verwendet der Autor eine Variante zur Stringformatierung, die eigentlich inzwischen überholt ist und verwendet (laut Vorwort absichtlich) camelCase für Variablen, obwohl das bei Python absolut unüblich ist. Auch vor dem Hintergrund würde ich das zumindest etwas locker sehen, was der Autor "fordert"; Sirius3 hat gezeigt, wie man die Aufg pythonisch umsetzt.
Re: Automate the boring stuff with python
Verfasst: Sonntag 27. September 2020, 21:16
von Sirius3
Das seh ich jetzt erst mit den vielen %-Zeichen. Ist in dem Fall ja total unleserlich.
Code: Alles auswählen
print(f"Chance of streak: {number_of_streaks/10000:%}")
Re: Automate the boring stuff with python
Verfasst: Sonntag 27. September 2020, 22:17
von __blackjack__
`join()` wird in der ersten Auflage von dem Buch im ersten Teil („Python Programming Basisc“) auf Seite 131/132 beschrieben. Zusammen mit dem Gegenstück `split()`.
So besonders gut ist das Buch IMHO nicht. Man lernt Grundlagen von prozeduralem Programmieren, aber nicht wirklich Python. Es steht viel Code auf Modulebene. Immerhin wird das ``global``-Schlüsselwort nicht in den Projekten verwendet. Dann hätte man sich in der Einführung aber auch die Vorstellung davon sparen können.
Zeichenketten und Werte werden sehr oft mit `str()` und ``+`` zusammengestückelt. Selten mal mit dem ``%``-Operator. Nie wird die `format()`-Methode verwendet. (Stand der ersten Ausgabe ist Python 3.4, deshalb natürlich keine f-Zeichenkettenliterale.)
Dann der Satz „A common Python technique is to use range(len(someList)) with a for loop to iterate over the indexes of a list.“ Naja klar, es werden natürlich keine Iteratoren erklärt. Das wäre ja schon zu kompliziert.
Da werden durchaus komplexere Sachen gemacht, mit interessanten Modulen von Drittanbietern, aber der ”eigene” Code ist auf dem Niveau von einer Sprache wie QBasic festgenagelt.
Die Aufgabe finde ich in der ersten Auflage nicht. Das einzige was dort mit Münzwürfen vorkommt ist im Kapitel zum IDLE-Debugger:
Code: Alles auswählen
import random
heads = 0
for i in range(1, 1001):
if random.randint(0, 1) == 1:
heads = heads + 1
if i == 500:
print('Halfway done!')
print('Heads came up ' + str(heads) + ' times.')
Und ein weiteres Program, in dem es die Aufgabe ist die Fehler zu finden:
Code: Alles auswählen
import random
guess = ''
while guess not in ('heads', 'tails'):
print('Guess the coin toss! Enter heads or tails:')
guess = input()
toss = random.randint(0, 1) # 0 is tails, 1 is heads
if toss == guess:
print('You got it!')
else:
print('Nope! Guess again!')
guesss = input()
if toss == guess:
print('You got it!')
else:
print('Nope. You are really bad at this game.')
Das Muster `print()` gefolgt von `input()` zieht sich übrigens durch das ganze Buch. Es wird nicht ein einziges mal `input()` mit einem Argument benutzt — der Text dazu wird grundsätzlich vorher per `print()` ausgegeben. Das scheint wirklich mit dem Vorsatz geschrieben worden zu sein „lass uns mal so wenig wie möglich von der Sprache benutzen.“
Re: Automate the boring stuff with python
Verfasst: Sonntag 27. September 2020, 22:34
von __blackjack__
Ich kann mich dunkel daran erinnern, dass das hier schon mal Thema war. Die Aufgabe ist ein bisschen unterspezifiziert, weil heisst „streak of 6 heads or tails in a row“ jetzt *genau* 6mal, also *nicht* 7 mal oder noch öfter, oder wäre das auch okay‽ Und ist das „or“ bei „heads or tails“ ein inklusives oder ein exklusives „oder“? Je nach dem wie man diese beiden Fragen beantwortet erhält man andere Ergebnisse.
Hier ist das Thema vom Juni:
Münzwurf-Generator.