Seite 1 von 2
Script umschreibung oder anders verkürzen mit einer Formel
Verfasst: Dienstag 18. August 2020, 11:09
von Anton91
Guten Tag zusammen,
hat jemand eine Idee wie ich dieses Script mit einer Formel Schreiben kann ?
import time
def main():
maxSpeed = 50.00
actualSpeed = float(input("Höchstgeschwindigkeit 50.00 km/h. Wie schnell Waren Sie ? Geben Sie die Geschwindigkeit wie folgt an: z.B. (51.00) : "))
if actualSpeed <= maxSpeed + 4.99:
print ("Keine Sorge du warst zu langsam")
elif actualSpeed >= maxSpeed + 5.00 and actualSpeed <= maxSpeed + 9.99:
print("20€ Strafe!")
elif actualSpeed >= maxSpeed + 10.00 and actualSpeed <= maxSpeed + 14.99:
print ("40€ Strafe!")
elif actualSpeed >= maxSpeed + 15.00 and actualSpeed <= maxSpeed + 19.99:
print("60€ Strafe")
elif actualSpeed >= maxSpeed + 20.00 and actualSpeed <= maxSpeed + 24.99:
print("80€ Strafe")
elif actualSpeed >= maxSpeed + 25.00 and actualSpeed <= maxSpeed + 29.99:
print("100€ Strafe")
elif actualSpeed >= maxSpeed + 30.00:
print("Führerschein Entzug")
else:
print("Keine korrekte Eingabe!!!")
time.sleep(2.5)
main()
if __name__ == '__main__':
main()
Danke für die Hilfe im Vorraus
Beste Grüße
Andreas
Re: Script umschreibung oder anders verkürzen mit einer Formel
Verfasst: Dienstag 18. August 2020, 12:07
von sparrow
Du hast nur zwei Daten, die sich ändern: Die Höhe der Geschwindigkeitsübertretung und das Resultat. Das kannst du beides in einer Datenstruktur sammeln.
Hier ist vor kurzem etwas sehr ähnliches diskutiert worden.
Re: Script umschreibung oder anders verkürzen mit einer Formel
Verfasst: Dienstag 18. August 2020, 12:50
von __blackjack__
@Anton91: Der `main()`-Aufruf am Ende der `main()`-Funktion ist ein Fehler. Für Wiederholungen nimmt man Schleifen, die auch wirklich ”endlos” wiederholen, ohne das sie irgendwann in eine Ausnahme laufen.
Ein weiterer Fehler sind die x.99, weil das dazu führt das der Benutzer Eingaben mit drei Nachkommastellen machen kann, die innerhalb der Grenzen liegen, er aber trotzdem gesagt bekommt das die Eingabe nicht korrekt war, statt die entsprechende Strafe ausgegeben zu bekommen.
Statt da immer mit maxSpeed + irgendwas zu arbeiten, fände ich das lesbarer die Differenz auszurechnen und die dann gegen die verschiedenen Stufen zu vergleichen.
Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase). `maxSpeed` ist zudem eine Konstante und die werden am Modulanfang (oder in Klassen) definiert, und nicht in Funktionen (oder Methoden).
Daten sollte man nicht wiederholen, sondern nur an einer Stelle im Quelltext stehen haben. Wenn man die Höchstgeschwindigkeit mal ändern will/muss, darf man nicht vergessen neben der Konstanten auch den Text für die Eingabe zu ändern. Darum schreibt man dort die 50 nicht als Ziffern in die Zeichenkette sondern formatiert den Inhalt der Konstante in die Zeichenkette.
Zwischenstand (ungetestet):
Code: Alles auswählen
#!/usr/bin/env python3
MAX_SPEED = 50 # in km/h.
def main():
while True:
actual_speed = float(
input(
f"Höchstgeschwindigkeit {MAX_SPEED} km/h."
f" Wie schnell waren Sie?"
f" Geben Sie die Geschwindigkeit wie folgt an: z.B. (51) : "
)
)
speed_delta = actual_speed - MAX_SPEED
if speed_delta < 5:
print("Keine Sorge, Du warst langsam genug.")
elif speed_delta < 10:
print("20€ Strafe!")
elif speed_delta < 15:
print("40€ Strafe!")
elif speed_delta < 20:
print("60€ Strafe!")
elif speed_delta < 25:
print("80€ Strafe!")
elif speed_delta < 30:
print("100€ Strafe!")
else:
print("Führerscheinentzug")
if __name__ == '__main__':
main()
Da kann man jetzt die Hinweis von sparrow anwenden. Oder auch überlegen ob man den Strafbetrag nicht einfach ausrechnen kann, denn offensichtlich besteht da ja eine einfache lineare Beziehung zwischen Deltawert und Strafbetrag.
Re: Script umschreibung oder anders verkürzen mit einer Formel
Verfasst: Dienstag 18. August 2020, 12:52
von Jankie
Sonstige Anmerkungen:
- Wenn du Code im Forum postest ist es wichtig, dass dieser zwischen Codetags geschreiben wird (Im vollständigen Editor auf </>), weil sonst die Einrückung verloren geht, die bei Python essenziell ist.
- Das time.sleep() hat keinen Nutzen, außer dass es den Programmablauf in die Länge zieht.
- Die benötigte Datenstruktur für sparrows Vorschlag ist ein Dictionary
- Der main() Aufruf unter dem time.sleep() gehört da nicht hin, du hast das schon richtig in dem if __name__ == '__main__' Block.
Re: Script umschreibung oder anders verkürzen mit einer Formel
Verfasst: Dienstag 18. August 2020, 13:46
von Anton91
Danke für die Hilfe an alle mega besonders an __blackjack__.
Ich bin zurzeit Python am lernen aber komme alleine nicht so gut zu Recht.
Wie kann ich bei diesem Code von Blackjack, sagen bei Buchstaben oder Komma Zahlen (nicht punkt) "Bitte Schreibe die Geschwindigkeit wie Folgt: 55.00" und nicht das das Script abstürzt:
def main():
while True:
actual_speed = float(
input(
f"Höchstgeschwindigkeit {MAX_SPEED} km/h."
f" Wie schnell waren Sie?"
f" Geben Sie die Geschwindigkeit wie folgt an: z.B. (51) : "
)
)
speed_delta = actual_speed - MAX_SPEED
if speed_delta < 5:
print("Keine Sorge, Du warst langsam genug.")
elif speed_delta < 10:
print("20€ Strafe!")
elif speed_delta < 15:
print("40€ Strafe!")
elif speed_delta < 20:
print("60€ Strafe!")
elif speed_delta < 25:
print("80€ Strafe!")
elif speed_delta < 30:
print("100€ Strafe!")
else:
print("Führerscheinentzug")
if __name__ == '__main__':
main()
Re: Script umschreibung oder anders verkürzen mit einer Formel
Verfasst: Dienstag 18. August 2020, 14:14
von Jankie
Re: Script umschreibung oder anders verkürzen mit einer Formel
Verfasst: Dienstag 18. August 2020, 17:32
von tonikae
Das mit den vielen IF-Abfragen solltest du erst gar nicht anfangen, auch wenn
es einfach erscheint.Das kann sich nämlich ganz schnell ins Uferlose auswachsen
und verdammt unübersichtlich werden. Da hier aber ein linearer Zuwachs bei den
Grenzwerten vorhanden ist, kann man das auch in eine Liste mit einer Schleife packen
und hat nur eine einzige IF-Abfrage.
Bsp.
Code: Alles auswählen
def main():
stxt=['20€ Strafe!','40€ Strafe!','60€ Strafe!','80€ Strafe','100€ Strafe','Führerschein Entzug']
maxSpeed = 50.00
slevel=5.00
offset=9.99
actualSpeed = float(input("Höchstgeschwindigkeit 50.00 km/h. Wie schnell Waren Sie ? Geben Sie die Geschwindigkeit wie folgt an: z.B. (51.00) : "))
if actualSpeed <= maxSpeed + 4.99:
print ("Keine Sorge du warst zu langsam")
return
for a in stxt:
if actualSpeed>=maxSpeed+slevel and actualSpeed<=maxSpeed+offset:
print(a)
break
else: x=0
slevel=slevel+5
offset=offset+5
if __name__ == '__main__':
main()
Re: Script umschreibung oder anders verkürzen mit einer Formel
Verfasst: Dienstag 18. August 2020, 18:02
von sparrow
@tonikae: Das würde ich so nicht tun. Statt die Texte in eine Liste zu tun und auf diese dann halbmagisch zuzugreifen, bietet sich hier ein Wörterbuch an um gleich die Verbindung Geschwindkeitsübertretung->Strafe herzustellen. Die ist dann auch für den Leser des Codes sofort erkennbar.
Benenne Variablen immer sprechend, damit der Leser des Codes (also im Zweifelsfall du) immer sofort weiß, was sich dahinter verbirgt.
"stxt" ist ein schlechter Name für eine Variable. Ich weiß, das stxt eine Autovermietung am Flughafen in Miami ist, aber ob das jeder Leser sofot zuordnen kannn?
Das "return" im Rumpf der if-Bedingung erwartet man nicht. Wenn es zwei Möglichkeiten gibt, die eintreffen könenn, verwendet man if ... else
"a" ist ein schlechter Name für eine Variable.
Das else hätte gerne eine Zeile für sich.
Hinter das "print" gehört kein Leerzeichen.
Re: Script umschreibung oder anders verkürzen mit einer Formel
Verfasst: Mittwoch 19. August 2020, 06:52
von Jankie
Der
Vorschlag von sparrow, also mit einem Dictionary, könnte so aussehen (Code von __blackjack__ als Vorlage genutzt):
Code: Alles auswählen
MAX_SPEED = 50 # in km/h.
OVERSPEED_TO_PENALTY = {
5:"Keine Sorge, Du warst langsam genug.",
10:"20€ Strafe!",
15:"40€ Strafe!",
20:"60€ Strafe!",
25:"80€ Strafe!",
30:"100€ Strafe!"} #Keys sind "bis" zu welcher Geschwindkeitsüberschreitung (in km/h), nicht "ab" welcher Geschwindkeitsüberschreitung (in km/h)
def penalty_from_overspeed(speed_delta):
for speed, penalty in sorted(OVERSPEED_TO_PENALTY.items()):
if speed_delta <= speed:
return penalty
else:
return "Führerscheinentzug!"
def main():
while True:
actual_speed = float(
input(
f"Höchstgeschwindigkeit {MAX_SPEED} km/h."
f" Wie schnell waren Sie?"
f" Geben Sie die Geschwindigkeit wie folgt an: z.B. (51) : "
)
)
speed_delta = actual_speed - MAX_SPEED
penalty = penalty_from_overspeed(speed_delta)
print(f"Sie sind {speed_delta} km/h zu schnell gewesen, die Strafe ist: {penalty}")
if __name__ == '__main__':
main()
Re: Script umschreibung oder anders verkürzen mit einer Formel
Verfasst: Donnerstag 20. August 2020, 08:19
von Anton91
Hallo Toniake, danke für die schnelle Antwort. Das Sieht Super aus.
Wäre das Hier der Pseudocode dazu ?
-----------------------------------------------------------------------
geschwindgkeitsDifferenz = istGeschwindigkeit - sollGeschwindigkeit
anzahlStrafen = geschwindigkeitsDifferenz / 5
gesamtStrafe = anzahlStrafen * 10
=> Alle 5 km/h gibt es 10 € an Strafe
--------------------------------------------------------
so hast du das doch hier gelöst richtig ?
tonikae hat geschrieben: Dienstag 18. August 2020, 17:32
Das mit den vielen IF-Abfragen solltest du erst gar nicht anfangen, auch wenn
es einfach erscheint.Das kann sich nämlich ganz schnell ins Uferlose auswachsen
und verdammt unübersichtlich werden. Da hier aber ein linearer Zuwachs bei den
Grenzwerten vorhanden ist, kann man das auch in eine Liste mit einer Schleife packen
und hat nur eine einzige IF-Abfrage.
Bsp.
Code: Alles auswählen
def main():
stxt=['20€ Strafe!','40€ Strafe!','60€ Strafe!','80€ Strafe','100€ Strafe','Führerschein Entzug']
maxSpeed = 50.00
slevel=5.00
offset=9.99
actualSpeed = float(input("Höchstgeschwindigkeit 50.00 km/h. Wie schnell Waren Sie ? Geben Sie die Geschwindigkeit wie folgt an: z.B. (51.00) : "))
if actualSpeed <= maxSpeed + 4.99:
print ("Keine Sorge du warst zu langsam")
return
for a in stxt:
if actualSpeed>=maxSpeed+slevel and actualSpeed<=maxSpeed+offset:
print(a)
break
else: x=0
slevel=slevel+5
offset=offset+5
if __name__ == '__main__':
main()
Re: Script umschreibung oder anders verkürzen mit einer Formel
Verfasst: Donnerstag 20. August 2020, 08:27
von Anton91
Leider Fehlt da noch wie While schleife -.- ich krieg die nicht eingebaut -.-*
Re: Script umschreibung oder anders verkürzen mit einer Formel
Verfasst: Donnerstag 20. August 2020, 08:37
von Anton91
Wäre das so richtig ?
Beste Grüße Anton
Code: Alles auswählen
while True:
def main():
stxt=['20€ Strafe!','40€ Strafe!','60€ Strafe!','80€ Strafe','100€ Strafe','Führerschein Entzug']
maxSpeed = 50.00
slevel=5.00
offset=9.99
actualSpeed = float(input("Höchstgeschwindigkeit 50.00 km/h. Wie schnell Waren Sie ? Geben Sie die Geschwindigkeit wie folgt an: z.B. (51.00) : "))
if actualSpeed <= maxSpeed + 4.99:
print ("Keine Sorge du warst zu langsam")
return
for a in stxt:
if actualSpeed>=maxSpeed+slevel and actualSpeed<=maxSpeed+offset:
print(a)
break
else: x=0
slevel=slevel+5
offset=offset+5
if __name__ == '__main__':
main()
Re: Script umschreibung oder anders verkürzen mit einer Formel
Verfasst: Donnerstag 20. August 2020, 09:29
von Sirius3
@Anton91: eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht mal 1 mal 2 mal 4.
Benutze keine Abkürzungen, wenn Du strafentext meinst, dann schreib nicht stxt.
Variablennamen werden komplett klein geschrieben: max_speed
Was soll das `else: x=0`? x wird nirgends verwendet.
`a` ist ja noch ein schlechterer Name für einen Strafentext.
Jetzt hast Du wieder den Fehler mit der .99 drin, das wurde Dir doch schon erklärt.
Und nein, eine Funktionsdefinition oder gar das if-__name__ haben in einer while-Schleife nicht zu suchen.
Die while-Schleife soll wohl in ›main‹.
Re: Script umschreibung oder anders verkürzen mit einer Formel
Verfasst: Donnerstag 20. August 2020, 09:53
von tonikae
Die Variablen "a" "i" und "x" sind seit den1960er Jahren klassische Schleifenvaribalen.
Wer nicht mal das weiss...OMG
Hier wird sie nur verendet um den Text aus der Liste zu holen.
"stext" zu "Strafetext" zu erweitern ist für dich scheinbar auch schon viel verlangt, ob
es offensichtlich ist.
Und was eine Dummy-Variable ist (x=0) um eine Blindfunktion zu machen
Hast du dir schon mal überlegt dich mit etwas andernm zu beschäftigten als den
Oberlehrer zu spielen ?
Re: Script umschreibung oder anders verkürzen mit einer Formel
Verfasst: Donnerstag 20. August 2020, 09:58
von Jankie
Man iteriert in Python aber nicht mit einem Index über die Liste, sondern direkt über die Elemente der Liste, also wird da auch nichts gezählt und somit keine Zählervariable.
Es ist einfach lesbarer wenn dor steht "for text in straftexte:" statt "for a in stxt:"
Das else hättest du doch dann auch weg lassen können(?)
Hast du dir schon mal überlegt dich mit Python und Konventionen zu beschäftigten als den Oberbeleidigten zu spielen, nur weil VerbesserungsVÖRSCHLÄGE zu deinem Code kamen?
Re: Script umschreibung oder anders verkürzen mit einer Formel
Verfasst: Donnerstag 20. August 2020, 10:18
von Sirius3
@tonikae: im Moment weiß ich gerade nicht, wer hier oberlehrerhafter ist. Jedenfalls muß ich nicht beleidigend werden mit "OMG" oder "hast Du mal".
Wer keine Argumente auf seiner Seite hat, muß wohl ausfallend werden.
Also eine Reise zurück in die 1960er: damals wurden Programme noch auf Lochkarten geschrieben. Die Anzahl der Zeichen pro Zeile war stark begrenzt, und der Arbeitsspeicher ebenso. Meist gab es sogar nur wenige Register, a für Accumulator oder i für Index. Um Speicher zu sparen, und Vergleiche schneller zu machen, haben dann die ersten höheren Programmiersprachen oft auch nur die ersten 3 Zeichen eines Variablennamens verwendet, ABCTRALALA war also das selbe wie ABCDIDELDUM.
Klassische Schleifen waren dann auch immer Schleifen über ganze Zahlen, ähnlich dem Summenzeichen in der Mathematik, wo einbuchstabige Variablennamen üblich sind.
Zurück ins Jahr 2020: Klassische Schleifen gibt es in Python nicht, das sind immer Schleifen über komplexe Objekte. Es gibt keine Begrenzung auf wenige Zeichen, Speicherplatz ist kein Problem.
Der Computer ist nicht die limitierende Resource, sondern der Mensch. Nun können Menschen mit richtig geschriebenen Worten besser umgehen, als mit Abkürzungen. Habe ich jetzt Staftext mit st oder strftxt oder stext abgekürzt? Da ich faul bin (und Faulheit ist das oberste Ziel jedes Menschen) wende ich meine Gehirnleistung erst gar nicht dafür auf, mir Abkürzungen auszudenken.
Und Dein anderer Einwand ist hier ebenso fehl am Platz: weder eine Dummy-Variable noch eine Blindfunktion werden überhaupt gebraucht, weil man die Zeile einfach weglassen kann. Als Oberlehrer würde man noch schreiben, dass die "Blindfunktion" in Python "pass" ist. Aber Faulheit siegt, und man läßt es einfach weg.
Re: Script umschreibung oder anders verkürzen mit einer Formel
Verfasst: Donnerstag 20. August 2020, 10:45
von __blackjack__
@tonikae: Wenn man mit 200 km/h durch die 50er-Zone brettert, dann gibt Deine Funktion einfach gar nichts aus. Da sollte aber der Führerscheinentzug kommen.
Re: Script umschreibung oder anders verkürzen mit einer Formel
Verfasst: Donnerstag 20. August 2020, 13:17
von Anton91
Hallo Blackjack,
was müsste den hier noch rein wenn man höhere zahlen eingibt für den Führerschein entzug ?
Beste Grüße Anton
Code: Alles auswählen
while True:
def main():
strafen_text=['20€ Strafe!','40€ Strafe!','60€ Strafe!','80€ Strafe','100€ Strafe','Führerschein Entzug']
maxSpeed = 50.00
slevel=5.00
offset=9.99
actualSpeed = float(input("Höchstgeschwindigkeit 50.00 km/h. Wie schnell Waren Sie ? Geben Sie die Geschwindigkeit wie folgt an: z.B. (51.00) : "))
if actualSpeed <= maxSpeed + 4.99:
print ("Keine Sorge du warst zu langsam")
return
for a in strafen_text:
if actualSpeed>=maxSpeed+slevel and actualSpeed<=maxSpeed+offset:
print(a)
break
else: x=0
slevel=slevel+5
offset=offset+5
if __name__ == '__main__':
main()
__blackjack__ hat geschrieben: Donnerstag 20. August 2020, 10:45
@tonikae: Wenn man mit 200 km/h durch die 50er-Zone brettert, dann gibt Deine Funktion einfach gar nichts aus. Da sollte aber der Führerscheinentzug kommen.
Re: Script umschreibung oder anders verkürzen mit einer Formel
Verfasst: Donnerstag 20. August 2020, 13:27
von sparrow
@Anton91: Das offizielle
Tutorial ist ein guter Startpunkt um Python zu lernen.
Ansonsten hast du zu deinem Code bereits Hinweise erhalten, die du nicht umgesetzt hast. Warum sollte jemand deinen Code anfassen, wenn du gar keine Eigeninitiative zeigst?
Re: Script umschreibung oder anders verkürzen mit einer Formel
Verfasst: Sonntag 23. August 2020, 21:46
von __blackjack__
Strafe ausrechnen, ohne Schleife, in der grafischen Programmiersprache Snap!:
