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
Nie jest ok 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