[Python] definowanie funkcji

Cześć,
zacząłem ostatnio uczyć się programowania w Pythonie i mam problem z definiowaniem funkcji i używaniem return. Czy możecie mi wytłumaczyć na poniższym przykładzie dlaczego ta funkcja mi nie działa? Funkcja ma liczyć wielkość podatku dochodowego w zależności od wysokości zarobków.

def percent_value(money_income):
    percent = 0
    calculated_tax = 0
    if money_income <= 15527:
        percent = 0
        calculated_tax = money_income * percent / 100
        return percent, calculated_tax
    elif 15528 <= money_income <= 42707:
        percent = 15
        calculated_tax = money_income * percent / 100
        return percent, calculated_tax
    elif 42708 <= money_income <= 132406:
        percent = 25
        calculated_tax = money_income * percent / 100
        return percent, calculated_tax
    else:
        percent = 28
        calculated_tax = money_income * percent / 100
        return percent, calculated_tax
    
     
income = int(input())
percent_value(income)
print(f'The tax for {income} is {percent}%. That is {calculated_tax} dollars!')

Niezależnie od tego jaką wartość wprowadzę (x) otrzymuję wynik:

The tax for x is 0.0%. That is 0.0 dollars!

percent istnieje tylko wewnątrz funkcji
zwracaj sobie tuplę albo dicta i z tego wyłuskuj
polecam lekturę tego Variables and scope — Object-Oriented Programming in Python 1 documentation

4 polubienia

ok, dzięki. Poprawiłem kod na taki (inspirowany Twoim linkiem) i teraz działa

def percent_value(money_income):
    global percent
    global calculated_tax
(...)

dzięki za pomoc.

1 polubienie

Używanie globali to zła praktyka, bo są dużo wolniejsze od zwykłej zmiennej, nawet zdefiniowanej poza funkcją. Zwracaj sobie wszystko w kupie

1 polubienie

Polecam temat dekonstrukcji https://blog.tecladocode.com/destructuring-in-python/ tutaj wyglada temat w miarę Ok.

2 polubienia

Wydaje mi się ze to kwesta zbyt wielu enterów bo ifach i braku tabu przez co Python myśli ze to już jest poza funkcja

1 polubienie

OK, żeby się upewnić, że dobrze rozumiem co macie na myśli. Czy poniższy kod jest zgodny “ze sztuką”?

def percent_value(money_income):
    if money_income <= 15527:
        percent = 0
        calculated_tax = money_income * percent / 100
        return percent, calculated_tax
    elif 15528 <= money_income <= 42707:
        percent = 15
        calculated_tax = money_income * percent / 100
        return percent, calculated_tax
    elif 42708 <= money_income <= 132406:
        percent = 25
        calculated_tax = money_income * percent / 100
        return percent, calculated_tax
    else:
        percent = 28
        calculated_tax = money_income * percent / 100
        return percent, calculated_tax
     
income = int(input())
percent, calculated_tax = percent_value(income)
print(f'The tax for {income} is {percent}%. That is {calculated_tax} dollars!')
1 polubienie

tu jest trochę bezsensowna operacja, hardcode na 0 dla calculated_tax to jest to

a poza tym jest ok

2 polubienia

Dzięki

Nie jest ok :stuck_out_tongue_winking_eye: za dużo powtórzonego kodu.
Pod if/elif powinno być tylko ustawienie zmiennej percent. A wymnożenie i return są w każdym wypadku takie same, więc mogą być wspólne, poza sekcją ifów.

2 polubienia

No i jeszcze zastanawiam się, czy algorytm jest zgodny z rzeczywistością, czy to celowe uproszczenie. Zazwyczaj progi podatkowe działają w ten sposób, że jeśli lądujesz w progu 2, do płacisz podatek z 1 do kwoty progowej 1, a stawkę 2 tylko od tej kwoty, która wpada w próg 2.

1 polubienie

powiem tak, jak na kogoś, kto dopiero się uczy od 0, to nie jest najgorzej
a u mnie to i tak było tylko rzucenie okiem, bo byłem w środku robienia czegoś innego
sam pewnie zrobiłbym to bardziej generycznie z progami jako lista, ale już nie chciało mi się tłumaczyć więcej

Oczywiście, system podatkowy działa tak jak opisałeś. Samo zadanie było ćwiczeniem na kursie. Chodziło mi głównie o to, w jaki sposób sprawić aby return zwracał właściwe wartości.

Generalnie zadanie dało się wykonać bez definiowania funkcji tylko od razu na ifach i elsach, ale chciałem przy okazji nauczyć się czegoś więcej.

Z jednej strony wydaje mi się, że początkujący jak napisze funkcję, która zadziała prawidłowo to będzie sukces. Z drugiej strony warto od razu myśleć nad tym, aby kod był przynajmniej w miarę zoptymalizowany. Pytanie tylko gdzie jest ta granica podczas nauki?

1 polubienie