Hilfe

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
michaelg
User
Beiträge: 4
Registriert: Montag 3. Dezember 2012, 12:22

Hallo Erstmal,
ich bin blutiger Anfänger (und das ist noch übertrieben).
Ich bin bei meinen ersten Versuchen mit Python und habe ein kleines Problem, und zwar möchte ich ein kleines Programm schreiben welches mir die Arbeit erleichter.
Das Programm soll die Vergütung einer Solaranlage mit unterschiedlichen kW zahlen berechnen und dieses mit den jeweiligen Vergütungssätzen aus Dezember 2012 und Januar 2013.
Nun zum Problem:
Wenn man die Wahl Dezember nimmt wird alles korrekt berechnet, nimmt man aber den Januar spuckt er immer diese Fehlermeldung aus
Bitte geben sie den Monat der Inbetriebnahme ein: 1 = Dezember , 2 = Januar
2
Bitte geben sie Ihre Anlagen größe ein:
12
Traceback (most recent call last):
File "C:\Users\Michael.Grotegers\Desktop\vergütung neu.py", line 27, in <module>
v2 = (((anlage - 10)*y1) + (10 * x1))/ anlage
TypeError: can't multiply sequence by non-int of type 'float'

obwohl ich alles so gemacht habe wie bei der Dezember auswahl.
hier der ganze Code.

Code: Alles auswählen

# Vergütung berechnen

x = 0.1745
y = 0.1656
z = 0.1477
x1 = 0,1702
y1 = 0,1614
z1 = 0,1440

print (" Bitte geben sie den Monat der Inbetriebnahme ein: 1 = Dezember , 2 = Januar ")

k = int (input())


print (" Bitte geben sie Ihre Anlagen größe ein: ")

anlage =  float (input())

if anlage <= 10 and k == 1:
    print(" Ihre Vergütung beträgt " , x , " Euro pro kWh")
elif anlage <= 10 and k == 2:
    print(" Ihre Vergütung beträgt " , x1 , " Euro pro kWh")
elif anlage <= 40 and  k == 1:
    v1 = (((anlage - 10)*y) + (10 * x))/ anlage
    print(" Ihre Vergütung beträgt " , v1 , " Euro pro kWh")
elif anlage <= 40 and  k == 2:
    v2 = (((anlage - 10)*y1) + (10 * x1))/ anlage
    print(" Ihre Vergütung beträgt " , v2 , " Euro pro kWh")
elif anlage <= 1000 and k == 1:
    v3 = ((10 * x ) + (30 * y) + ((anlage - 40)*z))/anlage
    print(" Ihre Vergütung beträgt " , v3 , " Euro pro kWh")
elif anlage <= 1000 and k == 2:
    v4 = ((10 * x1 ) + (30 * y1) + ((anlage - 40)*z1))/anlage
    print(" Ihre Vergütung beträgt " , v4 , " Euro pro kWh")




input (" zum beeden Taste drücken ")
Ich bitte um Hilfe !!!

p.s. aber bitte nicht nur eine Korrektur sondern auch warum es nicht geht schreiben ich will es ja auch verstehen.
Damit ich für das nächste mal bescheid weiß.
Zuletzt geändert von Anonymous am Montag 3. Dezember 2012, 12:41, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@michaelg: Du möchtest Dir die Typen von `x1`, `z1`, und `y1` anschauen. Das sind jeweils keine Zahlen.
michaelg
User
Beiträge: 4
Registriert: Montag 3. Dezember 2012, 12:22

Ahhhhhhhhhhhhhhh

Danke jetzt hab ich es auch gesehen.
Ich Trottel :oops:
BlackJack

@michaelg: Noch ein paar Anmerkungen:

Wenn man anfängt Namen durchzunummerieren, wie bei `x`, `y`, und `z`, dann ist das in der Regel ein Zeichen das man etwas falsch macht und eigentlich eine Liste verwenden möchte.

Bei `v1` bis `v4` hingegen besteht überhaupt keine Notwednigkeit die Namen zu nummerieren. Das könnte einfach immer `v` heissen.

`input()` kann man einen Text als Argument übergeben. Dann braucht man kein zusätzlich `print()` davor.

Der Quelltext enthält viele Wiederholungen. Das sollte man vermeiden. Daten und Code sollten nach Möglichkeit nur einmal geschrieben werden. Wenn man Code hat, der bis auf kleine Unterschiede gleich ist, dann sollte man die Unterschiede dort heraus ziehen und den Code zum Beispiel in eine Funktion stecken.

So wie es da steht skaliert das doch auch überhaupt nicht. Stell Dir mal vor wie der Quelltext aussieht wenn man den auf alle 12 Monate erweitert. Und dann stell Dir vor was für einen Aufwand es bedeuten würde den zu ändern, zum Beispiel den Text oder eine Rechnung etwas abändern zu müssen.

Was passiert eigentlich bei Anlagen >1000?
michaelg
User
Beiträge: 4
Registriert: Montag 3. Dezember 2012, 12:22

@BlackJack

Danke für die Tipp´s, aber wie ich schon gesagt habe fange ich gerade erst an überhaupt mit Programmieren.
Ich werde mir deine Ratschläge zu Gemüte führen und weiter experimentieren. Es wird bestimmt nicht das letstemal gewesen seien das ich Hilfe benötige =P.
Wenn ich das mit einer Funktion machen will, wie würde das ungefähr aussehen, bin beim Tutorial noch nicht soweit.
BlackJack

@michaelg: Wenn ich die Formeln richtig gelesen habe, dann ungefähr so:

Code: Alles auswählen

def verguetung_berechnen(anlage, x, y, z):
    if anlage <= 10:
        return x
    result = 10 * x
    if anlage <= 40:
        result += (anlage - 10) * y
    elif anlage <= 1000:
        result += 30 * y + (anlage - 40) * z
    else:
        raise ValueError('anlage >1000')
    return result / anlage
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Mal mein Ansatz einer stufenweisen Verbesserung des Codes (nicht getestet):

Code: Alles auswählen

k = int(input(" Bitte geben sie den Monat der Inbetriebnahme ein: 1 = Dezember , 2 = Januar: "))
anlage = float(input(" Bitte geben sie Ihre Anlagen größe ein: "))

# kurze Namen sind generell schlechter Stil
x = 0.1745, 0.1702
y = 0.1656, 0,1614
z = 0.1477, 0.1440

#erster schritt: if-else vereinfachen
if anlage <= 10:
    if k == 1:
        value = x[0]
    elif k == 2:
        value = x[1]

elif anlage <= 40:
    if k == 1:
        value = (((anlage-10)*y[0]) + (10 * x[0])) / anlage
    elif k == 2:
        value = (((anlage-10)*y[1]) + (10 * x[1]))/ anlage

elif anlage <= 1000:
    if k == 1:
        value = ((10 * x[0] ) + (30 * y[0]) + ((anlage - 40)*z[0]))/anlage
    elif k == 2:
        value = ((10 * x[1] ) + (30 * y[1]) + ((anlage - 40)*z[1]))/anlage

print(" Ihre Vergütung beträgt" , value , "Euro pro kWh")




#2. Berechnung vereinfachen

k = int(input(" Bitte geben sie den Monat der Inbetriebnahme ein: 1 = Dezember , 2 = Januar: "))
k -= 1
anlage = float(input(" Bitte geben sie Ihre Anlagen größe ein: "))

x = 0.1745, 0.1702
y = 0.1656, 0,1614
z = 0.1477, 0.1440

my_x = x[k]
my_y = y[k]
my_z = z[k]

if anlage <= 10:
    value = my_x

elif anlage <= 40:
    value = (((anlage-10)*my_y) + (10 * my_x)) / anlage

elif anlage <= 1000:
        value = ((10 * my_x ) + (30 * my_y) + ((anlage - 40)*my_z))/anlage

print(" Ihre Vergütung beträgt" , value , "Euro pro kWh")



#3. Anwenden des EVA-Prinzips
x = 0.1745, 0.1702
y = 0.1656, 0,1614
z = 0.1477, 0.1440

def get_input():
    k = int(input(" Bitte geben sie den Monat der Inbetriebnahme ein: 1 = Dezember , 2 = Januar: "))
    k -= 1
    anlage = float(input(" Bitte geben sie Ihre Anlagen größe ein: "))
    return k, anlage

def calculate_value(k, anlage):
    my_x = x[k]
    my_y = y[k]
    my_z = z[k]

    if anlage <= 10:
        value = my_x

    elif anlage <= 40:
        value = (((anlage-10)*my_y) + (10 * my_x)) / anlage

    elif anlage <= 1000:
        value = ((10 * my_x ) + (30 * my_y) + ((anlage - 40)*my_z))/anlage

    return value

def print_value(value):
    print(" Ihre Vergütung beträgt" , value , "Euro pro kWh")


def main():
    k, anlage = get_input()
    value = calculate_value(k, v)
    print_value(value)
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
michaelg
User
Beiträge: 4
Registriert: Montag 3. Dezember 2012, 12:22

Danke schon einmal,
werde mich nach Feierabend mal damit beschäftigen und im Tutorial weiter machen.
Naja es ist noch kein Meister vom Himmel gefallen :wink:
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Hier noch ein kompaktes Beispiel (Python 2) mit etwas anderer Datenstruktur:

Code: Alles auswählen

STAFFEL = ((0.1745, 0.1656, 0.1477), (0.1702, 0.1614, 0.1440))

def berechne_verguetung(staffel, groesse):
    if groesse <= 10:
        return staffel[0]
    vg10 = staffel[0] * 10
    if groesse <= 40:
        return (vg10 + (groesse - 10) * staffel[1])/groesse
    return (vg10 + staffel[1] * 30 + (groesse - 40) * staffel[2])/groesse

monat = int(input("Bitte geben sie den Monat der Inbetriebnahme ein: 1 = Dezember , 2 = Januar: "))
groesse = int(input("Bitte geben sie Ihre Anlagengroesse ein: "))
verguetung = berechne_verguetung(STAFFEL[monat-1], groesse)

print "Ihre Verguetung betraegt: %s Euro pro kWh." % verguetung
Zur Übung ließe sich noch die Ausgabe schöner machen, das ganze für Python 3 anpassen, oder die drei returns durch ein return ersetzen, so dass es nur einen Austrittspunkt gibt.
Antworten