查看全课大纲(第 21 / 51 节)
  1. 1.为什么人人都该学点编程?
  2. 2.计算机与程序设计:你的电脑到底在“想”什么?
  3. 3.Python 这门语言,到底有什么魔力?
  4. 4.Python 开发环境配置:如何拥有你的第一个“编程工具箱”?
  5. 5.如何安装一个更强大的代码编辑器?
  6. 6.汇率兑换1.0:你的第一个“钱生钱”小程序
  7. 7.你的第一行代码,藏着哪些秘密?
  8. 8.汇率兑换2.0(上):让程序看懂“CNY”和“USD”
  9. 9.汇率兑换程序,如何让它“聪明”地判断币种?
  10. 10.汇率兑换程序能一直运行,直到我喊停吗?
  11. 11.汇率兑换4.0:如何把“算钱”功能打包成积木?
  12. 12.汇率兑换5.0:给你的程序穿上“结构化”的西装
  13. 13.怎么用 Python 画一个会动的五角星?
  14. 14.如何让程序自动画出不同大小的五角星?
  15. 15.函数自己调用自己,会发生什么?
  16. 16.用递归画出神奇的分形树
  17. 17.Python 怎么计算你一天躺着不动能消耗多少热量?
  18. 18.如何让程序“活”起来,持续为你服务?
  19. 19.如何让 BMR 计算器更“聪明”?
  20. 20.当程序遇到“不按套路出牌”的用户怎么办?
  21. 21.怎么用 Python 模拟一个“滚雪球”式的存钱计划?
  22. 22.如何用列表记录每一周的存款?
  23. 23.如何让程序自己数数?—— 用 for 循环解放你的双手
  24. 24.52周存钱挑战4.0:你的存款计算器能有多灵活?
  25. 25.52周存钱挑战:怎么根据日期自动查存款?
  26. 26.Python 怎么判断一年中的第几天?
  27. 27.列表 vs 元组:哪个更适合存储月份天数?
  28. 28.用集合给月份分个队,换个思路算天数
  29. 29.把月份和天数“锁”在一起:用字典给数据配个对
  30. 30.Python 怎么判断密码强弱?
  31. 31.Python 怎么给密码设置“防沉迷”系统?
  32. 32.Python 怎么把密码保存到文件里?
  33. 33.Python 怎么读取文件里的密码?
  34. 34.Python 怎么把密码检查工具“打包”起来?
  35. 35.Python 怎么把文件操作也“打包”起来?
  36. 36.计算机怎么“扔骰子”?——用Python模拟随机事件
  37. 37.如何用 Python 模拟掷两个骰子?
  38. 38.怎么用 Python 把骰子轨迹画出来?
  39. 39.骰子点数分布长啥样?用直方图一眼看穿!
  40. 40.用科学计算库让骰子程序“起飞”
  41. 41.空气质量指数怎么算?手把手教你写一个AQI计算器
  42. 42.空气质量指数计算:从零开始,让程序看懂空气
  43. 43.如何读取空气质量数据文件并找出空气质量最好的五个监测点?
  44. 44.JSON 数据怎么变成 Excel 表格?—— 让数据换个“马甲”
  45. 45.Python 怎么让程序自己判断文件类型?
  46. 46.如何让程序自己上网查空气质量?
  47. 47.用美味的汤来解析网页:Beautiful Soup 入门
  48. 48.如何让爬虫自动抓取全国所有城市的空气质量?
  49. 49.爬到的数据怎么存下来?—— 把全国空气质量数据保存为CSV文件
  50. 50.用 pandas 玩转空气质量数据:找出全国空气最好和最差的城市
  51. 51.空气质量数据怎么“洗”干净,还能画成图?

怎么用 Python 模拟一个“滚雪球”式的存钱计划?

约 16 分钟

小象实战讲义 · Python 入门:8 个小项目边玩边学

欢迎回来!经过前四讲的学习,你已经能独立写出一些小程序了。这一讲,我们来玩一个和“钱”有关的项目——52周存钱挑战。这是一个风靡全球的储蓄方法,核心是“阶梯式”存钱:第一周存10元,第二周存20元,第三周存30元……每周比上周多存10元,坚持52周。听起来不多,但一年下来,你会惊讶地发现竟然能存下13,780元!

这节课,我们就用 Python 来模拟这个“滚雪球”的存钱过程。学完这一节,你不仅能算出最终存款,还能看到每周的存款明细,直观感受“积累”的魅力。

💡 核心导读

  • 项目目标:模拟52周阶梯存钱法,输出每周的存款金额和累计总额。
  • 核心复习:巩固 while 循环和格式化字符串输出。
  • 编程思路:明确程序的“输入-处理-输出”三步走,用循环模拟时间推移。
  • 本节新增:无全新知识点。我们巧妙运用已学的 while 循环和字符串格式化,来构建第一个完整版本。

一、拆解“52周存钱挑战”

我们先来彻底理解这个挑战的规则:

  • 规则:第一周存入 10 元,之后每周比上一周多存 10 元。
  • 周期:一年有 52 周。
  • 目标:计算一年后的总存款,并记录每一周存入的金额和当时的账户总额。

如果用手算,这是一个等差数列求和:(首项10 + 末项520) * 项数52 / 2 = 13780。但我们用程序做,不只是为了一个结果,更是为了记录过程,比如第5周存了多少?到第20周账户里有多少钱?

我们的程序最终要输出类似下面这样的记录:

第1周,存入10元,账户累计10元
第2周,存入20元,账户累计30元
第3周,存入30元,账户累计60元
...
第52周,存入520元,账户累计13780元

二、搭建程序骨架:明确“输入”与“输出”

写程序前,先想清楚需要什么(输入),以及要得到什么(输出)。这是我们一直强调的好习惯。

对于这个案例:

  • 输入:虽然看起来没有外部输入,但我们需要在程序内部定义几个关键的起始值:
    1. 第一周存入金额:10 元。
    2. 每周递增金额:10 元。
    3. 总周数:52 周。
    4. 一个记录周数的计数器:从 1 开始。
    5. 一个记录总存款的账户:从 0 开始。
  • 输出:就是上面那一行行的每周记录。

思路清晰了,我们开始写代码。记住,我们这节课没有引入新语法,只是把 while 循环和字符串格式化用在一个有趣的新场景里。

"""
    作者:小象
    功能:52周存钱挑战
    版本:1.0
"""

def main():
    """
        主函数
    """
    # 1. 定义输入(关键变量)
    money_per_week = 10   # 每周存入的金额,第一周是10元
    increase_money = 10   # 每周递增的金额
    total_week = 52       # 总共的周数
    i = 1                 # 记录第几周,从第1周开始
    saving = 0            # 账户累计总金额,初始为0

    # 2. 核心处理与输出:循环52周
    while i <= total_week:
        # 存钱操作:把这周要存的钱加到总账户里
        saving += money_per_week  # 等价于 saving = saving + money_per_week

        # 输出本周信息
        print('第{}周,存入{}元,账户累计{}元'.format(i, money_per_week, saving))

        # 3. 为下一周做准备
        money_per_week += increase_money  # 下周存的钱要增加
        i += 1                           # 周数加一,进入下一周

# 程序从这里开始执行
main()
第1周,存入10元,账户累计10元
第2周,存入20元,账户累计30元
第3周,存入30元,账户累计60元
第4周,存入40元,账户累计100元
第5周,存入50元,账户累计150元
第6周,存入60元,账户累计210元
第7周,存入70元,账户累计280元
第8周,存入80元,账户累计360元
第9周,存入90元,账户累计450元
第10周,存入100元,账户累计550元
第11周,存入110元,账户累计660元
第12周,存入120元,账户累计780元
第13周,存入130元,账户累计910元
第14周,存入140元,账户累计1050元
第15周,存入150元,账户累计1200元
第16周,存入160元,账户累计1360元
第17周,存入170元,账户累计1530元
第18周,存入180元,账户累计1710元
第19周,存入190元,账户累计1900元
第20周,存入200元,账户累计2100元
第21周,存入210元,账户累计2310元
第22周,存入220元,账户累计2530元
第23周,存入230元,账户累计2760元
第24周,存入240元,账户累计3000元
第25周,存入250元,账户累计3250元
第26周,存入260元,账户累计3510元
第27周,存入270元,账户累计3780元
第28周,存入280元,账户累计4060元
第29周,存入290元,账户累计4350元
第30周,存入300元,账户累计4650元
第31周,存入310元,账户累计4960元
第32周,存入320元,账户累计5280元
第33周,存入330元,账户累计5610元
第34周,存入340元,账户累计5950元
第35周,存入350元,账户累计6300元
第36周,存入360元,账户累计6660元
第37周,存入370元,账户累计7030元
第38周,存入380元,账户累计7410元
第39周,存入390元,账户累计7800元
第40周,存入400元,账户累计8200元
第41周,存入410元,账户累计8610元
第42周,存入420元,账户累计9030元
第43周,存入430元,账户累计9460元
第44周,存入440元,账户累计9900元
第45周,存入450元,账户累计10350元
第46周,存入460元,账户累计10810元
第47周,存入470元,账户累计11280元
第48周,存入480元,账户累计11760元
第49周,存入490元,账户累计12250元
第50周,存入500元,账户累计12750元
第51周,存入510元,账户累计13260元
第52周,存入520元,账户累计13780元

代码解读与运行:

  1. 变量初始化:我们在 main() 函数开头定义了所有需要的“原料”。
  2. while 循环:条件是 i <= total_week(即从第1周到第52周)。只要条件满足,就会执行循环体内的代码。
  3. 循环体内三部曲:
    • 存钱:saving += money_per_week 是一个简写,表示把本周要存的钱 money_per_week 累加到总存款 saving 中。
    • 输出:使用 print 和 .format() 方法,将周数 i、本周存入 money_per_week、累计总额 saving 这三个变量填入字符串中,形成一句完整的记录。
    • 更新:
      • money_per_week += increase_money:更新下周的存入金额(本周+10元)。
      • i += 1:周数加1,推动循环向下周前进。
  4. 启动:最后一行 main() 调用主函数,程序开始运行。

运行一下,你会看到程序飞快地打印出52行记录,最后一行正是我们期待的结果:

第1周,存入10元,账户累计10元
第2周,存入20元,账户累计30元
第3周,存入30元,账户累计60元
...
第52周,存入520元,账户累计13780元

是不是很有成就感?一个简单的循环,就模拟了一整年的储蓄计划!

三、回顾与思考:我们做到了什么?

在这个1.0版本中,我们成功运用了之前学过的知识,构建了一个完整的、有实际意义的程序。我们复习了:

  • while 循环:用于重复执行“存钱-记录-更新”这个固定流程52次。
  • 复合赋值运算符(+=):让 saving = saving + money_per_week 这种自身累加的操作变得更简洁。
  • 字符串格式化输出(.format()):让输出的信息清晰、美观、易读。

更重要的是,我们实践了 “输入-处理-输出” 的编程思维。先想清楚需要哪些数据,再设计如何处理这些数据,最后规划好结果的呈现方式。这个思维框架能帮你应对绝大多数编程任务。


📝 动手练一练

  1. 调整挑战计划:如果我觉得每周多存10元压力太大,想改成每周多存5元(第一周还是10元)。只需要修改代码中的一个数字,应该改哪里?改完后,第52周需要存多少钱?一年总共能存下多少?

  2. 反向挑战:有人喜欢“先苦后甜”,想第一周存最多,之后每周少存10元(即第一周520元,第二周510元……第52周10元)。你能修改上面的程序来实现这个“递减版”的52周存钱挑战吗?提示:思考 increase_money 应该是什么值?money_per_week 的更新方式要如何变化?

👉 点击查看参考答案

1. 调整为每周递增5元: 只需将 increase_money 变量的值从 10 改为 5。

increase_money = 5  # 每周递增金额改为5元

改完后运行程序,最后一行输出会变成:

第52周,存入265元,账户累计7150元

(计算过程:第一周10元,每周加5元,第52周存 10 + 51*5 = 265元;总存款为 (10+265)×52÷2 = 275×26 = 7150元)

2. 实现“递减版”挑战: 思路是“第一周存最多,每周减少”。我们需要:

  • 将 money_per_week 初始值设为 520(第一周的最大金额)。
  • 将 increase_money 设为 -10(因为每周是减少10元)。
  • 循环体内的更新语句不变,依然是 money_per_week += increase_money,由于 increase_money 是负数,所以实现递减。

关键修改代码如下:

def main():
    money_per_week = 520   # 第一周存入520元
    increase_money = -10   # 每周递减10元
    total_week = 52
    i = 1
    saving = 0

    while i <= total_week:
        saving += money_per_week
        print('第{}周,存入{}元,账户累计{}元'.format(i, money_per_week, saving))
        money_per_week += increase_money  # 这里会执行 520 + (-10), 510 + (-10)...
        i += 1

main()
第1周,存入520元,账户累计520元
第2周,存入510元,账户累计1030元
第3周,存入500元,账户累计1530元
第4周,存入490元,账户累计2020元
第5周,存入480元,账户累计2500元
第6周,存入470元,账户累计2970元
第7周,存入460元,账户累计3430元
第8周,存入450元,账户累计3880元
第9周,存入440元,账户累计4320元
第10周,存入430元,账户累计4750元
第11周,存入420元,账户累计5170元
第12周,存入410元,账户累计5580元
第13周,存入400元,账户累计5980元
第14周,存入390元,账户累计6370元
第15周,存入380元,账户累计6750元
第16周,存入370元,账户累计7120元
第17周,存入360元,账户累计7480元
第18周,存入350元,账户累计7830元
第19周,存入340元,账户累计8170元
第20周,存入330元,账户累计8500元
第21周,存入320元,账户累计8820元
第22周,存入310元,账户累计9130元
第23周,存入300元,账户累计9430元
第24周,存入290元,账户累计9720元
第25周,存入280元,账户累计10000元
第26周,存入270元,账户累计10270元
第27周,存入260元,账户累计10530元
第28周,存入250元,账户累计10780元
第29周,存入240元,账户累计11020元
第30周,存入230元,账户累计11250元
第31周,存入220元,账户累计11470元
第32周,存入210元,账户累计11680元
第33周,存入200元,账户累计11880元
第34周,存入190元,账户累计12070元
第35周,存入180元,账户累计12250元
第36周,存入170元,账户累计12420元
第37周,存入160元,账户累计12580元
第38周,存入150元,账户累计12730元
第39周,存入140元,账户累计12870元
第40周,存入130元,账户累计13000元
第41周,存入120元,账户累计13120元
第42周,存入110元,账户累计13230元
第43周,存入100元,账户累计13330元
第44周,存入90元,账户累计13420元
第45周,存入80元,账户累计13500元
第46周,存入70元,账户累计13570元
第47周,存入60元,账户累计13630元
第48周,存入50元,账户累计13680元
第49周,存入40元,账户累计13720元
第50周,存入30元,账户累计13750元
第51周,存入20元,账户累计13770元
第52周,存入10元,账户累计13780元

运行后,第一周输出 第1周,存入520元,账户累计520元,最后一周输出 第52周,存入10元,账户累计13780元。你会发现,无论递增还是递减,只要首尾对称,一年下来的总存款是一样的,都是13780元!这就是等差数列的奇妙之处。


本章小结

恭喜你完成了“52周存钱挑战”的1.0版本!你不仅用程序模拟了一个流行的储蓄游戏,更重要的是,你巩固了循环和输出的核心技能,并学会了如何将一个生活问题系统地拆解成编程步骤。

📋 行动清单

  • 运行代码:把本讲的代码复制到你的编辑器中,运行它,亲眼看看“财富”是如何一周周积累起来的。
  • 动手修改:尝试完成“动手练一练”中的两个小挑战,通过修改代码来验证你的想法。
  • 思考延伸:我们现在的程序把结果直接打印在屏幕上。如果你想随时查看第30周存了多少钱,方便吗?下一讲,我们将学习一种强大的“记忆”工具,来完美解决这个问题。

—— 小象教研组

配套资料 · 直接下载

课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。

  • 第5章代码包:52周存钱挑战(含全部版本 5 个 .py)
    ZIP · 3KB
    下载
看图文没弄懂?展开看本节视频讲解(约 16 分钟)
📺 正在播放小象学院官方高清录播(支持倍速与清晰度调节)