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.
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
Ein Neuling
@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`.
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`.
- 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
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
-
- 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 ...
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 ...
@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')
@TomBombadil
Eigentlich macht man das doch mit der Zinseszinsformel:
Eigentlich macht man das doch mit der Zinseszinsformel:
Code: Alles auswählen
Kapital = 1000.0
Zinsen = 1.04
Jahre = 10
a = Kapital * Zinsen**Jahre
-
- 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,
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):
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.
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
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 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.
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.
-
- 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 ...
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 ...
- 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
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
Hallo Tom, willkommen bei Python!TomBombadil hat geschrieben: bin mittlerweile dabei, mich durch eines der unzähligen Python-Tutorials zu "schreiben".
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.
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.