Hilfe bei Bankfunktion!

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.
Antworten
timothy.one
User
Beiträge: 2
Registriert: Samstag 2. April 2011, 22:08

Bin gerade am Verzweifeln.

Ich versuche gerade eine Funktion einer Bank zu erstellen, ich sage ihm wieviel Geld ich habe, danach fordert er mich auf, etwas zu machen
in diesem Fall "abheben". Danach fragt er, wieviel ich von meinem Konto abheben möchte... Danach kommt eine Fehlermeldung.

Code: Alles auswählen

def konto():
	guthaben = raw_input("Wie lautet ihr Kontostand?")
	eingabe = raw_input("Was möchten Sie tun?")
	if (eingabe == "abheben"):
		wieviel = raw_input("Wieviel möchten Sie abheben?")
		guthaben = guthaben - wieviel
	print "Sie haben noch ,guthaben, Euro übrig!"
Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "<pyshell#141>", line 1, in <module>
    konto()
  File "<pyshell#140>", line 6, in konto
    guthaben = guthaben - wieviel
TypeError: unsupported operand type(s) for -: 'str' and 'str'
@@edit
Ausserhalb der Funktion klappt aber nur

Code: Alles auswählen

 guthaben - wieviel 
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Die Fehlermeldung sagt doch schon alles. Der für die Operanden des „-”-Operator sind Strings keine gültigen Typen. Offensichtlich versuchst du Strings voneinander abzuziehen.

Jetzt müsstest du dich fragen, warum hast du da Strings obwohl du doch Zahlen eingegeben hast. Da sollte jetzt dein nächster Gedanke der Doku zu raw_input gelten. Dort würdest du lesen, dass diese Funktion tatsächlich nur Strings zurückgibst. Damit kommen wir also zu deinem eigentlichen Problem: Wie macht man Strings zur Zahlen?

In dem Fall ist die Antwort: Nimm float (eingabe = float(raw_input(… ).

PS: Dein Post beinhaltet weder eine Bitte um Hilfe noch konkrete Frage. Was genau hast du da jetzt als Antwort erwartet? Ich habe jetzt einfach mal geraten was du willst.
timothy.one
User
Beiträge: 2
Registriert: Samstag 2. April 2011, 22:08

Ich wollte das das Problem gelöst wird, aber danke, dann werde ich mich beim nächsten Mal verständlicher ausdrücken ;)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Vielleicht noch einige generelle Anmerkungen:

- Es gibt spezielle Python-Code-Tags hier im Forum; damit wird der Code schön bunt eingefärbt

- Die Namensgebung ist unschön, genau wie der strukturelle Aufbau. Ein "Konto" tut ja nichts; eine Funktion bewirkt ja etwas. Alleine daran kann man schon vor dem Modellieren erahnen, dass Konto keine Funktion sein kann.

- Konto würde ich als Datenstruktur sehen. Lässt man Klassen außen vor, so könnte man sich z.B. eine Liste denken, in der Ein- und Auszahlungen als simple Integer-Werte eingetragen werden. Will man sich noch mehr Daten merken, etwa ein Datum, kann man die Einträge pro Buchung auch durch eine eigene Liste oder gar ein Dictionary ausdrücken.

Code: Alles auswählen

# in Cent
konto = [0, 1000, -500, 25000]
saldo = sum(konto)
# Oder komplexer [Betrag, Datum]
konto = [
    [0, '2011-04-02'],
    [1000, '2011-04-02'],
    [-500, '2011-04-03'],
    ...
]
Allerdings gelangt man dann schon bald an die Grenze, an der man so etwas mit Klassen eleganter ausdrücken kann.

- In der konto()-Funktion würde ich auch keine Eingaben durchführen. Schreib dafür lieber separate Funktionen! Damit trennst Du eine Aktion wie "Einzahlen" vom User Interface. Evtl. wird ja auch mal automatisch gebucht, ohne Benutzereingabe oder es wird über eine GUI gebucht, wo man eben kein raw_input() benutzt.

- Deine String-Konkatenierung klappt so nicht:

Code: Alles auswählen

# Deine falsche Variante
print "Sie haben noch ,guthaben, Euro übrig!"
# besser:
print "Sie haben noch {0} Euro übrig!".format(guthaben)
- "wieviel" ist auch kein doller Name ;-) Der Benutzer gibt doch einen "Betrag" ein (steht iirc doch auch auf Bankautomaten und nicht "wie viel wollen se denn?").

- Die Abfrage des Betrags sollte man auch logisch von der Auswahl der Aktion trennen! Zu diesem Thema gibt es zig Threads hier im Forum :-) Da Du im Moment keine Alternative anbietest, kann man zumindest erahnen, dass da noch mehr folgen soll. Also trenne das lieber auf und erledige die Abfrage in einer separaten Funktion:

Code: Alles auswählen

def handle_menu(konto):
    while True:
        choice = raw_input("Was möchten Sie erledigen?")
        if choice == "abheben":
            # Funktion, die einen Betrag erfragt und zurückliefert
            betrag = ask_betrag()
            # Hier eine Funktion aufrufen
            abheben(konto, betrag)
        elif choice == "einzahlen":
            # usw.
        else:
            print "Bitte nur gültige Möglichkeiten eingeben!"
Letztlich ist das eine elendige if...elif...else-Kaskade. Besser kann man das z.B. durch eine geeignete Datenstruktur wie ein Dictionary oder eine Liste erledigen. Beispiele gibt es u.a. in diesem Thread. Allerdings ist überhaupt eine Trennung zwischen Menüauswahl und den speziellen Aktionen schon ein Gewinn.

- Ich würde so ein Konto wohl auch eher in Cent berechnen. Bei Fließkommazahlen bekommst Du früher oder später Ungenauigkeiten rein. Alternativ kann man auch das decimal-Modul benutzen; aber für einen Anfänger am einfachsten dürften wohl Integerbeträge und daher Cents sein. (Bei der Ausgabe kann man das ja dann leicht in Euros formatieren)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

wobei man ein Konto und Kontofunktionen sehr schön (und einfach) in einer Klasse und deren Methoden abbilden kann.

Zum Üben eigentlich genau richtig.

BTW: Mein Lieblingpythonsbuch ("Python Essential Reference") verwendet genau so ein Beispiel, um Klassen und deren Methoden zu erklären. :-)

Gruß, noisefloor
Antworten