Fehler wird nicht angezeigt

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
Fuchsi
User
Beiträge: 3
Registriert: Dienstag 21. Mai 2019, 07:59

Hallo ihr Lieben,

ich möchte anhand des Bruttoeinkommens abzüglich der Steuern (Steuersatz ist vom Bruttoeinkommen abhängig, Steuerzusatz vom Beruf) das Nettoeinkommen berechnen und dann bei Bedarf ein Kindergeld von 194€ hinzuaddieren.
Leider zeigt mir das Programm weder einen Output noch einen Fehler an, deshalb bitte ich hier im Forum um Hilfe.

Code: Alles auswählen

gross_income = 3000
job = "Handwerker"
child = True

def tax_rate(gross_income):    #Steuersatz bestimmen 
    if gross_income <= 550:
        return gross_income * 0.15  
    elif gross_income <= 1600:
        return gross_income * 0.20
    elif gross_income <= 2500:
        return gross_income * 0.25
    elif gross_income <= 4000:
        return gross_income * 0.35
    else:
        return gross_income * 0.45

def tax_additional(job):   #Steuerzusatz bestimmen
    if job == "Handwerker":
        return gross_income * 0.03
    elif job == "Krankenpfleger":
        return gross_income * 0
    elif job == "Lehrer":
        return gross_income * -0.03
    elif job == "Professor":
        return gross_income * -0.05
    else:
        return gross_income * -0.07

tax = tax_rate(gross_income) + tax_additional(job)    #Steuer
net_value = gross_income - tax     #Nettoeinkommen ohne Kind
net_value_child = net_value + 194   #mit Kindergeld

def calc_net_value(child): 
    if child == True:
        return net_value_child
    else:
        return net_value 
        
calc_net_value(child)
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du musst Ergebnisse auch irgendwie ausgeben.

print(calc_net_value(...))

sollte ein Anfang sein.
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@Fuchsi: lange if-Cascaden versucht man durch eine passende Datenstruktur und/oder Schleifen zu vermeiden. Z.B. ein Wörterbuch für die verschiedenen Berufe.

Funktionen sollten alles, was sie brauchen, über ihre Argumente bekommen, `tax_additional` also neben `job` auch `gross_income` und `calc_net_value` neben `child` auch `net_value_child` und `net_value`, was die Funktion ziemlich überflüssig macht. Eine add_net_value_for_child-Funktion wäre besser.

Um solche Fehler zu vermeiden, sollten alle Rechnungen auf oberster Ebene in eine Funktion, die üblicherweise `main` genannt wird, wandern.
Fuchsi
User
Beiträge: 3
Registriert: Dienstag 21. Mai 2019, 07:59

Vielen Dank!
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Fuchsi: Zu den Namen der Funktionen sollte man noch Anmerken das die normalerweise die Tätigkeiten benennen, die von der Funktion durchgeführt werden. `tax_rate` wäre ein guter Name für den *Wert* des Steuersatzes, aber nicht für eine Funktion, die den berechnet. Wobei die Funktion ja selbst das nicht berechnet – die berechnet die Steuern. Der Steuersatz wären ja die Prozentwerte die dafür verwendet werden.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3

TAXE_RATES = [(4000, 0.45), (2500, 0.35), (1600, 0.25), (550, 0.20), (0, 0.15)]
JOB_TO_ADDITIONAL_TAX_RATE = {
    'Handwerker': 0.03,
    'Krankenpfleger': 0,
    'Lehrer': -0.03,
    'Professor': -0.05,
}
DEFAULT_ADDITIONAL_TAX_RATE = -0.07
CHILD_ALLOWANCE = 194


def get_tax_rate(gross_income):
    for limit, tax_rate in TAXE_RATES:
        if gross_income > limit:
            return tax_rate
    return 0  # Zero or negative income.


def get_additional_tax_rate(job):
    return JOB_TO_ADDITIONAL_TAX_RATE.get(job, DEFAULT_ADDITIONAL_TAX_RATE)


def main():
    gross_income = 3000
    job = 'Handwerker'
    has_child = True

    tax = (
        gross_income * get_tax_rate(gross_income)
        + gross_income * get_additional_tax_rate(job)
    )
    net_value = gross_income - tax + (CHILD_ALLOWANCE if has_child else 0)
    print(net_value)


if __name__ == '__main__':
    main()
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten