尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

零基础入门python03:用购物清单学会字符串、列表和字典

零基础入门python03:用购物清单学会字符串、列表和字典 零基础入门python03用购物清单学会字符串、列表和字典一、上一篇课后练习讲解上一篇要求给账单计算器增加满减规则。参考实现是把折扣判断放进计算函数而不是写在输入代码中先计算小计满 100 元乘以0.9否则保持原价。这样下一篇如果改成网页接口只需要复用业务函数。可执行验收答案把下面函数复制到bill_calculator.py的计算模块使用Decimal避免金额二进制浮点误差fromdecimalimportDecimal,ROUND_HALF_UPdefcalculate_payable(price:Decimal,quantity:int,fee:Decimal)-Decimal:ifprice0orquantity0orfee0:raiseValueError(金额和数量不能为负)subtotalprice*quantity discountDecimal(0.90)ifsubtotalDecimal(100)elseDecimal(1)return(subtotal*discountfee).quantize(Decimal(0.01),roundingROUND_HALF_UP)assertcalculate_payable(Decimal(50),2,Decimal(5))Decimal(95.00)assertcalculate_payable(Decimal(100),1,Decimal(5))Decimal(95.00)try:calculate_payable(Decimal(-1),1,Decimal(0))exceptValueError:passelse:raiseAssertionError(负金额必须失败)print(discount checks passed)运行python bill_calculator.py和python -c from bill_calculator import ...时边界 99.99 不打折、100.00 打九折数量为 0、配送费为负数都应明确报错而不是算出一个看似合法的金额。二、本篇要完成什么我们要做一个可以反复添加商品、修改数量、删除商品并显示总价的购物清单。一个商品不应该只保存成字符串因为后面还要保存价格和数量因此本篇会比较列表、字典和“字典组成的列表”三种结构。三、从字符串开始rawinput(请输入商品名用逗号分隔)names[name.strip()fornameinraw.split(,)ifname.strip()]print(names)split(,)把一个字符串切成多个片段strip()去掉用户不小心输入的空格if name.strip()过滤空项。输入苹果, 牛奶, ,面包结果是[苹果, 牛奶, 面包]。四、为什么需要字典item{name:苹果,price:6.5,quantity:2}print(item[name],item[price]*item[quantity])字典适合表达“字段名 → 字段值”。如果用列表[苹果, 6.5, 2]读到item[1]时很难知道 1 是价格还是数量字典的键让代码更接近业务语言。五、完整购物清单程序deffind_item(items:list[dict],name:str)-dict|None:按名称查找商品找不到返回 None调用方决定新增还是报错。returnnext((itemforiteminitemsifitem[name]name),None)defadd_item(items:list[dict],name:str,price:float,quantity:int)-None:新增商品或累加数量统一保证数量和价格是合法值。namename.strip()ifnotname:raiseValueError(商品名不能为空)ifprice0orquantity0:raiseValueError(价格不能为负数量必须大于0)oldfind_item(items,name)ifold:old[quantity]quantityelse:items.append({name:name,price:price,quantity:quantity})defprint_summary(items:list[dict])-None:只负责展示不修改购物清单便于之后替换成网页输出。total0.0forindex,iteminenumerate(items,start1):subtotalitem[price]*item[quantity]totalsubtotalprint(f{index}.{item[name]}x{item[quantity]}{subtotal:.2f}元)print(f合计{total:.2f}元)defmain()-None:items:list[dict][]whileTrue:nameinput(商品名直接回车结束).strip()ifnotname:breaktry:pricefloat(input(单价))quantityint(input(数量))add_item(items,name,price,quantity)exceptValueErroraserror:print(f输入有误{error})print_summary(items)if__name____main__:main()这里有一个重要的项目思路输入函数只负责交互add_item负责规则print_summary负责展示。以后接入 Flask 时输入会来自 JSON规则函数仍然可以复用。六、运行结果商品名直接回车结束苹果 单价6.5 数量2 商品名直接回车结束苹果 单价6.5 数量1 商品名直接回车结束牛奶 单价12 数量1 商品名直接回车结束 1. 苹果 x 3 19.50元 2. 牛奶 x 1 12.00元 合计31.50元七、验收和练习验收三个边界空商品名被拒绝、负价格被拒绝、同名商品数量会累加。课后练习增加删除商品功能并让用户输入编号删除下一篇会把字典、集合和条件判断组合成注册信息校验程序。实战补充购物清单的增量重构单个商品的变量会随着商品数量增长变成 price1、price2、price3。列表用于保存同一类数据字典用于表达一件商品的多个属性。fromdecimalimportDecimal cart[{name:键盘,price:Decimal(129.00),quantity:1},{name:鼠标,price:Decimal(59.90),quantity:2},]defcart_total(items:list[dict])-Decimal:totalDecimal(0)foriteminitems:ifitem[price]0oritem[quantity]0:raiseValueError(商品价格和数量必须为正)totalitem[price]*item[quantity]returntotal.quantize(Decimal(0.01))列表保持顺序元组适合表示不可变坐标或固定返回值不要为了炫技把所有数据都写成推导式初学阶段先用循环打印每一步。运行结果与排错键盘 129.00 加鼠标 119.80商品小计应为 248.80。若出现 KeyError检查字典键名若出现 TypeError检查是否把字符串金额混进 Decimal 运算。课后练习增加按商品名合并重复商品、删除商品和显示购物清单功能写出空购物车、重复商品和非法数量的预期结果。下一篇用字典和集合实现注册校验。本篇结束完整模块文件本节不是代码片段而是本篇结束时该模块的完整版本。请先备份旧文件再整体替换替换后重新运行本篇命令和测试。阅读时重点看本篇新增的函数、事务边界和错误处理未涉及的代码先不要自行删减。main.pyrawinput(用逗号分隔商品).strip()items[x.strip()forxinraw.split(,)ifx.strip()]items.append(环保袋)forindex,iteminenumerate(items,1):print(index,item)
返回列表