系列文章

Python 从入门到精通

第 6 / 36 篇

从环境安装和基础语法出发,逐步学习工程实践、自动化、数据处理与 Web 开发。

  1. 01
    Python 怎么装、怎么用
  2. 02
    变量、数字和字符串
  3. 03
    列表:把一组数据放在一起
  4. 04
    元组、集合和字典
  5. 05
    条件判断:让程序做选择
  6. 06
    循环:重复的事交给程序正在阅读
  7. 07
    函数:把代码整理成可复用的块
  8. 08
    模块与包:拆分你的程序
  9. 09
    输入、输出与字符串格式化
  10. 10
    文件读写:保存程序的数据
  11. 11
    异常处理:程序出错时怎么办
  12. 12
    基础阶段练习:命令行记账本
  13. 13
    类和对象:面向对象入门
  14. 14
    继承、组合与特殊方法
  15. 15
    迭代器与生成器
  16. 16
    列表推导式与生成器表达式
  17. 17
    装饰器:给函数增加能力
  18. 18
    上下文管理器与 with
  19. 19
    类型标注与 dataclass
  20. 20
    正则表达式:从文本中找规律
  21. 21
    日期、时间与时区
  22. 22
    日志与调试
  23. 23
    虚拟环境与依赖管理
  24. 24
    测试:让修改不再提心吊胆
  25. 25
    网络请求:用 Python 调用 API
  26. 26
    网页解析与合规采集
  27. 27
    操作 Excel、CSV 与批量文件
  28. 28
    SQLite:给程序加一个数据库
  29. 29
    数据分析入门:NumPy 与 Pandas
  30. 30
    画图:把数据变得直观
  31. 31
    Flask 入门:做一个小网站
  32. 32
    异步编程:同时处理多项任务
  33. 33
    线程、进程与并发选择
  34. 34
    性能分析与优化
  35. 35
    项目结构、配置与发布
  36. 36
    综合项目:从需求到上线

查看整个系列 →

上一篇让程序学会了”选路”,这一篇让它学会重复干活。写代码最爽的时刻之一,就是发现”这种事让循环干就行”。Python 有两种循环:forwhile

for 循环:遍历一切

for 的格式:for 变量 in 可迭代对象:,把对象里的元素一个一个取出来用:

for name in ["小明", "小红", "小刚"]:
    print(f"{name} 来签到")
# 字符串也能遍历
for ch in "南山":
    print(ch)  # 南 / 山

range:生成数字序列

要循环固定次数,用 range()

for i in range(5):
    print(i)        # 0 1 2 3 4(从 0 开始,不含 5)
for i in range(1, 6):
    print(i)        # 1 2 3 4 5
for i in range(0, 10, 2):
    print(i)        # 0 2 4 6 8(步长 2)
for i in range(5, 0, -1):
    print(i)        # 5 4 3 2 1(倒着数)

左闭右开又来了:range(1, 6) 含 1 不含 6。和切片规则一致,记一次用一辈子。

while 循环:条件成立就一直干

count = 3
while count > 0:
    print(f"倒计时 {count}")
    count -= 1      # 别忘了更新条件!否则死循环
print("发射!")

while 适合”不知道要循环多少次,看条件”的场景,比如等用户输入对了为止:

password = ""
while password != "123456":
    password = input("请输入密码:")
print("欢迎回来")

break 和 continue

两个循环控制语句:

  • break立刻结束整个循环
  • continue跳过本次,进入下一次
# break:找到第一个偶数就停
for n in [1, 3, 5, 6, 7, 9]:
    if n % 2 == 0:
        print(f"找到偶数 {n}")
        break

# continue:跳过偶数,只打印奇数
for n in range(1, 8):
    if n % 2 == 0:
        continue
    print(n)  # 1 3 5 7

循环的 else:没被 break 打断才执行

Python 有个别的语言没有的特性——循环可以带 else,循环正常走完(没被 break)才执行:

for n in range(2, 10):
    for i in range(2, n):
        if n % i == 0:
            break
    else:
        print(f"{n} 是质数")  # 2 3 5 7

这个特性很适合”找东西没找到”的场景,比设 flag 变量干净。

enumerate:同时拿下标和值

fruits = ["苹果", "香蕉", "橘子"]
for i, fruit in enumerate(fruits):
    print(f"{i + 1}. {fruit}")
1. 苹果
2. 香蕉
3. 橘子

嵌套循环

循环里套循环,比如打印九九乘法表:

for i in range(1, 10):
    for j in range(1, i + 1):
        print(f"{j}x{i}={i * j}", end="t")
    print()

外层走一次,内层走完整一轮。嵌套别太深(超过 2-3 层可读性就很差了)。

新手坑

坑 1:死循环。while True: 忘了写 break,或者条件永远不变,程序就卡死了。写 while 先想好”怎么让它停下来”。

坑 2:遍历时删除元素。for 循环里直接删列表元素会跳项。要过滤就建新列表。

坑 3:循环变量用完还惦记着。循环结束后 i 还保留最后一个值,别依赖它。

坑 4:无限循环里跑网络请求。会耗尽资源,循环里加 sleep 或次数上限。

小结

  • for 遍历可迭代对象(列表/字符串/字典/range),while 按条件循环
  • range(start, stop, step) 左闭右开生成数字序列
  • break 结束循环,continue 跳过本次
  • 循环 else:正常走完才执行,break 打断则不执行
  • enumerate 同时取下标和值;写 while 先想好退出条件

练习

  1. 用 for 循环求 1 到 100 的和(提示:累加变量)
  2. 用 while 循环写一个”猜数字”游戏:程序心里想一个 1-100 的数,你猜,它提示大了/小了,直到猜中(提示:random.randint)
  3. 思考:for i in range(3): 循环结束后 i 的值是多少?如果在循环里 i = 100,会影响循环次数吗?