Seite 1 von 1

Ein Neuling

Verfasst: Sonntag 26. November 2017, 17:45
von TomBombadil
Hallöchen,
ich habe gerade erst mit Python und mit Programmiersprachen generell angefangen und bin mittlerweile dabei, mich durch eines der unzähligen Python-Tutorials zu "schreiben".
Eine Aufgabe war es, einen kleinen Rechner für Zinsen zu schreiben. Mein Code:

import sys
def Kapital_rechner():
print('Gib bitte dein Kapital an.')
Kapital = float(sys.stdin.readline())
print()
print('Gib bitte die Jahre ein: ')
Jahre = int(sys.stdin.readline())
print()
print('Gib bitte den Zinssatz an: ')
Zinsen = float(sys.stdin.readline())
for X in range(1, Jahre + 1):
Euro_Zinsen = Kapital * Zinsen
print('In Jahr %s haben wir %s Kapital und erhalten %s Zinsen. Das sind %s Euro-Zinsen und ergibt eine Endsumme von %s.' % (X, Kapital, Zinsen, Euro_Zinsen, Kapital + Euro_Zinsen))
Kapital = Kapital * (1 + Zinsen)


Kapital_rechner()
input()

Bestimmt nicht sonderlich hübsch ... mir fällt auch gerade auf, dass die Ausgabe ziemlich dämlich formuliert ist; ist mir gerade aber egal. :P

Zunächst hat das Programm bei mir nicht funktioniert, wenn ich Dezimalzahlen verwendete. Irgendwann hatte ich aber raus, dass ich evtl. float verwenden muss ...
Auch da gab es wieder Probleme: Jahre mussten augenscheinlich als ganze Zahl eingelesen werden. Ich wechselte also auf "Jahre = int(sys.stdin.readline())" und die Probleme verschwanden.
Ich vermute einfach mal, dass es mit range() zu tun hat. Dürfen da nur ganzzahlige Zahlen verwendet werden? Wieso ist das so? Und gibt es eine Möglichkeit, diese Limitierung zu umgehen.

Ansonsten freue ich mich, hier zu sein.

Grüße

Tom

Re: Ein Neuling

Verfasst: Sonntag 26. November 2017, 18:12
von Sirius3
@TomBombadil: Im Forum gibt es eine Dropdown-Box »Code auswählen« um Code zu posten.
Statt `sys.stdin.readline()` nimmt man normalerweise einfach `input()`. Was willst Du bei `range` mit Kommazahlen? Etwa eine Schleife 2,5-mal durchlaufen? Warum berechnest Du das neue `Kapital` zweimal, auf unterschiedliche Art und Weise? `X` ist ein schlechter Name für `jahr`.

Re: Ein Neuling

Verfasst: Sonntag 26. November 2017, 18:29
von noisefloor
Hallo,

wenn das aktuelle Tutorial, dass du liest, wirklich an dieser Stelle`sys.stdin.readline()` verwendet -> leg' das Tutorial weg und vergiß es. Den Grund hat Sirius3 ja schon genannt.

Das empfehlenswerte Tutorial schlechthin ist das offizielle Python-Tutorial, welches in der offiziellen Python-Doku zu finden ist.

Wenn man mit Geldbeträgen rechnet, ist es in der Regel sinnvoll, das decimal-Modul aus Python zu verwendet. Dann vermeidet man Hardware-bedingte Rundungsfehler. Beim Programmieren üben vielleicht egal, in der Buchhaltung aber nicht ;-)

Gruß, noisefloor

Re: Ein Neuling

Verfasst: Sonntag 26. November 2017, 18:32
von TomBombadil
Bzgl. range: Stimmt, da habe ich einen Denkfehler gemacht. Ist mir zu spät aufgefallen. Entschuldigung.

Naja, wenn ich es richtig sehe, lasse ich einmal das Kapital am Anfang "Kapital" ausgeben und anschließend das komplette Kapital am Ende des Jahres (Anfangskapital und Zinsen). Damit meine Rechnung in der nächsten Schleife auch noch richtig ist, brauche ich aber doch den Endbestand des Jahres, damit die Zinsen richtig berechnet werden.
Würde ich den Endbestand schon vorher mit Kapital = ... ausrechnen, könnte ich den in meiner Ausgabe nicht mehr verwenden, weil er schon den Endbestand des ersten Jahres gespeichert hätte ...

Re: Ein Neuling

Verfasst: Sonntag 26. November 2017, 19:02
von __deets__
@noisefloor deine Ausführungen zu rundungsfehlern sind so nicht richtig. Denn die treten immer auf. Allerdings sind die buchhalterischen rundungsregeln zum Umgang mit eben diesen Fehlern halt auf dezimale zahlen Darstellung gemünzt.

Code: Alles auswählen

>>> import decimal as d
>>> a = d.Decimal("1")
>>> b = d.Decimal("3")
>>> a / b
Decimal('0.3333333333333333333333333333')

Re: Ein Neuling

Verfasst: Sonntag 26. November 2017, 19:06
von __deets__
@TomBombadil

Eigentlich macht man das doch mit der Zinseszinsformel:

Code: Alles auswählen

Kapital = 1000.0
Zinsen = 1.04
Jahre = 10
a = Kapital * Zinsen**Jahre

Re: Ein Neuling

Verfasst: Sonntag 26. November 2017, 19:26
von TomBombadil
Hallo,
ja, stimmt schon. Allerdings war ich mit dem Code so beschäftigt, dass ich mich nicht auch noch mit mathematischen Feinheiten rumschlagen wollte, sondern erstmal nur ein passendes Ergebnis ausgespuckt bekommen wollte. :)

Äh, wie verwende ich das Dezimal-Modul denn?
Ich habe zwar decimal importiert,

Code: Alles auswählen

import decimal
allerdings erschließt es sich mir jetzt nicht ganz, wie ich dieses denn anwende ...

Ich habe z. B. folgendes probiert, weil ich das beim schnellen googln gesehen habe (bzw. war es ein Teilstück):

Code: Alles auswählen

print('In Jahr %s haben wir %s Kapital und erhalten %s Zinsen. Das sind %s Euro-Zinsen und ergibt eine Endsumme von %s' % (X, Kapital, Zinsen, Euro_Zinsen, decimal.Decimal((Kapital * (1 + Zinsen))))))
Ich wollte das also wenigstens an einer Zahl ausprobieren, aber die wird nur noch länger ...

Ich finde das wirklich gut, dass mir hier so schnell geholfen wird, aber ich möchte anmerken (und bitten), dass ich mich mit Python (und dem Programmieren im Allgemeinen) gerade ~3 Stunden beschäftigt habe. Ich würde also darum bitten, dass ihr die Anwendung irgendwelcher Module evtl. ein wenig ausführlicher erklärt, wenn es nicht zu viel Mühe macht.

Re: Ein Neuling

Verfasst: Sonntag 26. November 2017, 20:23
von __deets__
Das decimal-Modul kannst du denke ich erstmal vergessen - das waere wichtig, wenn das hier um echte Finanzmathematik angeht. Und was das beschreiben von Modulen angeht - da kann ich nur empfehlen dir die dazugehoerige Dokumentation durchzulesen. Natuerlich kannst du da gerne Fragen stellen, wenn du etwas nicht verstehst, aber zu erwarten, dass wir hier prophylaktisch einfach mal alles durchdeklinieren ist etwas viel des guten.

Re: Ein Neuling

Verfasst: Sonntag 26. November 2017, 20:40
von TomBombadil
Oh, nein. Ernsthaft ist da gar nichts. Das war einfach nur ein kleines Programm, weil ich Lust drauf hatte.

Natürlich erwarte ich nicht, dass mir alles durchdekliniert wird, aber von einem Neuling, der dies auch recht offen kommuniziert, kann ich nicht erwarten, dass es reicht, wenn ich ihm ein Stichwort hinwerfe und er dann alles gebacken bekommt.

Als Lehrer kann ich auch nicht einfach "Nullpunkte" an die Tafel schreiben und die Schüler werden schon wissen, was sie machen sollen.
Ja, das Beispiel hinkt ... ;)

Re: Ein Neuling

Verfasst: Sonntag 26. November 2017, 20:44
von noisefloor
Hallo,

ich hatte das decimal-Modul prophylaktisch erwähnt, weil bei so Rechnungen später dann gerne mal die Frage nach der "Ungenauigkeit" des Ergebnisses kommt. Wenn du erst seit ein paar Stunden dabei bist, dann ist das Modul in der Tat erst Mal egal. Da gibt es genug andere Dinge (und Module), die wichtiger sind.

Gruß, noisefloor

Re: Ein Neuling

Verfasst: Montag 27. November 2017, 00:59
von Kebap
TomBombadil hat geschrieben: bin mittlerweile dabei, mich durch eines der unzähligen Python-Tutorials zu "schreiben".
Hallo Tom, willkommen bei Python!

Nochmal der Hinweis auf das offizielle Tutorial in der Python Dokumentation. Dies ist gut ausgearbeitet und über die Jahre gereift, deutlich besser als sich irgendwelche zusammengegoogelten Schnipsel oder gar gegenseitig widersprechende Tutorials von irgendwelchem Halbwissen verwirren zu lassen.

Frohes Ausprobieren weiterhin & bei konkreten Fragen nicht scheuen, hier wieder vorstellig zu werden. :)