Ein Neuling

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
TomBombadil
User
Beiträge: 14
Registriert: Sonntag 26. November 2017, 17:29

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
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@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`.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
TomBombadil
User
Beiträge: 14
Registriert: Sonntag 26. November 2017, 17:29

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 ...
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

@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')
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

@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
TomBombadil
User
Beiträge: 14
Registriert: Sonntag 26. November 2017, 17:29

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.
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
TomBombadil
User
Beiträge: 14
Registriert: Sonntag 26. November 2017, 17:29

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 ... ;)
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
Benutzeravatar
Kebap
User
Beiträge: 687
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

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. :)
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Antworten