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

如何让程序自己数数?—— 用 for 循环解放你的双手

约 12 分钟

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

还记得上一节我们留下的那个“小烦恼”吗?为了让程序循环52次,我们得自己手动设置一个计数器 i,每次循环完还得给它加1。这感觉就像你每天存钱,还得自己拿个小本本记今天是第几天,是不是有点麻烦?

这一节,我们就来解决这个麻烦!我们将引入一个“自带计数器”的循环——for 循环。学完这一节,你的存钱挑战程序将变得更加简洁优雅,再也不用操心“数到第几周了”这种琐事。

💡 核心导读

  • 本节新增什么? 只加一件事:用 for 循环替换 while 循环,让程序自己数数。
  • 认识新朋友 for:一个专门用来“遍历”序列(比如列表)的循环。
  • 神器 range():当你想让循环固定跑多少次时,就用它来生成一个“数字序列”。
  • for vs while:了解两种循环的区别,知道什么时候该用谁。
  • 注意小细节:range() 生成的数字是从0开始的,我们得手动加1才能得到“第1周”。

一、while 循环的“小麻烦”回顾

我们先快速回顾一下2.0版本的核心循环部分:

i = 1  # 计数器,从第1周开始
while i <= total_week:  # 只要周数没超过52周,就继续
    # ... 存钱、记录、计算总额 ...
    print(f'第{i}周,存入{money_per_week}元,账户累计{saving}元')
    money_per_week += increase_money
    i += 1  # ⚠️ 关键一步:别忘了把周数加1!

看到了吗?i = 1、i <= total_week、i += 1,这三步构成了一个完整的“手动计数器”。如果我们忘了写 i += 1,程序就会陷入无限循环,永远停不下来!

程序员也是人,也会忘事。有没有一种循环,能帮我们自动管理这个计数器呢?

答案是:有!而且它就在 Python 里等着我们呢。


二、认识“自带计数器”的 for 循环

for 循环在 Python 里有个特别的本事:遍历序列。什么是“遍历”?就是按顺序访问序列里的每一个元素。

它的语法长这样:

for <变量名> in <序列>:
    <循环体要做的事情>
  • <序列>:可以是一个列表,比如我们之前存的 [10, 20, 30, ...]。
  • <变量名>:你随便起个名字,比如 week、money、x 都行。在每次循环时,这个变量会自动被赋值为序列中当前的那个元素。
  • : 和缩进:老规矩,冒号不能少,循环体要缩进。

我们来个最简单的例子,一看就懂:

# 假设我们有一个存钱金额的列表(只取前4周)
money_list_4weeks = [10, 20, 30, 40]

# 用 for 循环遍历这个列表
for money_in_week in money_list_4weeks:
    print(f'本周存入:{money_in_week} 元')

运行一下,看看发生了什么:

本周存入:10 元
本周存入:20 元
本周存入:30 元
本周存入:40 元

神奇的事情发生了: 程序自动循环了4次(因为列表有4个元素)。每次循环,变量 money_in_week 都自动变成了列表里对应的那个数字。我们完全不需要自己写 i=0; i<4; i+=1 这些代码!

这就是 for 循环的核心魅力:你告诉我“遍历谁”,我帮你搞定循环次数和每次取什么值。


三、固定循环次数的神器:range()

高兴之余,你可能会发现一个问题:我们的“52周存钱挑战”在循环开始时,并没有一个现成的 [10, 20, 30, ..., 520] 列表啊!这个列表是我们在循环过程中一边算、一边存进去的。

那我们怎么用 for 循环来跑52次呢?

这就需要请出 for 循环的最佳搭档——range() 函数。

range(n) 会生成一个“可迭代的数字序列”,包含从 0 到 n-1 的 n 个整数。

听起来有点绕?我们直接看代码:

# 看看 range(5) 到底是什么
print( list(range(5)) )  # 用 list() 把它转换成列表,方便查看

输出结果:

[0, 1, 2, 3, 4]

看明白了吗?range(5) 并不是直接给你一个列表,但它能提供 0, 1, 2, 3, 4 这5个数字,供 for 循环依次去取。

所以,如果我们想用 for 循环做5次某件事,可以这样写:

for i in range(5):
    print(f'这是第 {i} 次循环')

输出:

这是第 0 次循环
这是第 1 次循环
这是第 2 次循环
这是第 3 次循环
这是第 4 次循环

⚠️ 重要细节(也是初学者最容易踩的坑): range(n) 是从 0 开始计数的,而不是1!所以 range(5) 给出的是 0,1,2,3,4。

对于我们“第1周、第2周”的需求,我们只需要在打印的时候给 i 加个1就行了:

for i in range(5):
    print(f'这是第 {i+1} 次循环')  # i+1,让输出从1开始
这是第 1 次循环
这是第 2 次循环
这是第 3 次循环
这是第 4 次循环
这是第 5 次循环

四、动手改造!for 循环升级存钱挑战3.0

理论知识够了,现在我们来真刀真枪地改造我们的程序。这是本节唯一新增的核心动作:用 for i in range(total_week): 替换掉原来的 while 循环。

下面是完整的 3.0 版本代码:

"""
    作者:小象教研组
    功能:52周存钱挑战
    版本:3.0
    新增功能:使用 for 循环直接计数,告别手动计数器
"""
import math

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

    money_list = []         # 记录每周存款数的列表

    # 🎉 核心改动在这里!用 for 循环替换 while
    # range(total_week) 会生成 0, 1, 2, ..., 51 共52个数字
    for i in range(total_week):
        # 1. 记录本周要存的钱
        money_list.append(money_per_week)

        # 2. 计算累计总额(使用math.fsum提高精度)
        saving = math.fsum(money_list)

        # 3. 输出本周信息
        # 注意:i 从0开始,所以第几周 = i + 1
        print('第{}周,存入{}元,账户累计{}元'.format(i + 1, money_per_week, saving))

        # 4. 更新下一周的存钱金额
        money_per_week += increase_money

# 程序从这里开始执行
main()
第1周,存入10元,账户累计10.0元
第2周,存入20元,账户累计30.0元
第3周,存入30元,账户累计60.0元
第4周,存入40元,账户累计100.0元
第5周,存入50元,账户累计150.0元
第6周,存入60元,账户累计210.0元
第7周,存入70元,账户累计280.0元
第8周,存入80元,账户累计360.0元
第9周,存入90元,账户累计450.0元
第10周,存入100元,账户累计550.0元
第11周,存入110元,账户累计660.0元
第12周,存入120元,账户累计780.0元
第13周,存入130元,账户累计910.0元
第14周,存入140元,账户累计1050.0元
第15周,存入150元,账户累计1200.0元
第16周,存入160元,账户累计1360.0元
第17周,存入170元,账户累计1530.0元
第18周,存入180元,账户累计1710.0元
第19周,存入190元,账户累计1900.0元
第20周,存入200元,账户累计2100.0元
第21周,存入210元,账户累计2310.0元
第22周,存入220元,账户累计2530.0元
第23周,存入230元,账户累计2760.0元
第24周,存入240元,账户累计3000.0元
第25周,存入250元,账户累计3250.0元
第26周,存入260元,账户累计3510.0元
第27周,存入270元,账户累计3780.0元
第28周,存入280元,账户累计4060.0元
第29周,存入290元,账户累计4350.0元
第30周,存入300元,账户累计4650.0元
第31周,存入310元,账户累计4960.0元
第32周,存入320元,账户累计5280.0元
第33周,存入330元,账户累计5610.0元
第34周,存入340元,账户累计5950.0元
第35周,存入350元,账户累计6300.0元
第36周,存入360元,账户累计6660.0元
第37周,存入370元,账户累计7030.0元
第38周,存入380元,账户累计7410.0元
第39周,存入390元,账户累计7800.0元
第40周,存入400元,账户累计8200.0元
第41周,存入410元,账户累计8610.0元
第42周,存入420元,账户累计9030.0元
第43周,存入430元,账户累计9460.0元
第44周,存入440元,账户累计9900.0元
第45周,存入450元,账户累计10350.0元
第46周,存入460元,账户累计10810.0元
第47周,存入470元,账户累计11280.0元
第48周,存入480元,账户累计11760.0元
第49周,存入490元,账户累计12250.0元
第50周,存入500元,账户累计12750.0元
第51周,存入510元,账户累计13260.0元
第52周,存入520元,账户累计13780.0元

运行一下,你会看到和 2.0 版本总金额完全相同的计算结果(每周的数值和最终累计都一致;只是个别数字的小数显示格式可能略有差别,比如 10.0 与 10.00),但代码更清爽了!

新旧对比,高下立判:

特性while 循环 (2.0)for 循环 (3.0)
计数器初始化需要手动 i = 1无需,range() 自动生成
循环条件需手动判断 i <= total_week无需,遍历完 range() 自动停止
计数器更新需手动 i += 1无需,for 自动步进
代码行数多出3行管理计数器的代码循环头一行搞定
犯错风险容易忘记更新 i,导致无限循环几乎不会出错

一句话总结:当你知道循环要执行多少次时,for 循环是更简单、更安全的选择。


五、for 与 while,我该用哪个?

现在你掌握了两种循环,可能会困惑:以后到底用哪个?

记住这个简单的原则:

  • 用 for 循环:当你提前知道循环要执行多少次,或者你要遍历一个现有的序列(列表、字符串等)时。
    • 例子:循环52周、遍历一个名字列表、处理字符串中的每个字符。
  • 用 while 循环:当循环次数不确定,需要根据某个条件是否成立来决定是否继续时。
    • 例子:让用户反复输入密码直到正确、游戏循环直到玩家退出、监控某个状态直到发生变化。

我们的“52周存钱挑战”明显属于第一种情况——固定52次。所以,for 循环是更优雅的解决方案。


📝 动手练一练

  1. 体验 range():写一段代码,使用 for 循环和 range() 打印出 10, 20, 30, 40, 50 这个序列。提示:思考 range() 的起点、终点和步长。
  2. 遍历字符串:创建一个字符串 my_hobby = "编程",使用 for 循环遍历它,并打印出每一个字。你发现了什么?
  3. 小挑战:如果我想从第10周开始存钱,存到第20周(共11周),每周存100元,不递增。用 for 循环怎么写?range() 的参数应该怎么设置?
👉 点击查看第1题参考答案

range(5) 只能生成 0,1,2,3,4。要得到 10,20,30,40,50,我们需要让循环变量 i 依次等于 1,2,3,4,5,然后在循环体内乘以10。

for i in range(1, 6):  # 生成 1,2,3,4,5
    print(i * 10)
10
20
30
40
50
👉 点击查看第2题参考答案

字符串在 Python 中也可以被看作一个字符序列,for 循环可以直接遍历它。

my_hobby = "编程"
for char in my_hobby:
    print(char)

输出:

编
程

你会发现,for 循环把字符串里的每个字符(包括汉字)都单独取出来了。

👉 点击查看第3题参考答案

思路:循环变量 i 代表“相对周数”,我们需要把它映射到“实际周数”(第10到20周)。可以用 range(11) 得到0到10,然后 实际周数 = i + 10。

total = 0
for i in range(11):  # 循环11次,i 从0到10
    current_week = i + 10  # 实际是第10周到第20周
    total += 100
    print(f'第{current_week}周,存入100元,累计{total}元')
第10周,存入100元,累计100元
第11周,存入100元,累计200元
第12周,存入100元,累计300元
第13周,存入100元,累计400元
第14周,存入100元,累计500元
第15周,存入100元,累计600元
第16周,存入100元,累计700元
第17周,存入100元,累计800元
第18周,存入100元,累计900元
第19周,存入100元,累计1000元
第20周,存入100元,累计1100元

本章小结

恭喜!你的“编程工具箱”里又多了一件利器——for 循环。它让处理固定次数的重复任务变得轻而易举。

📋 行动清单

学完立刻可以做的几件事:

  • 运行一遍3.0的完整代码,感受 for 循环的简洁。
  • 修改参数玩玩看,比如把 total_week = 52 改成 26,看看存半年的结果。
  • 思考一下,你生活中还有哪些事情是固定重复、可以用 for 循环来描述的?(比如:背诵单词10遍、给通讯录里10个朋友发祝福)。

现在,我们的程序虽然聪明了,但还有点“死板”——金额、周数都是写死在代码里的。下一节,我们将让它“活”起来,学习如何让用户自己输入这些参数,并把整个功能打包成一个整洁的“函数”。敬请期待!

—— 小象教研组

配套资料 · 直接下载

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

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