Python储蓄计算器如何实现生日圣诞节等特殊日期的金额扣减逻辑
问题诊断与修复方案
核心错误点
- 类型不匹配:
datetest是datetime.date类型,你定义的birthday、christmas是datetime.datetime类型,两类对象永远不会相等,所以特殊日期判断分支永远无法触发 - 条件互斥逻辑错误:当前用
if...elif...把周一发薪、特殊日期发福利两个判断做成了互斥逻辑,就算类型匹配,同一天同时满足两个条件时也只会触发第一个分支,漏算特殊日期的额外金额 - 特殊日期年份固定:仅定义了当前年份的生日、圣诞节,时间跨年之后不会自动更新下一年的对应日期,超过1年的储蓄周期会漏算后续年份的特殊福利
- 硬编码参数:每周扣减的金额固定写死为5,没有使用用户输入的
pocket_money变量,不符合需求设计
修复后代码
import datetime as dt current_balance = float(input("What is your current balance?: £")) pocket_money = float(input("How much pocket money do you get per week?: £")) goal = float(input("How much money do you need?: £")) today = dt.date.today() if goal <= current_balance: print(f"You already have enough money and you will have £{current_balance-goal} left.") else: money_needed = goal - current_balance datetest = today d = dt.timedelta(days=1) counter = 0 # 初始化为date类型,和datetest保持一致 current_year = datetest.year birthday = dt.date(current_year, 5, 16) christmas = dt.date(current_year, 12, 25) # 特殊日期固定额外金额,单独定义方便修改 BONUS_AMOUNT = 200 while money_needed > 0: # 先判断是否跨年,更新当年的特殊日期 if datetest.year != current_year: current_year = datetest.year birthday = dt.date(current_year, 5, 16) christmas = dt.date(current_year, 12, 25) # 两个判断独立,不互斥,同时满足时两个福利都发放 if datetest == birthday or datetest == christmas: money_needed -= BONUS_AMOUNT if datetest.weekday() == 0: money_needed -= pocket_money counter += 1 datetest += d print(counter)
内容的提问来源于stack exchange,提问作者Emily Kelt
相关产品推荐
相关产品推荐

