Создание функции в 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 шт):
какая то у вас странная функция
если вы хотите возвращать несколько значений, то используйте списки или кортежи:
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)
В общем, с помощью @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))