Wo liegt der Fehler?

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.
iNoob
User
Beiträge: 10
Registriert: Sonntag 25. Juni 2023, 18:39

Würde gerne wissen was ich da falsch mache.

Bei der Ausgabe kommt immer nur das von else und nicht das von if,
selbst wenn die Eingabe, genau das Ergebnis ist.

Code: Alles auswählen

import random

# benötigte Variablen
a = random.randint(1,9)
b = random.randint(1,9)
ergebnis = a * b

# Aufgabe anzeigen
print(f"{a} * {b}")

# Lösungsversuch eingeben
eingabe = input("Wie lautet die Lösung? ")

# Eingabe auswerten
if ergebnis == eingabe:
    print("Die Lösung ist richtig!")
else:
    print(f"Die Lösung ist falsch! Richtig ist {ergebnis}.")

Vielen Dank im vorraus. Das jmd. sich die Zeit nimmt, mir das zu erklären, danke.
Benutzeravatar
__blackjack__
User
Beiträge: 14056
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@iNoob: `input()` liefert eine Zeichenkette, `ergebnis` ist eine Zahl. Die sind niemals gleich. Du musst die Eingabe in eine Zahl umwandeln vor dem Vergleich.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
iNoob
User
Beiträge: 10
Registriert: Sonntag 25. Juni 2023, 18:39

Achso daran hat es gelegen, vielen Dank.

Endlich funktioniert mein kleiner 1x1 Trainer :)
Benutzeravatar
__blackjack__
User
Beiträge: 14056
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Weitere Anmerkungen zum Quelltext: Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

Die Kommentare sind unnötig. Kommentare sollen dem Leser einen Mehrwert über den Code geben. Faustregel: Kommentare beschreiben nicht *was* der Code macht, denn das steht da bereits als Code, sondern warum er das macht. Sofern das nicht offensichtlich ist. Offensichtlich ist in aller Regel auch was in der Dokumentation von Python und den verwendeten Bibliotheken steht.

Der nächste Schritt wäre es dann das Programm robust gegen Fehleingaben zu machen, damit es nicht abbricht wenn der Benutzer etwas eingibt, was sich nicht in eine Zahl umwandeln lässt.

Code: Alles auswählen

#!/usr/bin/env python3
import random


def main():
    a = random.randint(1, 9)
    b = random.randint(1, 9)
    ergebnis = a * b

    print(f"{a} * {b}")
    while True:
        try:
            eingabe = int(input("Wie lautet die Lösung? "))
        except ValueError:
            print("Fehler: Bitte eine ganze Zahl eingeben!")
        else:
            break

    if ergebnis == eingabe:
        print("Die Lösung ist richtig!")
    else:
        print(f"Die Lösung ist falsch! Richtig ist {ergebnis}.")


if __name__ == "__main__":
    main()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
iNoob
User
Beiträge: 10
Registriert: Sonntag 25. Juni 2023, 18:39

Ok cool...

Das mit try and except habe ich schonmal gelesen, das werde ich umsetzen.

Aber das was du weiter unten geschrieben hast mit __name__ , ist mir neu.
Da muss ich mich erst tiefer in die Materie einlesen.


Zur Zeit sieht mein Code noch so aus:

Code: Alles auswählen

import random

eingabe = 'a'
punkte = 0

print("Willkommen bei deinem kleinen 1x1 Trainer.")
print()
print("Bei jeder richtigen Antwort, bekommst du einen Punkt.")
print("Wenn deine Antwort falsch ist, bekommst du einen Punkt abgezogen.")
print("Mit x kannst du das Programm beenden.")
print()
print("Und nun viel Spaß beim lernen ;)")
print()

while eingabe != 'x':
    
    a = random.randint(1,9)
    b = random.randint(1,9)
    ergebnis = a * b

    print(f"{a} * {b}")

    eingabe = input("Wie lautet die Lösung? ")

    if eingabe == 'x':
        print()
        break

    if ergebnis == int(eingabe):    # Die Eingabe muss vorher in int umgewandelt werden, da input immer einen string ausgibt
        print("Die Lösung ist richtig!")
        print()
        punkte += 1
    else:
        print(f"Die Lösung ist falsch! Richtig ist {ergebnis}.")
        print()
        punkte -= 1

if punkte == 1 or punkte == -1:       
    print(f"Du hast {punkte} Punkt erreicht.")
else:
    print(f"Du hast {punkte} Punkte erreicht.")
Benutzeravatar
__blackjack__
User
Beiträge: 14056
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@iNoob: Das `eingabe` in der ``while``-Bedingung verwendet wird macht keinen Sinn weil diese Bedingung an der Stelle *immer* wahr ist. In dem Fall das der Benutzer "x" eingibt, wird die Schleife ja bereits durch ein ``break`` verlassen. Da würde man einfach ``while True:`` schreiben. Und die Zuweisung an `eingabe` am Anfang fällt dann auch weg.

Alternative für die letzten vier Zeilen:

Code: Alles auswählen

print(f"Du hast {punkte} Punkt{'' if abs(punkte) == 1 else 'e'} erreicht.")
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
iNoob
User
Beiträge: 10
Registriert: Sonntag 25. Juni 2023, 18:39

Ok ! Finde deine Antworten sehr gut. Ich werde jedes mal ein wenig schlauer.

Ich habe meinen 1x1 Trainer nochmal überarbeitet.

Dieses mal mit dem try & except Abschnitt. Musste dabei aber immer das letzte else weglassen.
Weil sonst das Programm nach einer Aufgabe sich beenden hat.
(Obwohl ich gelesen habe, das man bei try & except das letzte else immer mitmachen muss/sollte)

Das mit der abs-Funktion ist praktisch.
Habe auch ein wenig mit den ersten zwei ' ' getestet. Dabei festgestellt das diese quasi als Platzhalter dienen.

Code: Alles auswählen

import random

print("Willkommen bei deinem kleinen 1x1 Trainer.")
print()
print("Bei jeder richtigen Antwort, bekommst du einen Punkt.")
print("Wenn deine Antwort falsch ist, bekommst du einen Punkt abgezogen.")
print("Mit x kannst du das Programm beenden.")
print()
print("Und nun viel Spaß beim lernen ;)")
print()

punkte = 0

while True:
    a = random.randint(1,9)
    b = random.randint(1,9)
    ergebnis = a * b

    print(f"{a} * {b}")
    
    eingabe = input("Wie lautet die Lösung? ")
    
    if eingabe == 'x':
        print()
        break
    
    try:
        if ergebnis == int(eingabe):    # Die Eingabe muss vorher in int umgewandelt werden, da input immer einen string ausgibt
            print("Die Lösung ist richtig!")
            print()
            punkte += 1
        else:
            print(f"Die Lösung ist falsch! Richtig ist {ergebnis}.")
            print()
            punkte -= 1
    except ValueError:
        print("Fehler: Bitte eine ganze Zahl eingeben, oder x um zu beenden!")
        print()
    #else:
        #break

print(f"Du hast {punkte} Punkt{'' if abs(punkte) == 1 else 'e'} erreicht.")
Benutzeravatar
__blackjack__
User
Beiträge: 14056
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@iNoob: ``break`` verlässt die aktuelle Schleife, und da es nur eine gibt in dem Programm, nämlich die, die das Stellen von Aufgaben wiederholt, wird die natürlich abgebrochen.

Grundsätzlich würde ich erst mal sagen der ``try``-Block ist zu lang. Der sollte möglichst klein sein, und nur den Teil umfassen bei dem der `ValueError` erwartet wird. Das ist der `int()`-Aufruf. Und den würde ich früher machen, getrennt von der Auswertung.

In jedem möglichen Programmfluss durch falsche Eingabe, korrektes Ergebnis, und falsches Ergebnis wird eine Leerzeile ausgegeben. Das könnte man *einmal* danach im Code machen, statt in jedem der drei Zweige.

Ungetestet:

Code: Alles auswählen

import random


def main():
    print("Willkommen bei deinem kleinen 1x1 Trainer.")
    print()
    print("Bei jeder richtigen Antwort, bekommst du einen Punkt.")
    print("Wenn deine Antwort falsch ist, bekommst du einen Punkt abgezogen.")
    print("Mit x kannst du das Programm beenden.")
    print()
    print("Und nun viel Spaß beim lernen ;)")
    print()

    punkte = 0

    while True:
        a = random.randint(1, 9)
        b = random.randint(1, 9)
        korrektes_ergebnis = a * b

        print(f"{a} * {b}")

        eingabe = input("Wie lautet die Lösung? ")
        
        if eingabe == "x":
            break

        try:
            ergebnis = int(eingabe)
        except ValueError:
            print(
                "Fehler: Bitte eine ganze Zahl eingeben, oder x um zu beenden!"
            )
        else:
            if korrektes_ergebnis == ergebnis:
                print("Die Lösung ist richtig!")
                punkte += 1
            else:
                print(
                    f"Die Lösung ist falsch! Richtig ist {korrektes_ergebnis}."
                )
                punkte -= 1

        print()

    print()
    print(f"Du hast {punkte} Punkt{'' if abs(punkte) == 1 else 'e'} erreicht.")


if __name__ == "__main__":
    main()
Stellt sich die Frage ob der Programmfluss so gewollt ist, dass bei einer Fehleingabe einfach die nächste Aufgabe gestellt wird. Ich würde da entweder die Eingabe solange wiederholen bis etwas korrektes eingegeben wurde, oder eine Fehleingabe auch mit einem Punktabzug bewerten.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
iNoob
User
Beiträge: 10
Registriert: Sonntag 25. Juni 2023, 18:39

Ui, das war mir beim testen nicht aufgefallen. Das bei einer falschen Eingabe eine neue Frage kommt^^
Das soll natürlich nicht so sein, danke.

Edit:
Habe deinen Code mal kopiert, um zu schauen was dabei raus kommt.
Da ändert sich bei einer Falscheingabe (also wenn man keine Zahl, oder x drückt) auch die Aufgabenstellung.
Benutzeravatar
Dennis89
User
Beiträge: 1556
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

ja, weil die Schleife von vorne begonnen wird und damit auch eine neue Aufgabenstellung erstellt wird.
Du musst nach dem die Aufgabe steht, die Eingabe prüfen und bei einer Fehleingabe sollte dann die Schleife nicht von vorne begonnen werden. Ich würde die Eingabe in einer Schleife prüfen und bei gültiger Eingabe die Schleife verlassen und der Code läuft dann in der aktuellen Schleife weiter.


Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
__blackjack__
User
Beiträge: 14056
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@iNoob: Mein Änderungen haben den Programmfluss absichtlich so beibehalten wie der in Deinem Code war. Die Frage ob das so sein sollte steht deshalb auch erst nach dem Quelltext. 🙂
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
Dennis89
User
Beiträge: 1556
Registriert: Freitag 11. Dezember 2020, 15:13

Upsi, hätte ich den letzten Satz auch gelesen, hätte ich mir meine Antwort sparen können. Die Lösung steht da ja schon drin 🤭
"When I got the music, I got a place to go" [Rancid, 1993]
iNoob
User
Beiträge: 10
Registriert: Sonntag 25. Juni 2023, 18:39

Guten Abend/Nacht...

Joa da werde ich mich mal probieren, an einer besseren Version :)
iNoob
User
Beiträge: 10
Registriert: Sonntag 25. Juni 2023, 18:39

So jetzt nach ca. 2 h später habe ich es immer noch nicht hinbekommen.

Die Eingabe in einer Schleife prüfen:
- Habe versucht den Try Block in eine Schleife zu stecken, weil dort ja überprüft wird ob die Eingabe richtig ist.
Da hängt sich das Programm auf.
Das selbe wenn ich direkt unter der Zeile mit der input eingabe die Schleife anfang.

Brauche da einen Tipp:
An welche Stelle sollte ich diese setzen?
Und wieder mit "while True"? Oder mit Bedingungen wie z.B. while eingabe == int(eingabe) or eingabe == 'x'
Ich stehe da voll auf dem Schlauch.


Und was ich auch nicht verstehe ist:
if korrektes_ergebnis == ergebnis:

- In dem Code von oben funktioniert das einwandfrei.
Aber sobald ich dieses in mein eigenen Code abwandel kommt eine Fehlermeldung.
Das diese Variable nicht definiert ist. (korrektes_ergebnis)
Wieso funktioniert sie dann, oben im Beispiel^^? Und wo wird diese definiert?


Vielleicht bin ich einfach auch zu müde dafür.
Gute Nacht zzZZzz
Benutzeravatar
Dennis89
User
Beiträge: 1556
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

du darfst gerne deinen Versuch, auch wenn er nicht funktioniert, hier als Code posten. Dann sieht man gleich wo man die Hilfe ansetzen kann.
Wenn der User unendlich viele Eingaben machen darf, dann eine "while True", wenn du die Eingabe begrenzen willst, dann eine "for"-Schleife.

"korrektes_ergebnis" wird in Zeile 19 definiert. Mehr kann ich leider nicht sagen, weil ich nicht sehe wo du das definiert hast und wo du das wieder abfragst.

Die Schleife könnte im ersten Schritt mal so aussehen:

Code: Alles auswählen

        while True:
            eingabe = input("Wie lautet die Lösung? ")
            if eingabe == "x":
                break
            try:
                ergebnis = int(eingabe)
                break
            except ValueError:
                print(
                    "Fehler: Bitte eine ganze Zahl eingeben, oder x um zu beenden!"
                )
Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
__blackjack__
User
Beiträge: 14056
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@iNoob: `korrektes_ergebnis` wird in der 3. Zeile in der ``while True:``-Schleife definiert, da wo ``korrektes_ergebnis = a * b`` steht.

Für die Wiederholung der Eingabe bis der Benutzer etwas sinnvollen eingegeben hat, ist die einfachste Veränderung die Eingabe und die Auswertung in eine ``while True:``-Schleife zu stecken, die nach der Auswertung mit ``break`` verlassen wird. Da hat man dann das Problem, dass das ``break`` im Falle der Eingabe von "x" nur noch diese innere Schleife verlässt und nicht mehr das Programm. Schnelle Lösung wäre es durch ``return`` zu ersetzen, damit die Funktion an der Stelle verlassen wird. Da aber am Programmende noch die Ausgabe der erspielten Punkte ausgegeben werden soll, muss man das in einen ``finally:``-Block stecken, damit es trotz ``return`` noch ausgeführt wird bevor die Hauptfunktion tatsächlich verlassen wird. Schön ist anders. Das sähe dann so aus (ungetestet):

Code: Alles auswählen

import random


def main():
    print("Willkommen bei deinem kleinen 1x1 Trainer.")
    print()
    print("Bei jeder richtigen Antwort, bekommst du einen Punkt.")
    print("Wenn deine Antwort falsch ist, bekommst du einen Punkt abgezogen.")
    print("Mit x kannst du das Programm beenden.")
    print()
    print("Und nun viel Spaß beim lernen ;)")
    print()

    punkte = 0
    try:  # <- Neu.  Siehe ``finally:``.
        while True:
            a = random.randint(1, 9)
            b = random.randint(1, 9)
            korrektes_ergebnis = a * b

            print(f"{a} * {b}")

            while True:
                eingabe = input("Wie lautet die Lösung? ")

                if eingabe == "x":
                    return  # <- War vorher ``break``.

                try:
                    ergebnis = int(eingabe)
                except ValueError:
                    print(
                        "Fehler: Bitte eine ganze Zahl eingeben, oder x um zu beenden!"
                    )
                else:
                    if if ergebnis == korrektes_ergebnis:
                        print("Die Lösung ist richtig!")
                        punkte += 1
                    else:
                        print(
                            f"Die Lösung ist falsch! Richtig ist {korrektes_ergebnis}."
                        )
                        punkte -= 1

                    break  # <- Neu, um die innere Schleife zu verlassen.

            print()

    finally:  # <- Neu, damit die Ausgabe trotz ``return`` erfolgt.
        print()
        print(
            f"Du hast {punkte} Punkt{'' if abs(punkte) == 1 else 'e'} erreicht."
        )


if __name__ == "__main__":
    main()
Alternative zu dem ``try``/``finally`` wäre es die Ausgabe des Endpunktestands in der inneren Schleife direkt vor dem ``return`` zu machen. Macht den Code etwas einfacher, aber dafür steht das was am Ende des Programms passieren soll, dann nicht mehr am Ende der Funktion, sondern mittendrin.

Besser ist es die Eingabe von der Auswertung zu trennen. Also in der inneren Schleife nur die Eingabe solange zu wiederholen bis der Benutzer entweder eine gültige Zahl eingegeben hat, oder "x". In dem Fall könnte man `eingabe` den Wert `None` zuordnen statt die Hauptfunktion direkt zu verlassen, und darauf ausserhalb der inneren Schleife noch mal zu testen und gegebenfalls, dann die äussere Schleife mit ``break`` zu verlassen.

Ungetestet:

Code: Alles auswählen

import random


def main():
    print("Willkommen bei deinem kleinen 1x1 Trainer.")
    print()
    print("Bei jeder richtigen Antwort, bekommst du einen Punkt.")
    print("Wenn deine Antwort falsch ist, bekommst du einen Punkt abgezogen.")
    print("Mit x kannst du das Programm beenden.")
    print()
    print("Und nun viel Spaß beim lernen ;)")
    print()

    punkte = 0

    while True:
        a = random.randint(1, 9)
        b = random.randint(1, 9)
        korrektes_ergebnis = a * b

        print(f"{a} * {b}")

        while True:
            eingabe = input("Wie lautet die Lösung? ")

            if eingabe == "x":
                ergebnis = None
                break

            try:
                ergebnis = int(eingabe)
                break
            except ValueError:
                print(
                    "Fehler: Bitte eine ganze Zahl eingeben, oder x um zu beenden!"
                )

        if ergebnis is None:
            break

        if ergebnis == korrektes_ergebnis:
            print("Die Lösung ist richtig!")
            punkte += 1
        else:
            print(f"Die Lösung ist falsch! Richtig ist {korrektes_ergebnis}.")
            punkte -= 1

        print()

    print()
    print(f"Du hast {punkte} Punkt{'' if abs(punkte) == 1 else 'e'} erreicht.")


if __name__ == "__main__":
    main()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
iNoob
User
Beiträge: 10
Registriert: Sonntag 25. Juni 2023, 18:39

@_BlackJack_: Dein Code mit return funktioniert !

Ich habe selber noch an meinem Programm gebastelt und da lief nichts, wie erwartet.

Mir ist aber schon einiges aufgefallen in den letzten Tagen.

Ich nutze zum lernen Teils das Internet und Teils mein Buch, welches ich mir gekauft habe.
<Let's CODE> Python vom Rheinwerk Verlag

In diesem Buch wird eine eigene "Anfänger" IDE Namens TigerJython benutzt.
Diese IDE finde ich optisch gut aufgebaut.
ABER:
Es werden alle Datentypen automatisch umgewandelt.

Deswegen war meine erste Frage wieso mein Programm nicht funktioniert (ganz oben).
Nur durch Zufall entdeckt. Da ich an meinem alten Laptop sitze und dort nur mit der Idle-IDE von Python selbst schreibe.
Die ganze Zeit davor war ich am PC und da habe ich TigerJython genutzt, da war mir das nie aufgefallen.


Habe mir gedacht das ich die Lösung im Buch mal in die Python-IDE schreibe.
Siehe da es funktioniert nicht <- was zu erwarten war^^

Daher habe ich selbst noch bissel dranrum gewerkelt und nun funktioniert auch dieser Code.

Hier:

Code: Alles auswählen

import random

punkte = 0
fehler = 0
eingabe = 0

while (eingabe != "x"):
    zahl1 = random.randint(1,9)
    zahl2 = random.randint(1,9)
    loesung = zahl1 * zahl2
     
    while True:
        print(f"{zahl1} x {zahl2}")
       
        eingabe = input("Wie lautet die Lösung? ")
    
        if eingabe == "x":
            break
        if eingabe != "x":
            try:
                int(eingabe) == loesung
            except ValueError:
                print("Fehler: Bitte eine ganze Zahl eingeben, oder x um zu beenden.")
                print()
            else:
                if int(eingabe) == loesung:
                    print(f"Die Lösung ist richtig! {zahl1} x {zahl2} = {loesung}.")
                    punkte += 1
                    break
                else:
                    print(f"Leider falsch! {zahl1} x {zahl2} = {loesung}.")
                    fehler +=1
                    break
    
    print(f"OK. {punkte} Punkte und {fehler} Fehler.")
    print()

Fazit:
Ich muss noch vieles lernen :lol:

Vielleicht bekomme ich es noch hin das Programm in eine GUI zu packen.
Wollte diesen 1x1 Trainer nämlich für meine Nichte schreiben, damit sie das üben kann :mrgreen:
Benutzeravatar
__blackjack__
User
Beiträge: 14056
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@iNoob: Tiger-Jython basiert auf Jython und das ist immer noch bei Python 2.7. Da wird bei `input()` die Eingabe als Python-Ausdruck ausgewertet, im Kontext des Funktionsaufrufs. Also man könnte da ohne rechnen zu müssen immer die gleiche, richtige Antwort eingeben: zahl1 * zahl2

In Python 2/Tiger-Jython müsste man `raw_input()` statt `input()` verwenden.

Zum aktuellen Quelltext: ``while``-Schleifen bei denen man vorher eine Variable die in der Bedingung benötigt wird mit irgendeinem ”Dummy”-Wert belegen muss, weil der tatsächliche Wert erst *in* der Schleife zugewiesen wird, macht man nicht. Falls doch, dann sollte der Dummywert wenigstens den passenden (Duck)Typ haben. Also hier auch eine Zeichenkette sein, und keine Zahl (0). Oder `None` das mit jedem Typ ”kompatibel” ist. Da Python keine Syntax für eine nachprüfende Schleife hat, löst man das aber eigentlich idiomatisch mit einer Endlosschleife die mit ``break`` verlassen wird. Da haben wir hier allerdings das Problem, das der Punkt an dem das entschieden wird, selbst in einer inneren Schleife steht, also dort zwei verschachtelte Schleifen verlassen werden müssen. Das kann man wie schon gezeigt durch einen speziellen Wert für die Eingabe lösen, den man nach der inneren Schleife dann noch mal prüft.

Die Auswertung der Antwort nicht in der Schleife für die Eingabe zu machen, vereinfacht den Code, und ermöglicht es auch die Eingabe der Antwort in eine eigene Funktion heraus zu ziehen, wenn einem die Hauptfunktion zu unübersichtlich wird.

Das ``if eingabe != "x":`` ist unnötig, denn das ist garantiert *immer* wahr. Denn wäre `eingabe` gleich "x", dann kommt das Programm nicht zu diesem ``if``, da das ``if`` vorher die Schleife abbricht. Ausserdem wäre das auch sonst kein ``if`` mit einer genau umgekehrten Bedingung zum vorherigen ``if``, denn dafür gibt es ja ``else``.

Bei der Auswertung sind Wiederholungen die man als Programmierer vermeiden würde. Das Umwandeln in `int()` beispielsweise. Und das in beiden Zweigen am Ende ein ``break`` steht (was da sowieso nicht stehen müsste, wenn die Auswertung nicht in der inneren ``while``-Schleife stünde). Und eigentlich auch die Teilzeichenkette in der die Aufgabe + Lösung aufgebaut wird.

Wieder überarbeitet und ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
import random


def main():
    punkte = 0
    fehler = 0

    while True:
        zahl1 = random.randint(1, 9)
        zahl2 = random.randint(1, 9)
        loesung = zahl1 * zahl2

        print(f"{zahl1} × {zahl2}")

        while True:
            eingabe = input("Wie lautet die Lösung? ")

            if eingabe == "x":
                antwort = None
                break

            try:
                antwort = int(eingabe)
                break
            except ValueError:
                print(
                    "Fehler: Bitte eine ganze Zahl eingeben, oder x um zu"
                    " beenden.\n"
                )

        if antwort is None:
            break

        if antwort == loesung:
            ausgabe = "Die Lösung ist richtig!"
            punkte += 1
        else:
            ausgabe = "Leider falsch!"
            fehler += 1

        print(
            f"{ausgabe} {zahl1} × {zahl2} = {loesung}.\n"
            f"OK. {punkte} Punkte und {fehler} Fehler.\n"
        )


if __name__ == "__main__":
    main()
Für eine GUI muss man nicht nur Funktionen schreiben können, sondern für jede nicht-triviale GUI auch Klassen. Und selbst für sehr einfache GUI-Programme muss man `functools.partial()` verstehen und anwenden. Und der Programmfluss funktioniert komplett anders als prozeduraler Code mit ``if``/``else`` und Schleifen.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
iNoob
User
Beiträge: 10
Registriert: Sonntag 25. Juni 2023, 18:39

Aha alles klar.

Also kann ich das Buch eigl. vergessen, wenn das darin beschriebene in einer veralteten Python2.x Version geschrieben ist.


Gibt es den eine Internetseite, oder Buchempfehlung wo man das gleich von Anfang richtig lernen kann?
Benutzeravatar
Dennis89
User
Beiträge: 1556
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

ja gibt es:
https://docs.python.org/3/tutorial/index.html

Ansonsten ist dieses Forum meiner Meinung nach sehr hilfreich und hat mich schon durch Projekte begleitet und mich immer wieder in die richtige Richtung gelenkt 👍🏼

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Antworten