Создание функции в Python c двумя аргументами на расчет суммы элементов списка в зависимости от второго аргумента

Нужно написать тело функции discount_price, которая рассчитывает суммарную стоимость товаров из списка items_price со скидкой discount. На выходе функция должна возвращать два значения: - Суммарная стоимость товаров до скидки. - Суммарная стоимость товаров после применения скидки.

Мой код следующий:

def discount_price(items_price, discount):
    items_new = []
    while discount:
        for elem in items_price:     
            elem_new = elem - (elem * (discount / 100))  
            items_new.append(elem_new)
        print(sum(items_price), sum(items_new))
        return discount_price


items_price_1 = [50, 999, 400, 1000, 1800]

discount_1 = 50

discount_price(items_price_1, discount_1)

Вроде бы, все верно. Но если для discount на вход дать 0 - код не будет работать. В чем соль?

Второй вопрос: Как реализовать в функции тип None на вывод? Например, при вводе пустого списка.

Данный код возвращает 0, 0:

def discount_price(items_price, discount):
    items_new = []
    while discount:
        for elem in items_price:
            if items_price == []:
                return None
            else:
                elem_new = elem - (elem * (discount / 100))
                items_new.append(elem_new)
        print(sum(items_price), sum(items_new))
        return discount_price


items_price_1 = []

discount_1 = 50

discount_price(items_price_1, discount_1)

Ответы (2 шт):

Автор решения: Zhihar

какая то у вас странная функция

если вы хотите возвращать несколько значений, то используйте списки или кортежи:

def test(a, b):
    return (a - b, a + b)

print(test(7, 5))
print(test(10, 2)[1])

а вы возвращаете вообще указатель на функцию

почему бы вам код не сделать в таком виде:

def discount_price(items_price, discount = 0):
    items_new = []

    for elem in items_price:
        elem_new = elem - (elem * (discount / 100))
        items_new.append(elem_new)

    return (sum(items_price), sum(items_new))


items_price = [50, 999, 400, 1000, 1800]

discount = 50

print(discount_price(items_price, discount))

ну и сам код можно написать покороче:

def discount_price(items_price, discount = 0):
    items_new = map(lambda elem: elem * (1 - discount / 100), items_price)
    return (sum(items_price), sum(items_new))


items_price = [50, 999, 400, 1000, 1800]
discount = 50

print(discount_price(items_price, discount))
print(discount_price(items_price)) # скидка 0%

P.S.

добавил возможность возвращать None:

def discount_price(items_price = [], discount = 100):

    if items_price is None or len(items_price) == 0:
        return None

    items_new = map(lambda elem: elem * (1 - 0.01 * discount), items_price)
    return (sum(items_price), sum(items_new))


items_price = [50, 999, 400, 1000, 1800]
discount = 50

res1 = discount_price([], discount)
print(res1)

res2 = discount_price(items_price, discount)
print(res2)
→ Ссылка
Автор решения: Panerai Pew

В общем, с помощью @Zhihar, я смог разобраться. С учетом необходимости возвращения двух значений и None в случае ввода пустого списка, а также при вводе discount = 0 итоговый код без кортежей и лямбд(не изучал еще) может выглядеть так:

def discount_price(items_price, discount):
    items_new = []
    while items_price:
        for elem in items_price:
            if discount != 0:
                elem_new = elem - (elem * (discount / 100))
                items_new.append(elem_new)
            else:
                items_new.append(elem)
        return sum(items_price), sum(items_new)


items_price_1 = [50, 999, 400, 1000, 1800]

discount_1 = 0

print(discount_price(items_price_1, discount_1))
→ Ссылка