2013-11-21 5 views
2

Как мне сделать цикл for с диапазоном 70000 и выше? Я делаю for-loop для подоходного налога, и когда доход выше 70000, налог составляет 30%. Я бы сделал что-то вроде for income in range(income-70000)?расчет подоходного налога python

Ну, сначала я разработал код, который не использовал цикл, и он работал нормально, но потом я был уведомлен о том, что мне нужно включить цикл в свой код. Это то, что у меня есть, но для меня просто не имеет смысла использовать цикл for. Кто-нибудь может мне помочь?

def tax(income):

for income in range(10001): 
    tax = 0 
    for income in range(10002,30001): 
     tax = income*(0.1) + tax 
     for income in range(30002,70001): 
      tax = income*(0.2) + tax 
      for income in range(70002,100000): 
       tax = income*(0.3) + tax 
print (tax) 

Хорошо, так что я теперь пытался с петлей в то время, но он не возвращает значение. Скажи мне, что ты думаешь. Мне нужно рассчитать подоходный налог на основе дохода. первых 10000 долларов нет налога. следующий 20000 - 10%. Следующий 40000 - 20%. и выше 70000 составляет 30%.

def taxes(income):

income >= 0 
while True: 
    if income < 10000: 
     tax = 0 
    elif income > 10000 and income <= 30000: 
     tax = (income-10000)*(0.1) 
    elif income > 30000 and income <= 70000: 
     tax = (income-30000)*(0.2) + 2000 
    elif income > 70000: 
     tax = (income - 70000)*(0.3) + 10000 
return tax 
+0

Не могли бы вы объяснить, что вы здесь пытаетесь сделать? Вы строите налоговую таблицу? Что происходит внутри цикла for? Что происходит до/после? – selllikesybok

+2

Подоходный налог? Для чего вам нужен цикл? умножать. – shx2

+6

Почему бы не просто «если доход» = 7000'? Похоже, вы пытаетесь буквально перевести английскую инструкцию «за доходы выше 7000, взимать 30% налог» на Python, но то, что «на самом деле» может вас удивить. – Kevin

ответ

9

Q: Как я могу идти о том, чтобы для цикла с диапазоном 70000 и выше?

A: Используйте itertools.count() метод:

import itertools 

for amount in itertools.count(70000): 
    print(amount * 0.30) 

Q: Мне нужно, чтобы рассчитать налог на прибыль на основе дохода. первых 10000 долларов нет налога. следующий 20000 - 10%. Следующий 40000 - 20%. и выше 70000 составляет 30%.

A:bisect module отлично подходит для просмотров, делаемых в диапазонах:

from bisect import bisect 

rates = [0, 10, 20, 30] # 10% 20% 30% 

brackets = [10000,  # first 10,000 
      30000,  # next 20,000 
      70000]  # next 40,000 

base_tax = [0,   # 10,000 * 0% 
      2000,   # 20,000 * 10% 
      10000]  # 40,000 * 20% + 2,000 

def tax(income): 
    i = bisect(brackets, income) 
    if not i: 
     return 0 
    rate = rates[i] 
    bracket = brackets[i-1] 
    income_in_bracket = income - bracket 
    tax_in_bracket = income_in_bracket * rate/100 
    total_tax = base_tax[i-1] + tax_in_bracket 
    return total_tax 
1

Если вы действительно должны петли, один подход должен был бы сложить налог на каждую единицу дохода отдельно:

def calculate_tax(income): 
    tax = 0 
    brackets = {(10000,30000):0.1, ...} 
    for bracket in brackets: 
     if income > bracket[0]: 
      for _ in range(bracket[0], min(income, bracket[1])): 
       tax += brackets[bracket] 
    return tax 
1

Как ваша функция определенно не вычислить необходимую стоимость. Вам нужно что-то вроде:

import sys 

income = 100000 
taxes = [(10000, 0), (20000, 0.1), (40000, 0.2), (sys.maxint, 0.3)] 

billed_tax = 0 
for amount, tax in taxes: 
    billed_amount = min(income, amount) 
    billed_tax += billed_amount*tax 
    income -= billed_amount 
    if income <= 0: 
     break 

>>> billed_tax 
19000.0 
+0

Этот ответ неверен. Рассмотрим вторую итерацию через цикл. сумма равна 20000, а доход - 900000. Таким образом, billed_amount составляет 20000. Так что налог = .1 применяется к 20000. Но этот налог должен применяться только к сумме от 20000 до 10000, что составляет 10000. И, глядя на ввод, вы можете см., что налог на 19000 слишком высок для этого примера, потому что 60000 должно облагаться налогом на 0,2, но остальное должно облагаться налогом намного меньше, а результат должен быть менее 19%. – garyrob

+0

@garyrob вы ошибаетесь. Если вы перечитаете вопрос, 10, 20 и 40 - это не фактические шаги. Вычисление приращений из шагов очевидно и является ООС этого рассмотрения. – alko

-1

Я не знаю ни одного python, но ваши проблемы не являются языком. Вы должны прочитать об условностях. Вам не нужно все, что FOR, всего 1 и делать IFS в соответствии с вашими правилами.

Смежные вопросы