Python cost_calculator函数含wings/drinks关键字参数报错求解
解决cost_calculator函数参数不匹配与输入处理问题
首先,咱们先明确你遇到的两个核心问题:
- 函数定义只接受一个位置参数,但调用时传入了多个位置参数+关键字参数(
wings、drinks),导致参数不匹配报错 - 用
[]作为字典键是无效的(列表是不可哈希类型,不能当字典键),而且原代码的遍历逻辑没法正确处理多参数和关键字参数
下面是修改后的完整代码,完全适配你给定的输入格式:
def cost_calculator(*args, **kwargs): cost = 0.00 # 定义各类商品的价格映射 drinks = {"small": 2.00, "medium": 3.00, "large": 3.50, "tub": 3.75} wings = {10: 5.00, 20: 9.00, 40: 17.50, 100: 48.00} toppings = {"pepperoni": 1.00, "mushroom": 0.50, "olive": 0.50, "anchovy": 2.00, "ham": 1.50} base_pizza_cost = 13.00 # 处理所有位置参数(包括基础披萨、配料列表) for item in args: if item == []: # 空列表代表基础披萨,加对应成本 cost += base_pizza_cost elif isinstance(item, list): # 如果是配料列表,遍历每个配料累加价格 for topping in item: if topping in toppings: cost += toppings[topping] # 额外支持单个配料直接传入的情况(比如直接传"pepperoni"而非列表) elif item in toppings: cost += toppings[item] # 处理关键字参数:wings if "wings" in kwargs: wing_quantities = kwargs["wings"] if isinstance(wing_quantities, list): for qty in wing_quantities: if qty in wings: cost += wings[qty] # 处理关键字参数:drinks if "drinks" in kwargs: drink_sizes = kwargs["drinks"] if isinstance(drink_sizes, list): for size in drink_sizes: if size in drinks: cost += drinks[size] return round(cost, 2) # 保留两位小数,符合金额格式
关键修改点说明:
- 参数定义改为
*args, **kwargs:*args会捕获所有传入的位置参数(比如你调用时的[]、[]、["pepperoni", "pepperoni"]),打包成一个元组;**kwargs会捕获所有关键字参数(比如wings=[10,20]、drinks=["small"]),打包成一个字典,完美适配你的输入格式。 - 替换无效的
pizza字典:
原来用{[]:13.00}是错误的(列表是不可哈希类型,不能作为字典键),现在直接判断item == []来识别基础披萨,累加对应成本。 - 遍历处理列表类型的参数:
不管是位置参数里的配料列表,还是关键字参数里的wings数量、drinks尺寸列表,都逐个遍历元素,匹配对应价格累加,支持多个同类商品的计算。 - 金额格式化:
最后用round(cost,2)确保返回的金额是两位小数,符合实际货币的显示需求。
测试你的输入:
调用cost_calculator([], [], ["pepperoni", "pepperoni"], wings=[10, 20], drinks=["small"]),计算过程如下:
- 两个基础披萨:13*2 = 26
- 两份pepperoni配料:1*2 = 2
- 10个+20个 wings:5+9 =14
- 一杯small饮料:2
- 总成本:26+2+14+2 = 44.00,函数会返回
44.0
这样就完全解决了你的参数报错和输入处理问题,而且不需要修改任何输入格式。
内容的提问来源于stack exchange,提问作者Anvesh Sunkara
相关产品推荐
相关产品推荐

