如何匹配数组与字典迭代器并重构披萨价格计算函数?
重构披萨价格计算器以支持多配料列表
先修正你尝试代码里的错误
你写的这段遍历代码存在几个问题:
for j in toppingsMenu: for k in toppings: if toppings[k] is j: print(toppingsMenu[j]) toppingsAmount = toppingsMenu[j]
for k in toppings里的k是列表中的配料名称字符串,不是索引,所以toppings[k]会直接报错(列表仅支持数字索引),直接用k匹配字典键即可。- 用
is比较字符串是错误用法,is用于判断对象内存地址是否一致,判断字符串内容相等应该用==。 - 你只做了价格赋值,没有累加逻辑,每次循环都会覆盖之前的价格,最终只能得到最后一个匹配配料的价格。
重构后的完整代码
利用字典get方法快速取值,结合生成器表达式实现多配料价格累加,代码简洁且逻辑清晰:
def pizzaPriceCalculator(sauce, toppings, loyalCustomer): sauceMenu = { "regular": 4.35, "alfredo": 4.6, "marinara": 5.85, "mix": 5.47 } toppingsMenu = { "cheese": 0.5, "pepperoni": 0.75, "salami": 0.65, "olives": 1.0, "mushroom": 0.35 } # 获取酱料价格,若输入酱料不在菜单中则返回0(可根据需求改为抛出错误) base_price = sauceMenu.get(sauce, 0.0) # 计算所有选中配料的总价,自动忽略不在菜单中的配料 toppings_total = sum(toppingsMenu.get(topping, 0.0) for topping in toppings) # 计算折扣前总价 price_before_discount = base_price + toppings_total # 应用忠诚客户折扣 final_price = price_before_discount - 1.0 if loyalCustomer else price_before_discount print(f"最终价格: {final_price:.2f}") return final_price # 调用示例 pizzaPriceCalculator("marinara", ["pepperoni", "cheese", "olives"], True)
关键逻辑说明
- 字典取值优化:无需遍历字典匹配,
dict.get(key, default)可直接获取对应价格,若键不存在则返回默认值(这里用0.0,也可改成抛出ValueError提示无效选项)。 - 多配料求和:
sum()结合生成器表达式,一行代码完成配料列表的价格累加,避免嵌套循环的逻辑混乱。 - 逻辑分层:将价格计算拆分为独立步骤,修正了原代码中
baseTeaAmount这类明显的变量名错误。 - 字符串比较修正:通过
get方法隐含键匹配逻辑,避免了is带来的潜在问题。
额外建议
- 若需要对无效酱料/配料做强校验,可将
get替换为直接取值+异常捕获:try: base_price = sauceMenu[sauce] except KeyError: raise ValueError(f"无效酱料: {sauce}") - 可将菜单字典移到函数外部,避免每次调用函数都重复创建字典,提升运行效率。
内容的提问来源于stack exchange,提问作者BBeknaz0904
相关产品推荐
相关产品推荐

