零基础入门python02:写出第一个有用程序——家庭账单计算器

发布时间:2026/8/11 2:36:39
零基础入门python02:写出第一个有用程序——家庭账单计算器 零基础入门python02写出第一个有用程序——家庭账单计算器一、上一篇课后练习讲解上一篇完成了 Python 3.11 安装、编辑器配置和第一行print。练习的验收不是看屏幕上有没有文字而是确认终端能找到python文件能保存为.py从项目目录运行时退出码为 0。可执行验收答案在练习目录创建check_env.py不要依赖 VS Code 的运行按钮直接从终端验证解释器和退出码importsysprint(executable:,sys.executable)print(version:,sys.version.split()[0])print(hello from lesson 01)运行命令python check_env.py python-cimport sys; assert sys.version_info[:2] (3, 11); print(environment ok)预期看到executable指向当前项目解释器、版本为3.11.x第二条命令输出environment ok。如果python找不到Windows 可尝试py -3.11 check_env.py如果版本不是 3.11先在 VS Code 选择正确解释器再重新打开终端。脚本退出码为 0 才算通过不能只看屏幕文字。二、本篇要完成什么我们要做一个家庭账单计算器。用户输入商品价格、数量和配送费程序输出总价。通过这个小程序一次学会变量、字符串、整数、小数、输入转换、四则运算和格式化输出。三、先看不带输入的版本unit_price19.90quantity2delivery_fee5.00totalunit_price*quantitydelivery_feeprint(f应付金额{total:.2f}元)变量是给数据起名字。unit_price保存单价quantity保存数量total保存计算结果。这里用下划线命名是因为 Python 社区约定变量名使用小写单词和下划线读起来比unitprice更清楚。四、让用户输入数据unit_pricefloat(input(请输入商品单价))quantityint(input(请输入购买数量))delivery_feefloat(input(请输入配送费))totalunit_price*quantitydelivery_feeprint(f应付金额{total:.2f}元)input()返回的永远是字符串即使用户输入19.9得到的也是19.9。所以金额要经过float()数量要经过int()。如果把字符串直接和数字相乘得到的会是字符串重复而不是金额计算。五、加入输入规则unit_pricefloat(input(请输入商品单价))quantityint(input(请输入购买数量))delivery_feefloat(input(请输入配送费))ifunit_price0:print(单价必须大于 0)elifquantity0:print(数量必须大于 0)else:totalunit_price*quantitydelivery_feeprint(f应付金额{total:.2f}元)条件分支先阻止不合理数据再计算结果。注意缩进else中的代码只有在前两个条件都不成立时才执行。六、完整文件bill_calculator.pydefcalculate_total(unit_price:float,quantity:int,delivery_fee:float)-float:只负责计算金额不负责读取输入便于后续测试和复用。ifunit_price0:raiseValueError(单价必须大于 0)ifquantity0:raiseValueError(数量必须大于 0)ifdelivery_fee0:raiseValueError(配送费不能为负数)returnunit_price*quantitydelivery_feedefmain()-None:负责命令行交互把用户输入转换后交给业务函数。try:unit_pricefloat(input(请输入商品单价))quantityint(input(请输入购买数量))delivery_feefloat(input(请输入配送费))totalcalculate_total(unit_price,quantity,delivery_fee)exceptValueErroraserror:print(f输入有误{error})returnprint(f应付金额{total:.2f}元)if__name____main__:main()这里的try不是为了炫技而是处理两类真实输入错误用户输入abc导致类型转换失败以及输入负数触发业务规则。把计算放在calculate_total中可以在没有键盘输入的情况下直接测试。七、运行结果请输入商品单价19.9 请输入购买数量2 请输入配送费5 应付金额44.80 元错误示例请输入商品单价abc 输入有误could not convert string to float: abc八、验收与练习运行python bill_calculator.py完成一次成功和两次错误输入。课后练习增加折扣参数满 100 元打九折下一篇会讲字符串、列表和元组并把多个商品加入购物车。实战补充会员折扣边界实验前面的计算器只有一条折扣规则真实业务经常会增加会员等级。不要把新规则直接塞进 main先为它写一个只接收参数的函数再由命令行调用。fromdecimalimportDecimaldefapply_discount(subtotal:Decimal,level:str)-Decimal:rules{normal:(Decimal(100),Decimal(0.90)),vip:(Decimal(80),Decimal(0.85))}iflevelnotinrules:raiseValueError(会员等级只能是 normal 或 vip)threshold,raterules[level]ifsubtotalthreshold:returnsubtotalreturn(subtotal*rate).quantize(Decimal(0.01))defcalculate_order(price:Decimal,quantity:int,fee:Decimal,level:str)-dict:ifprice0orquantity0orfee0:raiseValueError(价格和数量必须为正配送费不能为负)subtotal(price*quantity).quantize(Decimal(0.01))discountedapply_discount(subtotal,level)return{subtotal:subtotal,discounted:discounted,total:discountedfee}逐个测试 99.99、100、79.99、80 四个门槛能定位“边界前、边界上、边界后”三种结果。不要只测一个成功输入。本篇项目验收记录正常输入、满减、未知等级、负数和数量为零都要有预期结果。金额使用 Decimal舍入发生在折扣后如果产品要求每行先舍入必须修改规则并补测试。课后练习为会员增加生日券但生日券和折扣不能同时使用。先写冲突规则和测试再改代码下一篇会把一个订单扩展成多个商品。本篇结束完整模块文件本节不是代码片段而是本篇结束时该模块的完整版本。请先备份旧文件再整体替换替换后重新运行本篇命令和测试。阅读时重点看本篇新增的函数、事务边界和错误处理未涉及的代码先不要自行删减。main.pysubtotalfloat(input(商品总价))deliveryfloat(input(配送费))couponfloat(input(优惠金额))payablesubtotaldelivery-couponprint(f应付金额{payable:.2f}元)