为什么我的函数没有被完全打印出来?

Why is my function not being printed entirely?

所以我在 Stack Overflow 用户的帮助下制作了这个功能,这里是..

def totalcal(data):
    calorie_dict = {}
    for el in data:
      food, values = el.split(':')
      a, b, c = values.split(',')
      calories = (int(a) * 5) + (int(b) * 5) + (int(c) * 9)
      calorie_dict[food] = calories
    return calorie_dict


 def rdict(recipes):
        recipes_splitted = {}
        for r in recipes:
            recipe_name, parts = r.split(":")
            recipe_parts = {}
            for part in parts.split(','):
                product, number = part.split('*')
                recipe_parts[product] = int(number)
            recipes_splitted[recipe_name] = recipe_parts
        return recipes_splitted



 def recipecal(recipes, data):
        for recipe_name in rdict(recipes):
            recipe_parts = rdict(recipes)[recipe_name]
            calories = 0
            for product in recipe_parts:
                number = recipe_parts[product]
                calories += number * totalcal(data)[product]
            return calories

print(recipecal(["Pork Stew:Cabbage*5,Carrot*1,Fatty Pork*10",
    "Green Salad1:Cabbage*10,Carrot*2,Pineapple*5",
    "T-Bone:Carrot*2,Steak Meat*1"]
    ,["Cabbage:4,2,0", "Carrot:9,1,5", "Fatty Pork:431,1,5",
    "Pineapple:7,1,0", "Steak Meat:5,20,10", "Rabbit Meat:7,2,20"]))

此函数有效,但是,对于 recipecal(recipes, data) 只有列表中第一个输入的解决方案被打印出来,就像输出只是这样...

22295

这是 ["Pork Stew:Cabbage*5,Carrot*1,Fatty Pork*10", 的结果,但我的代码忽略了列表中的其余输入。我应该在这里更改什么才能使其工作?

您在 for recipe_name in rdict(recipes): 循环中有一个 return 语句,因此它将在循环之前 return 并且永远不会到达其他元素。通过将 calories = 0return calories 移出循环来修复它。

def recipecal(recipes, data):
    calories = 0
    for recipe_name in rdict(recipes):
        recipe_parts = rdict(recipes)[recipe_name]
        for product in recipe_parts:
            number = recipe_parts[product]
            calories += number * totalcal(data)[product]
    return calories

return calories 的执行太早,因为它在循环内,因此也完成了循环,这就是其他条目未被处理的原因。

解决方法是将其放在内部循环之外。 在这种情况下,return calories 只打印最后一个条目,这不是您想要的。

所以最终的解决方案是创建一个列表来存储每个食谱的卡路里和 return 该列表。

编辑应该是这样的

def recipecal(recipes, data):
        calories_list = []
        for recipe_name in rdict(recipes):
            recipe_parts = rdict(recipes)[recipe_name]
            calories = 0
            for product in recipe_parts:
                number = recipe_parts[product]
                calories += number * totalcal(data)[product]
            calories_list.append(calories)
        return calories_list

输出

[22295, 690, 405]

如果你想要所有卡路里的总和,那么只需使用 sum(list)