今天在昨天写的order_meal函数综合练习的基础上,增加了"会员折扣"、"优惠券抵扣"、“自动计价”功能:
首先预设一个价格表(字典)让函数能查表计算,并支持不同餐类、菜品、配菜、附加项目有不同价格
首先需要说明:我把参数meal_type写成mael_type,因为没有影响程序运行所以在写这个解析时才被发现的。下面解析这个程序:
一.价格表设计
1.用嵌套字典分别存储餐类、主菜、配菜、额外项的价格。
2.未定义项价格默认为0,避免出错。
功能:计算订单总价,处理会员折扣、优惠券,并返回结构化订单信息。
三.函数内部逻辑
1.初始化总价
从PRICES中获取餐类和主菜价格,累加到total_price。
2.处理配菜(*side_dishes)
遍历所有配菜:
如果是(名称,数量)元组,解析出name和qty,计算价格并累加。
如果是单个字符串,默认数量为1,计算价格并累加。
将配菜信息存入side_dish_list(结构化存储)。
3.处理额外要求(**extra_requests)
遍历所有额外要求:
跳过会员折扣和优惠券(后续单独处理)。
如果是(名称、数量)元组,解析出val,qty,根据val类型计算价格:val是字符串,从PRICES('额外项目')取价格x数量;val是数字,直接x数量。
如果值是单个值,默认数量为1,计算价格。
将额外要求信息存入extra_dict(结构化存储)。
4.处理会员折扣
从extra_requests获取会员折扣(默认1.0,及无折扣)。
如果是合法数字(0<discount<=1),总价×折扣。
5.处理优惠券
从extra_requests获取优惠券(默认0)。
如果是正数,总价减去优惠券金额,确保总价不小于0
6.返回订单信息
餐类、主菜、配菜、额外的需求。
会员折扣金额、优惠券金额。
最终的总价(保留两位小数)。
四.示例调用(提供了三次调用示例,验证不同场景)
第一次调用:一个配菜+两个额外要求。
第二次调用:三个配菜+一个额外要求+会员折扣+优惠券。
第三次调用:无配菜+三个额外要求+会员折扣+优惠券。
五.设计特点
灵活性:通过*sid_dishes和**extra_requests支持任意数量的配菜和额外要求。
结构化输出:返回字典包含所有明细(价格、数量、折扣等),便于后续打印和处理。
容错性:使用.get()避免键不存在的错误,对非法折扣和优惠券做效验。
扩展性:PRICES字典可以轻松添加新菜品和额外项目。