查看全课大纲(第 22 / 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.空气质量数据怎么“洗”干净,还能画成图?

如何用列表记录每一周的存款?

约 19 分钟

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

还记得上一节我们完成的“52周存钱挑战”吗?我们成功算出了一年能存下13780元,但程序就像一个健忘的会计,算完就忘,没有留下任何“存钱流水账”。这一节,我们要给程序加上一个“记账本”,让它不仅能算出总数,还能清清楚楚地记下每一周到底存了多少钱。学完这一节,你的程序将拥有“记忆”功能!

💡 核心导读

  • 新增功能:学会用“列表”这个强大的“记账本”来记录每周的存款金额。
  • 核心新知:认识Python中的“列表”(list),学习如何创建、添加元素和求总和。
  • 趣味点:你的程序不再“健忘”,它能记住你存钱的每一步,就像一个真正的储蓄罐。
  • 平滑过渡:我们只做一件事——把原来直接累加的方式,改成先记录再求和。

从“健忘”到“记账”:为什么需要列表?

在1.0版本中,我们的程序是这样的逻辑:第一周存10元,累计就是10元;第二周存20元,累计就是10+20=30元……它只关心最后的“累计”这个结果,至于每一周具体存了多少,它并没有保存下来。

这就像你只知道自己钱包里总共有多少钱,但说不清里面每张钞票是什么时候放进去的。如果我们想看看“第10周我存了多少钱?”或者“哪一周存得最多?”,原来的程序就无能为力了。

所以,2.0版本的核心任务非常明确:我们要记录下每一周的存款金额。

那么,用什么来记录一系列的数据呢?在Python里,我们有一个非常趁手的工具——列表(list)。

认识你的“记账本”:Python列表

你可以把列表想象成一个可以装很多东西的“容器”或者“记账本”。这个“记账本”有以下几个特点:

  1. 有序:里面的东西是按顺序放的,第一格、第二格……清清楚楚。
  2. 灵活:可以放数字(10, 20)、文字(‘第一周’),甚至混合着放。
  3. 易访问:通过“位置编号”(索引)可以快速找到任何一格里的东西。

创建你的第一个列表

创建一个列表非常简单,用方括号 [] 把元素括起来,中间用逗号隔开。

# 创建一个记录前三周存款的列表
week_savings = [10, 20, 30]
print(week_savings)
[10, 20, 30]

如果想创建一个空的“记账本”(就像我们程序一开始那样),直接写一对空方括号就行。

# 创建一个空的列表,准备开始记账
money_list = []
print("初始的记账本是空的:", money_list)
初始的记账本是空的: []

往“记账本”里添加记录:.append()

有了空的记账本,我们怎么往里添加每周的存款记录呢?用 .append() 方法。它的作用就是:在列表的末尾添加一个新元素。

money_list = []  # 空记账本

# 第一周,存入10元
money_list.append(10)
print("第一周后:", money_list)

# 第二周,存入20元
money_list.append(20)
print("第二周后:", money_list)

# 第三周,存入30元
money_list.append(30)
print("第三周后:", money_list)
第一周后: [10]
第二周后: [10, 20]
第三周后: [10, 20, 30]

看,我们的“记账本” money_list 变得越来越厚了!append 这个词就是“附加、添加”的意思,非常形象。

升级存钱程序:引入列表和数学库

现在,我们有了“记账本”(列表)和“记账笔”(.append()),可以来改造我们的52周存钱程序了。

本节新增的核心改动就是:用一个列表来记录每周存款,而不是直接累加。

同时,为了能方便地计算列表里所有数字的总和(也就是我们的总存款),我们需要请出一个新帮手——Python的 math库。它里面有一个叫 fsum 的函数,专门用来对列表这样的集合里的数字进行精确的求和。

第一步:导入数学工具箱

在程序开头,我们告诉Python:“我要用数学工具箱里的工具”。

import math  # 导入数学库

第二步:写出2.0版本的完整程序

我们把1.0版本的程序复制过来,然后进行关键改造:

  1. 增加一个空的 money_list 作为记账本。
  2. 在每周循环里,不再用 saving += money_per_week,而是:
    • 用 money_list.append(money_per_week) 把本周金额记到本子上。
    • 用 saving = math.fsum(money_list) 重新计算当前总金额(把本子上所有数字加起来)。
"""
    作者:小象教研组
    功能:52周存钱挑战
    版本:2.0
    新增功能:记录每周的存款数
"""
import math  # 导入数学库,为了使用fsum函数求和

def main():
    # 初始化参数
    money_per_week = 10     # 第1周存入的金额
    increase_money = 10     # 每周递增的金额
    total_week = 52         # 总共的周数
    current_week = 1        # 当前周数
    saving = 0              # 账户累计总金额

    money_list = []         # 新增!记录每周存款数的列表(我们的记账本)

    while current_week <= total_week:
        # 核心改造部分开始
        # 1. 记录:把本周要存的钱记到"记账本"里
        money_list.append(money_per_week)

        # 2. 计算:把记账本里所有的钱加起来,得到当前总金额
        saving = math.fsum(money_list)
        # 核心改造部分结束

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

        # 更新下一周的存钱金额和周数
        money_per_week += increase_money
        current_week += 1

# 为了让代码能直接运行,我们在这里调用主函数
main()

运行这个程序,你会得到和1.0版本一样的总金额,但程序内部已经发生了质的变化——它现在拥有完整的“记忆”了!

第1周,存入10元,账户累计10.00元
第2周,存入20元,账户累计30.00元
第3周,存入30元,账户累计60.00元
...
第52周,存入520元,账户累计13780.00元

程序是如何“记忆”的? 让我们模拟一下程序的前几周:

  • 第1周开始:money_list = [] (空)
  • 第1周存入后:money_list.append(10) → money_list 变成 [10] → math.fsum([10]) 结果是 10.0
  • 第2周存入后:money_list.append(20) → money_list 变成 [10, 20] → math.fsum([10, 20]) 结果是 30.0
  • 第3周存入后:money_list.append(30) → money_list 变成 [10, 20, 30] → math.fsum([10, 20, 30]) 结果是 60.0

看,money_list 这个列表就像录像一样,完整记录下了 [10, 20, 30, ...] 每一帧(每一周)的画面。

列表的“超能力”:更多常用操作

列表除了能 append(添加),还有很多其他实用的“超能力”。了解它们,能让你的“记账本”变得更强大。

我们来快速认识一下(你可以在Python交互环境里逐一尝试):

# 假设我们有一个记账本
my_list = [30, 10, 50, 20, 40]

# 1. 排序:让杂乱的数据变整齐
my_list.sort()
print("排序后:", my_list)  # 输出:[10, 20, 30, 40, 50]

# 2. 反转:倒序查看
my_list.reverse()
print("反转后:", my_list)  # 输出:[50, 40, 30, 20, 10]

# 3. 查找位置:数字30在第几个位置?(注意位置从0开始数)
position = my_list.index(30)
print("30的位置是:", position)  # 输出:2

# 4. 计数:数字20出现了几次?
count = my_list.count(20)
print("20出现了", count, "次")  # 输出:20出现了 1 次

# 5. 删除:删除第一次出现的20
my_list.remove(20)
print("删除20后:", my_list)  # 输出:[50, 40, 30, 10]
排序后: [10, 20, 30, 40, 50]
反转后: [50, 40, 30, 20, 10]
30的位置是: 2
20出现了 1 次
删除20后: [50, 40, 30, 10]

math库的“数学魔法”

我们刚才用到的 math.fsum() 只是数学库 (math) 的冰山一角。这个库就像哆啦A梦的四次元口袋,装满了数学工具。比如:

  • math.pi:精确的圆周率 π。
  • math.ceil(4.2):向上取整,得到 5。
  • math.floor(4.8):向下取整,得到 4。
  • math.sqrt(9):计算平方根,得到 3.0。

你可以通过官方文档探索更多:https://docs.python.org/3/library/math.html

📝 动手练一练

  1. 体验“记账本”:运行上面的2.0版本程序后,如果我想在程序最后打印出“第10周存了多少钱?”,应该怎么做?(提示:列表的位置索引从0开始,第10周的数据在列表的第几个位置?)
👉 点击查看参考答案

思路:列表 money_list 记录了所有周的存款。第10周的数据,在列表中索引是9(因为索引从0开始)。我们可以在循环结束后,通过索引访问它。

# 假设这是程序最后添加的代码
# 注意:这段代码需要放在能访问到 money_list 的地方,比如 main() 函数内部循环结束后
# 这里为了演示,我们单独构造一个列表
money_list = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100] # 模拟前10周数据
week_10_saving = money_list[9] # 获取第10周数据,索引是9
print(f"第10周存了 {week_10_saving} 元")
第10周存了 100 元
  1. 探索小任务:如果我想知道在整个存钱计划中,单周存款超过300元的有几周,利用现在记录好的 money_list,你觉得思路应该是怎样的?(不需要写完整代码,说说你的想法)
👉 点击查看参考答案

思路:我们已经有了包含所有单周存款的列表 money_list。我们可以遍历这个列表,检查每一个元素(即每一周的存款),如果它大于300,就计数一次。最后,这个计数值就是超过300元的周数。

伪代码思路:

  1. 设置一个计数器 count = 0。
  2. 对于 money_list 中的每一个 amount:
    • 如果 amount > 300,那么 count 增加1。
  3. 循环结束后,count 就是答案。

这个功能将在我们学习更多列表操作和循环控制后轻松实现!

本章小结

恭喜!你的“52周存钱挑战”程序成功升级到了2.0版本,获得了关键的“记忆”能力。

📋 行动清单

  • 运行2.0版本的程序,感受它记录每一周存款的过程。
  • 尝试修改程序初始的 money_per_week(比如从20开始)或 increase_money(比如每周递增15),看看你的“记账本” money_list 和最终总额如何变化。
  • 思考:现在的 while 循环需要我们手动用一个变量 current_week 来记录循环到了第几周。Python有没有一种循环,能自动帮我们计数呢?我们下一节揭晓!

—— 小象教研组

配套资料 · 直接下载

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

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