Вычисление чистой прибыли с помощью цикла
Задача:
Написать функцию calculate_profit, принимающую три параметра:
amount– начальная сумма, которую мы кладем на депозит;percent– годовая процентная ставка;period– количество лет (время, на которое деньги кладутся на депозит).
Функция должна рассчитать и вернуть сумму чистой прибыли за все время.
Если переданные в функцию amount, percent или period равны 0, функция должна возвращать 0
Проблема: мой код работает только на 1 год, на период с большим количеством лет считает неверно
from typing import Union
def calculate_profit(amount: int, percent: Union[float, int], period: int) -> Union[float, int]:
if amount == 0:
return 0
if percent == 0:
return 0
if period == 0:
return 0
Amount = amount
years = 0
while period > years:
Amount = amount * percent / 100
years += 1
return Amount * period
Ответы (4 шт):
Ниже рабочий код с добавленной проверкой.
- Исправил формулу возврата.
- Сдвинул return правильно.
- Не надо использовать переменные, отличающиеся лишь типом буквы (строчная/прописная) - плохой стиль, путаются потом.
from typing import Union
def calculate_profit(amount: int, percent: Union[float, int], period: int) ->Union[float, int]:
if amount == 0:
return 0
if percent == 0:
return 0
if period == 0:
return 0
Initial_value = amount
years = 0
while period > years:
amount = amount * (1 + percent / 100)
years += 1
return amount - Initial_value
print(calculate_profit (1000, 10, 2)) # 210.0 на печати
Если вам нужна не чистая прибыль, а итоговое кол-во денег после заданного периода, то уберите уменьшаемое из оператора return.
return amount * (1+percent/100)**period` # без цикла
return amount # любой из циклов
- Вообще решается без цикла:
def calculate_profit(amount: int, percent: Union[float, int], period: int) ->Union[float, int]:
if 0 in (amount, percent, period):
return 0
return amount - amount * (1+percent/100)**period
- Цикл
for:
def calculate_profit(amount: int, percent: Union[float, int], period: int) ->Union[float, int]:
if 0 in (amount, percent, period):
return 0
start = amount
for _ in range(period):
amount *= (1 + percent / 100)
return start-amount
- Цикл
while:
def calculate_profit(amount: int, percent: Union[float, int], period: int) ->Union[float, int]:
if 0 in (amount, percent, period):
return 0
start = amount
year = 0
while year<period:
amount *= (1 + percent / 100)
year += 1
return start-amount
Да, собственно, и проверка на ноль тоже не нужна:
- Если
amount==0, то мы умножаем0на число и получаем0. - Если
percent==0, то мы умножаем на1и получаемamount. - Если
period==0, то мы:- В циклах ничего не сделаем, потому что цикл и не запустится.
- В функции без цикла умножим на
1, потому чтоa**0==1.
Однако в случае с нулем в переменных amount и percent в функциях с циклом от проверки есть толк, поскольку мы завершаем работу без умножений 0 и умножения на 1, соответсвенно.
Тогда функции будет выглядеть так:
- Без цикла
def calculate_profit(amount: int, percent: Union[float, int], period: int) ->Union[float, int]:
return amount - amount * (1+percent/100)**period
- Цикл
for:
def calculate_profit(amount: int, percent: Union[float, int], period: int) ->Union[float, int]:
if 0 in (amount, percent):
return 0
start = amount
for _ in range(period):
amount *= (1 + percent / 100)
return start-amount
- Цикл
while:
def calculate_profit(amount: int, percent: Union[float, int], period: int) ->Union[float, int]:
if 0 in (amount, percent):
return 0
start = amount
year = 0
while year<period:
amount *= (1 + percent / 100)
year += 1
return start-amount
def calculate_profit(amount: int, percent: Union[float, int], period: int) ->Union[float, int]:
for year in range(period):
profit *= 1 + percent / 100
return profit - amount
Работает только для одного года у вас потому что в цикле есть строчка
return Amount * period
Как только выполнение до нее доходит, то сразу же происходит выход из функции возвращается текущий результат. Это именно то, что делает return - прекращает выполнение функции.