试图创建一个代码/函数,允许用户购买配料,然后将其存储在他们的库存中,怎么搞不清楚?

2024-05-18 16:17:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我是一个初级Python程序员,我正在尝试创建一个函数,允许用户购买3种不同的配料(“苹果”、“甜菜”和“胡萝卜”),每种配料1美元。我定义的函数将包含2个参数(配料名称和他们要购买的配料数量)。用户拥有的最大金额为20美元

iinventory={} iinventory['apple']=0 iinventory['beets']=0 iinventory['carrots']=0 def buyingredient(ingredient_name,number: int): total=20 while total > 0: if number > total: break if number < total: iinventory[ingredient_name] += number total = total + number iinventory.append(number))

我在如何开始真正的代码有困难,因为首先我必须确保他们购买的金额不超过他们的总金额($20)。另外,我也不知道如何把购买的金额放入一本字典里。我想我可以用append,但我想那只适用于列表而不是字典

然后,无论他们买多少苹果、甜菜或胡萝卜,都会反映在他们的总数上,并且会减少。 例如,如果他们买了3个苹果:

购买成分(“苹果”,3)

然后库存会显示他们有3个苹果,总共剩下17美元

iinventory={'苹果':3,'甜菜':0,'胡萝卜':0} 总计=17

现在不知道从这里到哪里去获取代码


Tags: 函数代码用户name苹果numberif字典
1条回答
网友
1楼 · 发布于 2024-05-18 16:17:38

试着跟踪你购买新原料时的花费,这样你就可以避免这种循环:

inventory = {
    "apple": 0,
    "beets": 0,
    "carrots": 0}

total_budget = 20
total_spent = 0

def buy_ingredient(name, number):
    if number + total_spent > total_budget:
        raise ValueError("overspent!")
    inventory[name] += number
    total_spent += number

让我们试试看(忍受我,我要采取一点切线):

>>> buy_ingredient('apple', 2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in buy_ingredient
UnboundLocalError: local variable 'total_spent' referenced before assignment

此操作失败,因为total_spent是在函数外部定义的。因此,通常认为让函数更新“活”在它们之外的变量是不好的做法——最好是返回一些内容(是的,更新iinventory会起作用,但仍然被认为是不好的风格。)

在这种情况下,你正在创建一些东西,但修改的次数不详——这是一个绝佳的机会去上课。让我们创建一个GroceryBasket来跟踪您的预算和您添加的项目:

from collections import defaultdict

class GroceryBasket(object):
    def __init__(self, budget):
        self.items = defaultdict(int)
        self.budget = budget
        self.spent_so_far = 0

    def add_ingredient(self, name, number):  # note this is almost exactly the `buy_ingredient` function from above
        if number + self.spent_so_far > self.budget:
            raise ValueError("overspent!")
        self.items[name] += number
        self.spent_so_far += number

创建一个实例,指定您的预算:

>>> basket = GroceryBasket(budget=20)
>>> basket.budget
20
>>> basket.spent_so_far
0

加5个苹果:

>>> basket.add_ingredient("apple", 5)
>>>
>>> basket.items
defaultdict(<type 'int'>, {'apple': 5})
>>>
>>> basket.spent_so_far
5

现在是100根甜菜:

>>> basket.add_ingredient('beets', 100)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 8, in add_ingredient
ValueError: overspent!

不管怎样,这可能比你想要的答案要多,但是我想加强你的函数,同时强调它要么返回一个值,要么更新传入对象的状态(在本例中是self),而不让你挂起。希望这有帮助

(顺便说一句,如果你想知道defaultdict是什么,看看这些文档,它们相当不错。有一个例子显示了defaultdict(int)+=操作符的用法(不太远:https://docs.python.org/3/library/collections.html#collections.defaultdict

相关问题 更多 >

    热门问题