Ergebnis eienr Schleife in Datei, oder Liste schreiben

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
schwedenmann
User
Beiträge: 42
Registriert: Sonntag 21. Oktober 2007, 13:38
Wohnort: Wegberg

Hallo

Folgender Codeschnipsel (zinseszinsrechnung)

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-
from __future__ import division
import decimal
import math
import os
import time
import sys
import subprocess
import string
import urllib2
import re
#Kn = Endkapital
#K = Startkapital
#p = Zinssatz in %
#n = Laufzeit in Jahren
#za = Zinsauszahlungen pro Jahr
# Inseszinsformel Kn = K * ((1 + (p/100*za)**n+za)
K = float(raw_input("Geben Sie das Startkapital ein: "))
n = int(raw_input("Geben Sie die Laufzeit in Jahren ein: "))
p = float(raw_input("Geben Sie den Zinsatz ein: "))
za = float(raw_input("Geben Sie Zinsauszahlungen pro Jahr ein: "))
# Formel für Zinseszins incl. mehrmalige Zinszahlungen pro Jahr
Kn = K * (1 + p/(100*za))**(n*za)
print "Das Endkaptital ist", round (Kn, 2)
for n in range(0,n+1):
    Kn = K * (1 + p/(100*za))**(n*za)
    print n, round (Kn, 2)
Ausgabe sieht wie folgt aus
Geben Sie das Startkapital ein: 500
Geben Sie die Laufzeit in Jahren ein: 8
Geben Sie den Zinsatz ein: 5
Geben Sie Zinsauszahlungen pro Jahr ein: 4
Das Endkaptital ist 744.07
0 500.0
1 525.47
2 552.24
3 580.38
4 609.94
5 641.02
6 673.68
7 708.0
8 744.07
Jetz die Frage, wie bekomme ich die Zahlen aus der Schleife (Anzhal Jahre und entsprechendes Endkapital in eine Datei (text, csv), oder Liste gespeichert, ich meine die die ausgedruckte Tabele 0 .. 500,0 bis 8..744,07 ?
mfg
schwedenmann
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

schwedenmann hat geschrieben: Jetz die Frage, wie bekomme ich die Zahlen aus der Schleife (Anzhal Jahre und entsprechendes Endkapital in eine Datei (text, csv), oder Liste gespeichert, ich meine die die ausgedruckte Tabele 0 .. 500,0 bis 8..744,07 ?
Eine Liste ist eine Datenstruktur - eine Datei hat etwas mit Persistenz zu tun. Diese beiden Dinge haben genau gar nichts miteinander zu tun! Da musst Du schon mal präziser sein, was Du erreichen willst.

Generell kannst Du die Ausgabe eines Programms immer in eine (Text)Datei umleiten. Unter Linux geht das wie folgt:

Code: Alles auswählen

programm > output.txt
Unter Win sollte das ähnlich funktionieren.

Ansonsten kannst Du im Tutorial, in der Doku (Built-in Functions -> open) und in zig Threads hier erfahren, wie man eine Datei zum Schreiben öffnet und Daten hinein schreibt.

Natürlich kommt es dann noch darauf an, was damit später passieren soll. Wenn Du sie noch mal auswerten willst, bietet sich evtl. auch das `CSV`-Modul an. Doku und Beispiele dazu findet sich auch in der offiziellen Doku.

Kommt es Dir auch auf die Datenstruktur an, wäre evtl. noch `JSON` für Dich zu überlegen. Auch dazu existiert ein Modul in der Standard-Lib.

Willst Du das ganze unabhängig von der späteren Persistenz in einer Liste ablegen, so lies Dir doch mal das offizielle Tutorial durch. Das sind absolute Basics. Du suchst `list.append`.

Generell: Wozu sind da zig unnötige imports in Deinem Snippet drin? Wenn Du hier Code zeigst, dann bitte minimal!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@schwedenmann: Du scheinst `round()` für die Formatierung der Ausgabe zu missbrauchen — dafür benutzt man eigentlich eher Zeichenkettenformatierung mittels ``%``-Operator oder der `format()`-Methode auf Zeichenketten. Da kann man dann auch angeben, dass auch 0en angezeigt werden um immer genau zwei Nachkommastellen zu haben. Was man bei Geldbeträgen ja normalerweise erwartet.
schwedenmann
User
Beiträge: 42
Registriert: Sonntag 21. Oktober 2007, 13:38
Wohnort: Wegberg

Hallo


@Hyperion
Da musst Du schon mal präziser sein, was Du erreichen willst.
Ich möchte später die Daten aus der Schleife 8jahre, Endkapital pro Jahr) plotten, mit gnuplot oder mathlibplot (afaik import pylab)?? .

Das mit liste.append war mir schon klar, nur wo kommt der append-Ausdruck dann hin ?
Der Code Liste =[] käme ja dann vor die for-Schleife, aber würd dann dann Liste.append () stehen?

Klar kann ich unter Linux auch ein > Datei.txt machen, aber sowas geht doch mit Python auch.

@BlackJack
dafür benutzt man eigentlich eher Zeichenkettenformatierung mittels ``%``-Operator oder der `format()`-Methode auf Zeichenketten.
Rundet diese art der Formatierung denn auch korrekt auf oder ab, deshalb kam ich auf round().


mfg
schwedenmann
mfg
schwedenmann
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

schwedenmann hat geschrieben: Ich möchte später die Daten aus der Schleife 8jahre, Endkapital pro Jahr) plotten, mit gnuplot oder mathlibplot (afaik import pylab)?? .
Und wo brauchst Du da Persistenz? Das kapiere ich immer noch nicht!
schwedenmann hat geschrieben: Das mit liste.append war mir schon klar, nur wo kommt der append-Ausdruck dann hin ?
Der Code Liste =[] käme ja dann vor die for-Schleife, aber würd dann dann Liste.append () stehen?
Nenne es schon mal nicht "Liste"; erstens werden Namen klein geschrieben und zweitens baue den Datentypen nicht in den Namen rein, sondern wähle den Namen so, dass man weiß, was sich dahinter verbirgt. Also evtl. `capital_values` in diesem Falle.

Zum `append`: Wenn Dir schon klar war, dass es den Typen "Liste" gibt und Du die Methode `append` schon kanntest, dann frage ich mich doch, wieso Du das nicht erwähnt hast? Zudem ist das doch nun wirklich trivial. Überlege Dir an welcher Stelle Du etwas an die Liste hinzufügen möchtest und schreibe da den Ausdruck mit `append` hin :K
schwedenmann hat geschrieben: Klar kann ich unter Linux auch ein > Datei.txt machen, aber sowas geht doch mit Python auch.
Ja klar, hab Dir ja diverse Konzepte und Funktionen aus dem Umfeld genannt.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
schwedenmann
User
Beiträge: 42
Registriert: Sonntag 21. Oktober 2007, 13:38
Wohnort: Wegberg

@Hyperion
Und wo brauchst Du da Persistenz? Das kapiere ich immer noch nicht!
wie kann man den sonst Daten nach z.B. gnuplot, mathlibplot importieren ?
Es geht doch nur
a. die daten per Hand eintippen
b. Daten importieren (entweder txt, oder csv)

außerdem ist die plot-Lösung nur optional gedacht.
das ganze soll ein Zinseszins, Raten ud Darlehnrechenr weden, mit Plotfunktion, falls gewünscht.
Ist nur eine Übung für mich.
Das it .append hab ich jetzt so gelöst, ist aber m.M. nach nciht elegant, oder gar ökonomisch

Code: Alles auswählen

#Kn = Endkapital
#K = Startkapital
#p = Zinssatz in %
#n = Laufzeit in Jahren
#za = Zinsauszahlungen pro Jahr
# Inseszinsformel Kn = K * ((1 + (p/100*za)**n+za)
K = float(raw_input("Geben Sie das Startkapital ein: "))
n = int(raw_input("Geben Sie die Laufzeit in Jahren ein: "))
p = float(raw_input("Geben Sie den Zinsatz ein: "))
za = float(raw_input("Geben Sie Zinsauszahlungen pro Jahr ein: "))
# Formel für Zinseszins incl. mehrmalige Zinszahlungen pro Jahr
Kn = K * (1 + p/(100*za))**(n*za)
print "Das Endkaptital ist", round (Kn, 2)
Kapital = []
for n in range(0,n+1):
    Kn = round (K * (1 + p/(100*za))**(n*za), 2)
    print n, round (Kn, 2)
    Kapital.append(Kn)
#print Kapital
Jahre = []
for n in range(0,n+1):
    Kn = K * (1 + p/(100*za))**(n*za)
#    print n, round (Kn, 2)
    Jahre.append(n)
print Jahre, Kapital
geht das auch einfacher, als in 2 sepraten Schritten ? (ich meine das speichern in 2 listen ?
was wäre, denn um die werte weiterzuverarbeiten, die Beste, einfachste, rationalste methode (liste, Datei [pickle], CSV] ?

mfg
schwedenmann

P.S.
Ja klar, hab Dir ja diverse Konzepte und Funktionen aus dem Umfeld genannt.
In die Richtung hab ich gar nicht gedacht, da ich > datei.txt nur mit der shell in Verbindung bringe.
mfg
schwedenmann
BlackJack

@schwedenmann: Ich nehme mal an mit „mathlibplot“ meinst Du eigentlich `matplotlib`? Es gäbe da noch die Möglichkeit c. Daten die im Programm errechnet wurden ohne den Zwischenschritt sie in eine Datei zu schreiben zu plotten.

Du könntest übrigens die Namen so wählen, dass Du keine Kommentare brauchst um sie zu erklären. Statt `K` zum Beispiel `startkapital` und statt `n` beispielsweise `laufzeit`. Da kann dann vielleicht noch ein Kommentar zu geschrieben werden, dass die Angabe in Jahren ist, wenn man möchte.

Ausserdem solltest Du über Funktionen nachdenken statt die selbe nicht-triviale Formel drei mal in den Quelltext zu schreiben.

Man könnte auch *eine* Liste erstellen die als Elemente jeweils bei Angaben enthält. Zum Beispiel in einem Tupel zusammen gefasst. Allerdings ist die `Jahre`-Liste total von überflüssig und redundant. Und man bräuchte dort auch in der Schleife nicht wieder das Kapital ausrechnen — das hat doch überhaupt keinen Einfluss auf das `n`!? Schau Dir ausserdem mal an was die `range()`-Funktion als Ergebnis liefert. Damit wird die Schleife noch unsinniger. (Man hätte in der ersten Schleife auch besser `xrange()` verwendet.)

Auch mit zwei Listen ginge das natürlich auch in *einer* Schleife.

Apropos `n`: Das ist super unsauber das `n` einerseits für die Gesamtlaufzeit, und dann *gleichzeitig* als Laufvariable in den Schleifen zu verwenden. Das klappt nur mehr oder weniger zufällig, weil am Ende der Schleife wieder der ursprüngliche Wert an `n` gebunden wurde.

Für die Weiterverarbeitung kommt es darauf an wie und womit das passieren soll. Innerhalb eines Programms wäre eine Liste mit den Kapitalwerten nicht ungeeignet. Wohlgemerkt nur damit, ohne die Jahre, die ja implizit mit in der ersten Liste drin stecken. Intern könnte ich mir noch ein `xrange`-ähnliches Objekt vorstellen, oder dass man die Formel in eine Funktion steckt und sich dann mit `functools.partial()`, und `imap()` und `count()` aus `itertools()` ein Generator-Objekt bastelt.

Wenn externe Programme beteiligt sind, dann muss man halt schauen, wie die ihre Daten erwarten. Zum Beispiel CSV oder Excel für Tabellenkalkulationen.

Ob Zeichenkettenformatierung rundet oder einfach abschneidet kann ich Dir jetzt aus dem Kopf gar nicht sagen, ich weiss nur dass `round()` je nach Implementierung nicht unbedingt das macht, was man beim Finanzrechnen erwartet. Wenn Du da auf der sicheren Seite sein möchtest, musst Du schon etwas genauer sein und selbst etwas implementieren oder mal schauen was das `decimal`-Modul anbietet.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@schwedenmann:
Ganz allgemein zum Plot-"Problem": Wenn du eine Plot-Bibliothek nutzt, die du aus Python heraus direkt ansprechen kannst - und davon gibt es ein paar - dann kannst du der in der Regel auch Python Datentypen wie Listen oder Tuple übergeben, die dann geplottet werden.

Gruß, noisefloor
Antworten