3

所以我懒惰的后部正在尝试在 python 3.x 中创建一个膳食计划生成器,这样我就不必每周五花 30 分钟来弄清楚我应该吃什么,但我是编码新手,并且在一些事情上苦苦挣扎。我仍在学习 Udemy 课程,但我想让我的手指弄脏代码以正确学习。任何人,这是我到目前为止所得到的:

class Meals():

    def __init__(self,breakfast,lunch,dinner):
        self.breakfast=breakfast
        self.lunch=lunch
        self.dinner=dinner
    def __str__(self):
        return f"Breakfast will be {self.breakfast}.\nLunch will be        {self.lunch}.\nDinner will be {self.dinner}."
    def cost(self):
        day_meals=[self.breakfast,self.lunch,self.dinner]
        day_cost=0
        for i in day_meals:
            for ingredient in i:
                for key,value in Shop2.items():
                    if key in ingredient:
                        day_cost+=value
        return f"Today will cost £{round(day_cost,2)}."

如果我做:

    monday_meals=Meals(random.choice(list(breakfasts.keys())),random.choice(list(lunches.keys())),random.choice(list(dinners.keys())))

然后调用 monday_meals.breakfast,然后我得到我想要的结果,即从“早餐”字典中随机选择的键,但每当我调用:monday_meals.cost() 时,我会得到 0 英镑,并且没有错误显示。

作为参考,我的测试词典如下:

breakfasts={"a bowl of Rice Crispies":["cereal_1","milk"],"Weetabix":["cereal_2","milk"],"some Golden Grahams":["cereal_3","milk"],"toast":["bread","butter"],"scrambled eggs":["egg","egg","milk"]}

lunches={"cereal bars":["cereal_bar","cereal_bar"],"a boring ham sandwich":["bread","ham"],"some fruit":["banana","apple"],"salad":"salad_bag"}

dinners={"Student Meal #1":["mince","red_sauce","pepper","onion"],"Student Meal #2":["c_breast","white_sauce","onion","pepper"],"Student Meal #3":["egg","pepper","tomato","onion"]}

Shop2={"egg":0.3,"tomato":0.35,"pepper":0.33,"onion":0.4,"mince":1.2,"c_breast":0.7,"rice":0.8,"red_sauce":1.4,"white_sauce":1.5,"cereal_1":0.4,"milk":0.13,"cereal_2":0.35,"cereal_3":0.45,"bread":0.04,"butter":0.04,"cereal_bar":0.75,"ham":0.25,"banana":0.3,"apple":0.3,"salad":0.75}

我真的很感激任何帮助找到一种更简单的方法来计算一天的膳食成本。

4

4 回答 4

1

您可以通过以下方式实现您的设计:

# inside your class:

@staticmethod
def calculate_meal_cost(ingredients, shopdict):
    return sum(shopdict[ingredient] for ingredient in ingredients)

@property
def cost(self):
    breakfast_cost = self.calculate_meal_cost(breakfasts[self.breakfast], Shop2)
    lunch_cost = self.calculate_meal_cost(lunches[self.lunch], Shop2)
    dinner_cost = self.calculate_meal_cost(dinners[self.dinner], Shop2)
    return breakfast_cost + lunch_cost + dinner_cost

然后:

meal = Meal(...)  # however you pick your meals is fine
meal.cost  # note: no parens
于 2018-11-30T22:06:32.107 回答
1

问题在于实例化类时传入的内容。breakfasts.keys()顾名思义,只是给你字典的键:键是冒号左边的东西,例如“一碗Rice Crispies”。实际的成分是,但这些永远不会发送到 Meals 实例;因此,当您遍历“成分”时,您实际上是在遍历键的字母。

您可以通过使用.values()而不是.keys()那里来解决此问题,尽管更好的方法可能是同时传递键和值,以便您的__str__方法输出描述,而不是成分;我会把它留作练习...

于 2018-11-30T22:08:30.367 回答
1

您的 Meals 对象正在使用餐点的字符串名称进行初始化(例如,随机选择的 Breakfasts.keys() 可能是“Weetabix”)。

当您遍历 day_meals 并执行“i 中的成分”时,您实际上是在遍历 Weetabix 的每个“字符”,因此您的成分将是“W”“e”“e”......等等。

相反,您可能希望使用早餐选择来初始化 Meals.items()。然后你会在 self.breakfast 中有一个元组,例如 ("Weetabix",["cereal_2","milk"])。

然后你可以在你的循环中解压它:

for name,ingredients in day_meals:
   for i in ingredients:
      # and so on..
于 2018-11-30T22:10:49.563 回答
0

创建Meals对象后,您必须调用cost方法。现在你只创建对象。尝试:

monday_meals=Meals(random.choice(list(breakfasts.keys())),random.choice(list(lunches.keys())),random.choice(list(dinners.keys())))
print monday_meals.cost()
print monday_meals
于 2018-11-30T22:06:38.957 回答