Steuerrechner

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.
Pacome
User
Beiträge: 18
Registriert: Montag 24. August 2015, 11:52

Schönen Tag,

habe mich nach 8 Jahren mal wieder an einen anfänger Kurs zum programmieren gemacht und verstehe einfach nicht warum meine elif Abfrage einen Syntax fehler ausspruckt.
Ich habe diesen code von python-kurs.eu koppiert und leider kann ich meine Fragen noch nicht selbst beantworten.
Ich hoffe nicht zu oft hier spammen zu müssen und würde mich über Feedback freuen.

Code: Alles auswählen

def steuern2013(einkommen):
    """Berechnung der zu zahlenden Steuern 2013
    fuer ein zu versteuerndes Einkommen von x"""
    if einkommen < 8130:
        steuer = 0
    elif einkommen <= 13469:
        y = (einkommen -8004.0)/10000.0
        steuer = (912.17 * y + 1400)*y
    elif einkommen <= 52881:
        z = (einkommen -13469.0)/10000.0
        steuer = (228.74 * z +2397.0)*z +1014.0
    elif einkommen < 250731:
        steuer = einkommen * 0.42 - 8239.0
    else:
        steuer = einkommen * 0.45 - 15718
    return steuer
Die Angaben sind ohne gewehr und sollen mir natürlich nur die IF schleife verständlich machen.

(In der 8 Zeile zeigt er mir am Ende von elif die Fehlermeldung.) Hier ist es wohl die Zeile 9.

Ich freue mich auf euer zutun.

Grüße,

Pacome
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@Pacome: erstmal die URL, auf der alles über if-Schleifen steht. Dann wäre es noch sinnvoll, wenn Du die Fehlermeldung komplett mit Traceback hier posten würdest, denn ich bekomme keinen Fehler.
BlackJack

@Pacome: Also ich sehe da keinen Syntaxfehler und sowohl Python 2 als auch Python 3 sind da der gleichen Meinung wie ich. :-)
Pacome
User
Beiträge: 18
Registriert: Montag 24. August 2015, 11:52

mhm..... danke für die URL! Leider ist mir nicht bekannt wie ich diesen Traceback aufrufe.

Code: Alles auswählen

File "einkommenssteuer", line 8
    elif einkommen <= 52881:
       ^
:K
Zuletzt geändert von Anonymous am Montag 24. August 2015, 12:27, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@Pacome: Der Traceback ist all das was mit der Zeile beginnt die mit dem Wort Traceback anfängt. Alles von da bis zum Ende welches Du uns hier gezeigt hast.

Edit: Wie kann das bei Dir in Zeile 8 stehen wenn das angeblich der Code ist den Du im ersten Beitrag zeigst? Denn genau wie die Zeilennumerierung hier im Forum fängt auch der Python-Interpreter an die Zeilen bei 1 zu zählen. Zeig also doch bitte mal den tatsächlichen Code den *Du* versuchst auszuführen.

Edit2: Und wie sieht die Zeile davor aus? Denn die Fehlermeldung bedeutet das dem Compiler an der Stelle aufgefallen ist das etwas nicht stimmt. Der eigentliche Fehler kann auch davor liegen. Zum Beispiel wenn die Klammerung davor nicht passt, kann es sein das der Compiler dann an der Stelle merkt, das dort syntaktisch kein ``elif`` kommen dürfte.
Pacome
User
Beiträge: 18
Registriert: Montag 24. August 2015, 11:52

@BlackJack
Also die Datei starte ich über die Bash mit dem befehl: python Dateiname.
Deshalb wird mir der Traceback vielleicht nicht ausgespuckt?

Was ich zuvor gepostet habe war die einzige Fehlermeldung die ich zu Gesicht bekommen habe, nachdem ich die Datei aufrufen wollte.
Ich habe leider noch nicht so viel Erfahrungen mit Linux, und kann deshalb nicht genau sagen woran es liegen kann keinen Traceback vor zu finden.
BlackJack

@Pacome: Okay, mein Fehler: Bei Syntaxfehlern steht da nicht Traceback davor. Bleibt immer noch die Frage nach dem *tatsächlichen* Quelltext den Du da hast.
Pacome
User
Beiträge: 18
Registriert: Montag 24. August 2015, 11:52

Code: Alles auswählen

def steuern(einkommen):
        """Berechnung der zu zahlenden Steuern fuer ein zu versteuerndes Einkom$
        if einkommen <= 8004:
                steuer = 0
        elif einkommen <= 13469:
                y = (einkommen -8004.0)/10000.0
                steuer = (912.17 * y # 1400)*y
        elif einkommen <= 52881:
                z = (einkommen -13469.0)/10000.0
                steuer = (228.74 * z #2397.0)*z +1038.0
        elif einkommen <= 250730:
                steuer = einkommen * 0.42 - 8172.0
        else:
                steuer = einkommen * 0.44 - 15694
        return steuer
Frag mich nicht warum ich es aus Nano raus kopieren musste um die Zeile 8 wirklich auf Zeile 8 vorzufinden -.-
Benutzeravatar
sparrow
User
Beiträge: 4144
Registriert: Freitag 17. April 2009, 10:28

und was genau macht die Raute "#" in Zeile 7 und 10?
Normalerweise leitet die ja einen Kommentar ein...
Das fällt übrigens mit Syntaxhighlighting recht schnell auf.
Pacome
User
Beiträge: 18
Registriert: Montag 24. August 2015, 11:52

@sparrow

das kann ich leider noch nicht beantworten, aber wenn ich diese Raute entferne, kommt bereits ein Syntax Fehler in der 7. Zeile

Grüße,
Benutzeravatar
sparrow
User
Beiträge: 4144
Registriert: Freitag 17. April 2009, 10:28

Dann vergleich doch einfach mal das was da bei dir steht, mit dem was da eigentlich stehen sollte.
Eine Raute außerhalb einer Zeichenkette leitet in Python einen Kommentar ein. Alles danach wird in der Zeile vom Interpreter ignoriert.
Für Python endet also die Zeile vor der Raute. Und dann ist da unter anderem eine offene Klammer, die nicht geschlossen wird.
Irgendwie muss die Raute da ja hin gekommen sein. Nur ist sie da halt falsch ;)
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@Pacome: woher kommt den der Code aus Deinem ersten Posting? Im jetzigen Zustand kommt da nämlich erst für die letzte Zeile die Fehlermeldung, dass ein String nicht abgeschlossen wurde und das liegt hier schon an Zeile 2.
Pacome
User
Beiträge: 18
Registriert: Montag 24. August 2015, 11:52

@sparrow

ich danke dir !!!
Habe es einfach nur mit einem plus vertauscht -.- gerade erst erfragt wie ich in der Bash etwas Kopiere und so weiter ^^
ich sollte etwas Essen gehen :) dann denkt es sich angenehmer! Bleibt nur noch zu klären warum in der Bash nichts passiert.

Ich geh mal davon aus das ich das Ende noch anpassen muss?

In dem letzten Script hatte ich diesen input befehl:
raw_input('press Return>')
Könnte ich sonst noch eine Alternative erfragen, oder ist das schon Spamm? x)

Edit: @Sirius3 der erste Code war wirklich aus dem Netz die Kopie..... die Seite ist folgende: http://www.python-kurs.eu/bedingte_anweisungen.php
Zuletzt geändert von Pacome am Montag 24. August 2015, 13:01, insgesamt 1-mal geändert.
BlackJack

@Pacome: Ausserdem hast Du die Anzeige von Nano hieher kopiert und nicht den gesamten Quelltext. Das sieht man ja auch recht deutlich an der Syntaxhervorhebung: Dadurch das Nano Zeilen die länger als die Terminalbreite sind mit einem $ beendet und den Rest einfach nicht anzeigt, wird bei dem gezeigten Quelltex der Docstring nicht beendet.

Ich weiss nicht ob Nano ein geeigneter Editor zum Programmieren ist. Syntaxhervorhebung ist schon sehr hilfreich um solche Fehler wie auskommentierte Codeteile oder nicht abgeschlossene Zeichenkettenliterale sehr einfach zu identifizieren.

So eine Anweisung die eine eigentlich sinnfreie Abfrage vom Benutzer am Ende haben will würde ich weglassen. Den Unsinn machen die Leute gerne unter Windows weil sie dort Konsolenprogramme schreiben die dann aber nicht so verwenden wie man Konsolenprogramme eigentlich verwenden sollte: In einer *vorhandenen* Konsole starten. Unter Linux macht das keinen Sinn.
Pacome
User
Beiträge: 18
Registriert: Montag 24. August 2015, 11:52

@BlackJack

Bleibt nur noch zu klären wie ich zugriff auf meinen Quelltext bekomme. Die Infos über Nano sind mir auch sehr Hilfreich :) danke dafür!
habe mir auch schon die Liste die hier zusammen gestellt wurde angesehen und werde mich noch für einen anderen Editor entscheiden: http://www.python-forum.de/viewtopic.php?f=21&t=3544

Ich hab deinen letzten Abschnitt zu meinem Sinnlosen Ende nicht ganz nachvollziehen können :)
Du willst mir die Lösung nicht vorgeben, das habe ich schon verstanden ^^ aber was meinst du mit *vorhandenen* Konsole bzw. wie verwende ich Konsolenprogramme richtig? Jetzt sag nicht in einer Konsole x) Ich bin doch noch ein Nub :(
Benutzeravatar
sparrow
User
Beiträge: 4144
Registriert: Freitag 17. April 2009, 10:28

@Pacome:
BlackJack meint damit, dass Windows-Benutzer Konsolenprogramme oft nicht in einer Konsole ausführen, sondern zum Beispiel mit einem Doppelklick starten.
Dann öffnet sich zwar auch eine Konsole, aber die verschwindet sobald das Programm beendet ist.
Der richtige Weg wäre eine Konsole zu öffnen und in dieser Konsole das Programm zu starten. Die bleibt dann auch offen, wenn man das Programm beendete. Allerdings ist das benutzen einer Konsole heute nicht mehr so gebräuchlich wie früher, weshalb der überwiegende Teil der Anwender nicht umgehen kann. Das beschränkt sich nicht nur auf die Windows-Welt.
BlackJack

@Pacome: Gibt es einen Grund warum Du einen Texteditor in der Konsole verwendest und keinen grafischen? Denn bei denen kann man in der Regel den gesamten Quelltext einfach auswählen und in die Zwischenablage kopieren und dann von dort im Browser in das Texteingabefeld.

Der `raw_input()` am Ende von Programmen wird normalerweise von Windowsprogrammierern gemacht weil die dort Konsolenprogramme nicht in einer vorhandenen Konsole starten, also eine die schon offen ist, sondern mit der Maus auf das Icon der Datei mit dem Quelltext klicken. Dann geht auch eine Konsole auf, die geht aber nach Programmende oder wenn im Programm eine Ausnahme auftritt sofort wieder zu, so dass man Ergebnisausgaben oder Fehlermeldungen gar nicht beziehungsweise nur für Sekundenbruchteile sieht. Deshalb gibt es diese Unsitte am Ende vom Benutzer noch mal eine eigentlich sinnfreie Eingabe zu verlangen, damit erst danach das Programm zuende ist und die Konsole so lange offen bleibt. Wenn man das Programm aber in einer vorhandenen Konsole startet, dann nervt diese Abfrage eher.
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@Pacome: wie rufst Du denn Deine Funktion steuern auf (und was steuert die eigentlich)? Kann es sein, dass Du ein print vergessen hast?
Pacome
User
Beiträge: 18
Registriert: Montag 24. August 2015, 11:52

@sparrow

Danke nochmal für die Aufklärung, ich habs schon geahnt. Aber mein Problem ganz lösen konnte ich damit nicht.
Ich bin ja gewillt mit der Konsole zu arbeiten aber wenn ich ja nichtmal diesen Quellcode aufrufen kann, fühl ich etwas Machtlos.....

Ich soll morgen auch noch einen Debian Server Konfigurieren....... -.- mir graut es ein wenig ^^ aber ich werds schon packen! Ist ja nur Zeit die ich dann halt zum nachlesen brauche :)
aber danke schonmal für die viele Hilfe!

@BlackJack

Ich steuer ein PI über SSH protokoll an und kann darüber keine Grafische Oberfläche sehen. Mal abgesehen davon will ich mit der Konsole umgehen können. Oder verstehe ich das falsch, und ich kann auch eine Grafischen Editor in der Konsole bedienen?
@Sirius3 das habe ich mir schon gedacht das eine Fragestellung irgendwie fehlen muss :) danke für diesen Tip mit Print!
Benutzeravatar
sparrow
User
Beiträge: 4144
Registriert: Freitag 17. April 2009, 10:28

@Pacome
Dann hoffe ich, dass der Debian-Server nicht vom Internet erreichbar ist - oder noch jemand in die Administration des Servers eingebunden ist, der wirklich weiß was er tut.
Das hat zwar wenig mit Python zu tun, aber ein schlecht oder falsch administrierter Linux-Server ist entsprechend anfällig.
Antworten