Script neustarten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
Us0R
User
Beiträge: 9
Registriert: Samstag 12. Februar 2005, 21:49

Hallo
ich hab gestern angefangen mit Phyton zu programmieren und ich hab gleich ein Problem :-( also hier der Code:

Code: Alles auswählen

# Taschenrechner von Us0R
# -*- coding: cp1252 -*-
print "Whählen sie aus :"
def wahl():
    print '1. = " + ", 2. = " - ", 3. = " * ", 4. = " : "'
wahl()
d = input()
if(d == 1):
    print "Geben sie die erste Zahl ein"
    a = input()

    print "Geben sie die zweite Zahl ein"
    b = input()

    print "Das ergebnis ist :"
    print a + b
    
if(d == 2):
    print "Geben sie die erste Zahl ein"
    a = input()

    print "Geben sie die zweite Zahl ein"
    b = input()

    print "Das ergebnis ist :"
    print a - b
    
if(d == 3):
    print "Geben sie die erste Zahl ein"
    a = input()

    print "Geben sie die zweite Zahl ein"
    b = input()

    print "Das ergebnis ist :"
    print a * b
    
if(d == 4):
    print "Geben sie die erste Zahl ein"
    a = input()

    print "Geben sie die zweite Zahl ein"
    b = input()

    print "Das ergebnis ist :"
    print a / b

print "Drücken sie Irgendeine zum beenden"
c = input()
also zum Problem kann ich am ende denn Script neu starten wenn der Benutzer das will also ungefehr:
Wollen sie das Program beenden?(Y/N)
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi Us0R,

du kannst das ganze in eine Schleife packen:

Code: Alles auswählen

# Taschenrechner von Us0R
# -*- coding: cp1252 -*- 

def wahl():
    print '1. = " + ", 2. = " - ", 3. = " * ", 4. = " : "'

while True:
    print "Whählen sie aus :"
    wahl()
    d = input()
    if(d == 1):
        print "Geben sie die erste Zahl ein"
        a = input()
        ...

    print "Wollen sie das Program beenden?(Y/N)"
    a = input()
    if a.upper() == "Y":
        break
Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Benutzeravatar
Us0R
User
Beiträge: 9
Registriert: Samstag 12. Februar 2005, 21:49

Das geht aber nicht der schreibt ein Fehler kA was der bedeutet ^^
*** 'break' outside loop
XT@ngel
User
Beiträge: 255
Registriert: Dienstag 6. August 2002, 14:36
Kontaktdaten:

Hi,
Das war auch nur ein Beispiel, den ich glaub kaum das ... gültiger code ist ;)

Code: Alles auswählen

print "Geben sie die erste Zahl ein"
        a = input()
        ... 
MfG
Andreas
Benutzeravatar
Us0R
User
Beiträge: 9
Registriert: Samstag 12. Februar 2005, 21:49

Code: Alles auswählen

print "Wollen sie das Program beenden?(Y/N)"
    a = input()
    if a.upper() == "Y":
        break
Das meinte ich aber jetzt hab ichs kapiert ich hab das while fergessen
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Meine Schnelle, qnd (Quick and Dirty) Lösung:

Code: Alles auswählen

# Taschenrechner von Us0R
# -*- coding: cp1252 -*-

def wahl():
    print '1. = " + ", 2. = " - ", 3. = " * ", 4. = " : "'

while True:
    print "Wählen sie aus :"
    wahl()
    d = int(raw_input())
    print "Geben sie die erste Zahl ein"
    a = int(raw_input())
    print "Geben sie die zweite Zahl ein"
    b = int(raw_input())
    if d == 1:
        print "Das ergebnis ist :"
        print a + b

    print "Wollen sie das Program beenden?(Y/N)"
    a = raw_input()
    if a.upper() == "Y":
        break
Willkommen Us0r im Forum! Netter InuYasha Avatar :)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi Leonidas!

Kann man sich das int(raw_input()) nicht sparen, wenn man input() verwendet? Nur so ne Idee :wink:

Gruß, mawe
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hast recht, aber für "Wollen Sie ... verlassen..." sollte man raw_input() nehmen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Hans888
User
Beiträge: 44
Registriert: Montag 10. Juni 2024, 08:58

Mit Python3 sollte das heute so aussehen oder?

Code: Alles auswählen

# Taschenrechner von Us0R
# -*- coding: cp1252 -*-
print ("Wählen sie aus :")
def wahl():
    print ('1 = "Adition", 2 = "Subtraktion", 3 = "Multiplikation", 4 = "Division"')

while True:
    print("Wählen Sie aus: ")
    wahl()
    d = int(input("Ihre Wahl:"))
    a = int(input("Geben sie die erste Zahl ein: "))
    b = int(input("Geben sie die zweite Zahl ein: "))
    if(d == 1):
        print ("Das Ergebnis ist: ")
        print (a + b)
    if(d == 2):
        print ("Das Ergebnis ist: ")
        print (a - b)
    if(d == 3):
        print ("Das Ergebnis ist: ")
        print (a * b)
    if(d == 4):
        print ("Das Ergebnis ist: ")
        print (a / b)

    c= input("Wollen Sie das Programm beenden? (Y/N): ")
    if c.upper() == "Y":
        break
Sirius3
User
Beiträge: 18253
Registriert: Sonntag 21. Oktober 2012, 17:20

Dateien sollten immer mit utf8 codiert sein. Ausführbaren Code und Funktionsdefinitionen sollte man nicht mischen. Das "Wählen sie aus :" wird doppelt ausgegeben, so dass das erste print eh weg sollte.
Die Funktion `wahl` wählt gar nichts, sondern gibt nur die Auswahl aus. Funktionsnamen müssen präzise sein.
Funktionen sollten nicht wie Funktionen geschrieben sein, die Klammern können weg.
Wenn sich verschiedene if-Blöcke gegenseitig ausschließen, benutzt man am besten elif.
Warum sind alle Ausgaben in deutsch, das Programm wird aber mit "Y" beendet?

Jetzt könnte man das Programm noch um Eingabeverifizierung erweitern.
Hans888
User
Beiträge: 44
Registriert: Montag 10. Juni 2024, 08:58

Sirius3 hat geschrieben: Sonntag 30. Juni 2024, 11:19 Dateien sollten immer mit utf8 codiert sein. Ausführbaren Code und Funktionsdefinitionen sollte man nicht mischen. Das "Wählen sie aus :" wird doppelt ausgegeben, so dass das erste print eh weg sollte.
Die Funktion `wahl` wählt gar nichts, sondern gibt nur die Auswahl aus. Funktionsnamen müssen präzise sein.
Funktionen sollten nicht wie Funktionen geschrieben sein, die Klammern können weg.
Wenn sich verschiedene if-Blöcke gegenseitig ausschließen, benutzt man am besten elif.
Warum sind alle Ausgaben in deutsch, das Programm wird aber mit "Y" beendet?

Jetzt könnte man das Programm noch um Eingabeverifizierung erweitern.
Danke für die schnelle Rückantwort ich bin da kompletter Neuling und ich habe gedacht ich versuche mal das oben stehende alte in den Thread auf Python 3 umzustelln und funktionsfähig zu machen.
utf8 ist bei mir eingestellt ich habe da mit den Haschtack oben gar nicht so genau angeschaut ups^^
das erste print("Wählen SIe aus :") habe ich entfernt danke.
Das mit der Funktion Wahl wurde vom alten übernommen, danke für den Hinweis, mit der Funktion, man bruacht hier gar keine Funktion :)
Das am Schluss habe ich jetzt auch auf Deutsch J/N umgestellt, so dass es komplett in Deutsch ist.

Was ist mit einer Eingabevertifizierung gemeint?

Code: Alles auswählen

while True:
    print("Der Taschenrechner")
    print(" ")
    print("Wählen Sie aus: ")
    print ('1 = "Addition", 2 = "Subtraktion", 3 = "Multiplikation", 4 = "Division"')
    d = int(input("Ihre Wahl: "))
    a = int(input("Geben sie die erste Zahl ein: "))
    b = int(input("Geben sie die zweite Zahl ein: "))
    if(d == 1):
        print ("Das Ergebnis ist: ")
        print (a + b)
    elif(d == 2):
        print ("Das Ergebnis ist: ")
        print (a - b)
    elif(d == 3):
        print ("Das Ergebnis ist: ")
        print (a * b)
    elif(d == 4):
        print ("Das Ergebnis ist: ")
        print (a / b)

    c= input("Wollen Sie das Programm beenden? (J/N): ")
    print("")
    if c.upper() == "J":
        break

Sirius3
User
Beiträge: 18253
Registriert: Sonntag 21. Oktober 2012, 17:20

Bei der ersten Eingabe ist ja nur 1,2,3 oder 4 erlaubt, bei den zwei Zahlen nur Zahlen erlaubt. Wenn der Nutzer etwas anderes eingibt, dann passieren Fehler, die man abfangen sollte, oder es passiert gar nichts, was auf keinen Fall sein sollte.
Benutzeravatar
snafu
User
Beiträge: 6850
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Hier ein etwas robusterer Ansatz, der auch Kommazahlen erlaubt, allerdings in dieser Version in englischer/internationaler Schreibweise:

Code: Alles auswählen

#!/usr/bin/env python3
from operator import add, mul, sub, truediv

OPERATIONEN = {
    "Addition": add,
    "Subtraktion": sub,
    "Multiplikation": mul,
    "Division": truediv
}

def erfrage_wert(abfrage, eingabetyp):
    while True:
        try:
            return eingabetyp(input(abfrage))
        except ValueError:
            print("FEHLER: Ungültige Eingabe")

def erfrage_wahl(menüpunkte):
    for nr, name in enumerate(menüpunkte, 1):
        print(f"({nr})", name)
    while True:
        index = erfrage_wert("Ihre Auswahl: ", int) - 1
        if not 0 <= index < len(menüpunkte):
            print("FEHLER: Menüpunkt nicht vorhanden")
        else:
            return index, list(menüpunkte)[index]

def erfrage_zahlen():
    a = erfrage_wert("Geben sie die erste Zahl ein: ", float)
    b = erfrage_wert("Geben sie die zweite Zahl ein: ", float)
    return a, b

def berechne(a, b, operation):
    ergebnis = operation(a, b)
    ganzzahl = int(ergebnis)
    if ergebnis == ganzzahl:
        return ganzzahl
    return ergebnis

def main():
    while True:
        index, name = erfrage_wahl(OPERATIONEN)
        print("***", name, "***")
        a, b = erfrage_zahlen()
        operation = list(OPERATIONEN.values())[index]
        ergebnis = berechne(a, b, operation)
        print("Das Ergebnis ist:", ergebnis)
        if input("Wollen Sie das Programm beenden (j/n)? ").lower() == "j":
            break

if __name__ == "__main__":
    try:
        main()
    except (KeyboardInterrupt, EOFError):
        pass
Zuletzt geändert von snafu am Sonntag 30. Juni 2024, 12:41, insgesamt 2-mal geändert.
Benutzeravatar
snafu
User
Beiträge: 6850
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ich habe natürlich bewusst einen Fehler eingebaut, um zu zeigen, was passiert, wenn man hier float anstatt Decimal benutzt... *räuspert-sich* *keucht* *erstickt*
Benutzeravatar
snafu
User
Beiträge: 6850
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Nun versteht er auch deutsche Kommazahlen:

Code: Alles auswählen

#!/usr/bin/env python3
from decimal import Decimal
from locale import delocalize, LC_NUMERIC, localize, setlocale
from operator import add, mul, sub, truediv

OPERATIONEN = {
    "Addition": add,
    "Subtraktion": sub,
    "Multiplikation": mul,
    "Division": truediv
}

def erfrage_wert(abfrage, eingabetyp):
    while True:
        try:
            return eingabetyp(input(abfrage))
        except ValueError:
            print("FEHLER: Ungültige Eingabe")

def erfrage_wahl(menüpunkte):
    for nr, name in enumerate(menüpunkte, 1):
        print(f"({nr})", name)
    while True:
        index = erfrage_wert("Ihre Auswahl: ", int) - 1
        if not 0 <= index < len(menüpunkte):
            print("FEHLER: Menüpunkt nicht vorhanden")
        else:
            return index, list(menüpunkte)[index]

def kommazahl(string):
    try:
        return Decimal(string)
    except InvalidOperation:
        return Decimal(delocalize(string))

def erfrage_zahlen():
    a = erfrage_wert("Geben sie die erste Zahl ein: ", kommazahl)
    b = erfrage_wert("Geben sie die zweite Zahl ein: ", kommazahl)
    return a, b

def berechne(a, b, operation):
    ergebnis = operation(a, b)
    ganzzahl = int(ergebnis)
    if ergebnis == ganzzahl:
        return ganzzahl
    return ergebnis

def main():
    setlocale(LC_NUMERIC, "")
    while True:
        index, name = erfrage_wahl(OPERATIONEN)
        print()
        print("***", name, "***")
        a, b = erfrage_zahlen()
        operation = list(OPERATIONEN.values())[index]
        ergebnis = str(berechne(a, b, operation))
        print("Das Ergebnis ist:", localize(ergebnis))
        print()
        if input("Wollen Sie das Programm beenden (j/n)? ").lower() == "j":
            break

if __name__ == "__main__":
    try:
        main()
    except (KeyboardInterrupt, EOFError):
        pass
Die Ergebnisse sind immer in der deutschen Schreibweise (sofern eine deutsche Systemsprache eingestellt wurde). Die Eingaben sind standardisiert oder deutsch möglich. Dazu habe ich mich entschieden, weil das Handling von deutschen Eingaben im localize-Modul komisch ist. So wird 1,0 als 10 interpretiert. Vermutlich gibt es da bessere externe Lösungen (z. b. babel), aber ich wollte es jetzt mal dabei belassen.
Zuletzt geändert von snafu am Sonntag 30. Juni 2024, 13:25, insgesamt 1-mal geändert.
Hans888
User
Beiträge: 44
Registriert: Montag 10. Juni 2024, 08:58

@Sanfu
Der Code ist für mich, Stand jetzt noch zu komplex, da zu viele Sachen enthalten sind was ich noch gar nicht kenne :( Bin blutiger Anfänger.

Am Schluss beim Programm Beenden, wenn man irgendwas eingibt beginnt das Programm von vorne, sollte es da nicht auch heißen ungültige Eingabe?
Benutzeravatar
snafu
User
Beiträge: 6850
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Hans888 hat geschrieben: Sonntag 30. Juni 2024, 13:24 @Sanfu
Der Code ist für mich, Stand jetzt noch zu komplex, da zu viele Sachen enthalten sind was ich noch gar nicht kenne :( Bin blutiger Anfänger.
Dachte ich mir schon und wollte nur zeigen, wohin die Reise gehen könnte. Vielleicht kannst du dir jetzt oder in ein paar Wochen ja doch etwas abkupfern. ;)
Hans888 hat geschrieben: Sonntag 30. Juni 2024, 13:24 Am Schluss beim Programm Beenden, wenn man irgendwas eingibt beginnt das Programm von vorne, sollte es da nicht auch heißen ungültige Eingabe?
Könnte man natürlich einbauen. Wobei oft auch keine oder eine ungültige Eingabe als Standardwert interpretiert wird. An der Stelle wäre das Standardverhalten das Springen ins Menü. Ist aber nur meine Sichtweise. Zeig mir doch mal, wie man so eine Prüfung an der Stelle einbaut. :)
Sirius3
User
Beiträge: 18253
Registriert: Sonntag 21. Oktober 2012, 17:20

Um mehr Sicherheit zu bekommen, testet man sein Programm.
Teste mal die Eingaben "A", "B", "J".
Benutzeravatar
snafu
User
Beiträge: 6850
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Nochmal überarbeitet:

Code: Alles auswählen

#!/usr/bin/env python3
from decimal import Decimal, InvalidOperation
from operator import add, mul, sub, truediv

OPERATIONEN = {
    "Addition": add,
    "Subtraktion": sub,
    "Multiplikation": mul,
    "Division": truediv
}

EINGABEFEHLER = "FEHLER: Ungültige Eingabe"

def zeige_überschrift(text):
    print(f"\n{text.upper()}\n{'=' * len(text)}")

def erfrage_wert(abfrage, eingabetyp):
    while True:
        try:
            return eingabetyp(input(abfrage))
        except ValueError:
            print(EINGABEFEHLER)

def erfrage_wahl(menüpunkte):
    for nr, name in enumerate(menüpunkte, 1):
        print(f"({nr})", name)
    while True:
        index = erfrage_wert("Ihre Auswahl: ", int) - 1
        if not 0 <= index < len(menüpunkte):
            print("FEHLER: Menüpunkt nicht vorhanden")
        else:
            return index, list(menüpunkte)[index]

def kommazahl(string):
    try:
        return Decimal(string.replace(",", "."))
    except InvalidOperation:
        raise ValueError(string) from None

def erfrage_zahlen():
    a = erfrage_wert("Geben Sie die erste Zahl ein: ", kommazahl)
    b = erfrage_wert("Geben Sie die zweite Zahl ein: ", kommazahl)
    return a, b

def berechne(a, b, operation):
    ergebnis = operation(a, b)
    ganzzahl = int(ergebnis)
    if ergebnis == ganzzahl:
        return ganzzahl
    return ergebnis

def erfrage_ende(ja="j", nein="n"):
    abfrage = f"Wollen Sie das Programm beenden ({ja}/{nein})? "
    while (ende := erfrage_wert(abfrage, str.lower)) not in (ja, nein):
        print(EINGABEFEHLER)
    return ende == ja

def main():
    while True:
        zeige_überschrift("Hauptmenü")
        index, name = erfrage_wahl(OPERATIONEN)
        zeige_überschrift(name)
        a, b = erfrage_zahlen()
        operation = list(OPERATIONEN.values())[index]
        ergebnis = berechne(a, b, operation)
        print("Das Ergebnis ist:", str(ergebnis).replace(".", ","))
        if erfrage_ende():
            break

if __name__ == "__main__":
    try:
        main()
    except (KeyboardInterrupt, EOFError):
        pass
Die Internationalisierung von Zahlen finde ich - zumindest in der Standardbibliothek - etwas lächerlich. Daher habe ich ein stumpfes replace() eingebaut.
Hans888
User
Beiträge: 44
Registriert: Montag 10. Juni 2024, 08:58

@Sirius
A, B klappen aber J funktioniert nicht.
Ok ich schau mal weiter
Antworten