Вычисление чистой прибыли с помощью цикла

Задача:

Написать функцию 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 шт):

Автор решения: Сергей

Ниже рабочий код с добавленной проверкой.

  1. Исправил формулу возврата.
  2. Сдвинул return правильно.
  3. Не надо использовать переменные, отличающиеся лишь типом буквы (строчная/прописная) - плохой стиль, путаются потом.
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 на печати 
→ Ссылка
Автор решения: n1tr0xs

Если вам нужна не чистая прибыль, а итоговое кол-во денег после заданного периода, то уберите уменьшаемое из оператора return.

return amount * (1+percent/100)**period` # без цикла
return amount # любой из циклов

  1. Вообще решается без цикла:
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
  1. Цикл 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
  1. Цикл 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

Да, собственно, и проверка на ноль тоже не нужна:

  1. Если amount==0, то мы умножаем 0 на число и получаем 0.
  2. Если percent==0, то мы умножаем на 1 и получаем amount.
  3. Если period==0, то мы:
    1. В циклах ничего не сделаем, потому что цикл и не запустится.
    2. В функции без цикла умножим на 1, потому что a**0==1.

Однако в случае с нулем в переменных amount и percent в функциях с циклом от проверки есть толк, поскольку мы завершаем работу без умножений 0 и умножения на 1, соответсвенно.
Тогда функции будет выглядеть так:

  1. Без цикла
def calculate_profit(amount: int, percent: Union[float, int], period: int) ->Union[float, int]:
    return amount - amount * (1+percent/100)**period
  1. Цикл 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
  1. Цикл 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 - прекращает выполнение функции.

→ Ссылка