Seite 1 von 1
ganz simpler Kopfrechner
Verfasst: Freitag 20. November 2020, 12:33
von Sam123
Hallo,
ich bin ein Anfänger und wollte versuchen, einen ganz einfachen Kopfrechner zu programmieren.
Leider zeigt er immer an, dass meine Eingabe falsch ist. Woran liegt das?
Code: Alles auswählen
import random
zahl1 = random.randint(1,101)
zahl2 = random.randint(1,101)
ergebnis = zahl1 + zahl2
print(str(zahl1) + " + " + str(zahl2) + " = ")
eingabe = input()
print("ERGEBNIS: " + str(ergebnis))
print("EINGABE: " + str(eingabe))
if eingabe == ergebnis:
print("IHRE EINGABE WAR RICHTIG!")
else:
print("IHRE EINGABE WAR FALSCH!")
Re: ganz simpler Kopfrechner
Verfasst: Freitag 20. November 2020, 12:44
von __deets__
Deine Eingabe ist ein String. Und du vergleichst den mit einer Zahl. Dabei kommt nichts sinnvolles rum. Wandel die Eingabe in eine Zahl.
Re: ganz simpler Kopfrechner
Verfasst: Freitag 20. November 2020, 14:17
von Sam123
Alles klar, Danke!
Re: ganz simpler Kopfrechner
Verfasst: Freitag 20. November 2020, 15:34
von __blackjack__
@Sam123: Bist Du sicher mit der 101 als Obergrenze? Die ist *inklusive*. Also anders als bei `random.randrange()` oder `range()`.
Zeichenketten und Werte mit `str()` und ``+`` zusammenstückeln ist eher BASIC denn Python. In Python gibt es dafür Zeichenkettenformatierung mit der `format()`-Methode oder f-Zeichenkettenliterale. Oder Du nutzt das `print()` mehrere Argumente entgegen nimmt und die selbst in Zeichenketten umwandelt und mit Leerzeichen getrennt ausgibt:
Code: Alles auswählen
print(str(zahl_1) + " + " + str(zahl_2) + " = ")
# <->
print(zahl_1, "+", zahl_2, "=")
Wobei Du hier vielleicht gar kein `print()` verwenden willst, sondern das lieber als Prompt bei `input()` verwendest. Da braucht man das dann als *ein* Argument.
Warum schreist Du den Benutzer an? Das ist unhöflich.
Ungetestet:
Code: Alles auswählen
#!/usr/bin/env python3
import random
def main():
zahl_1 = random.randint(1, 100)
zahl_2 = random.randint(1, 100)
ergebnis = zahl_1 + zahl_2
#
# TODO Fehleingaben ordentlich behandeln.
#
eingabe = int(input(f"{zahl_1} + {zahl_2} = "))
print("Ergebnis:", ergebnis)
print("Eingabe:", eingabe)
print(
"Ihre Eingabe war {}!".format(
"richtig" if eingabe == ergebnis else "falsch"
)
)
if __name__ == "__main__":
main()
Re: ganz simpler Kopfrechner
Verfasst: Freitag 20. November 2020, 19:47
von Sam123
Ist die erste Zeile einfach eine Kurzform der zweiten?
Code: Alles auswählen
eingabe = int(input(f"{zahl_1} + {zahl_2} = "))
eingabe = int(input("{0} + {1} = ".format(zahl_1, zahl_2)))
Re: ganz simpler Kopfrechner
Verfasst: Freitag 20. November 2020, 21:41
von bb1898
In einfachen Fällen wie diesem hier ja, aber nicht generell. Ein wichtiger Unterschied: für den f-String ("formatted string literal" in der Dokumentation) müssen die Werte der Variablen bekannt sein, wenn der String konstruiert wird. Du kannst nicht am Anfang Deines Programms schreiben
später die Werte vom Benutzer abholen und dann mit
ausgeben.
Du kannst Entsprechendes mit der format-Methode sehr wohl machen:
und dann später (vielleicht an verschiedenen Stellen im Programm, mit wechselnden Werten von zahl_1 und zahl_2):
Wenn Du verschiedene Teile einer Datenstruktur ausgeben willst (mehrere Attribute ein und derselben Klassen-Instanz, mehrere Werte aus einem Dictionary oder aus einer Liste o.ä.), dann lässt sich das mit format auch kürzer formulieren. Fälle, in denen f-Strings etwas können, was mit format nicht geht, sind mir andererseits noch nicht begegnet.
Re: ganz simpler Kopfrechner
Verfasst: Dienstag 24. November 2020, 11:12
von narpfel
Code: Alles auswählen
>>> foo = 42
>>> f"{foo = }"
'foo = 42'
>>> "{foo = }".format(foo=foo)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'foo = '
Re: ganz simpler Kopfrechner
Verfasst: Dienstag 24. November 2020, 11:38
von __blackjack__
@narpfel: Also bei mir funktioniert auch schon das erste nicht:
Code: Alles auswählen
In [119]: foo = 42
In [120]: f"{foo = }"
File "<fstring>", line 1
(foo = )
^
SyntaxError: invalid syntax
Re: ganz simpler Kopfrechner
Verfasst: Dienstag 24. November 2020, 11:49
von narpfel
@__blackjack__: Das ist
neu in Python 3.8.