系列文章
Python 从入门到精通
第 6 / 36 篇
从环境安装和基础语法出发,逐步学习工程实践、自动化、数据处理与 Web 开发。
-
01
Python 怎么装、怎么用 -
02
变量、数字和字符串 -
03
列表:把一组数据放在一起 -
04
元组、集合和字典 -
05
条件判断:让程序做选择 -
06
循环:重复的事交给程序正在阅读 -
07
函数:把代码整理成可复用的块 -
08
模块与包:拆分你的程序 -
09
输入、输出与字符串格式化 -
10
文件读写:保存程序的数据 -
11
异常处理:程序出错时怎么办 -
12
基础阶段练习:命令行记账本 -
13
类和对象:面向对象入门 -
14
继承、组合与特殊方法 -
15
迭代器与生成器 -
16
列表推导式与生成器表达式 -
17
装饰器:给函数增加能力 -
18
上下文管理器与 with -
19
类型标注与 dataclass -
20
正则表达式:从文本中找规律 -
21
日期、时间与时区 -
22
日志与调试 -
23
虚拟环境与依赖管理 -
24
测试:让修改不再提心吊胆 -
25
网络请求:用 Python 调用 API -
26
网页解析与合规采集 -
27
操作 Excel、CSV 与批量文件 -
28
SQLite:给程序加一个数据库 -
29
数据分析入门:NumPy 与 Pandas -
30
画图:把数据变得直观 -
31
Flask 入门:做一个小网站 -
32
异步编程:同时处理多项任务 -
33
线程、进程与并发选择 -
34
性能分析与优化 -
35
项目结构、配置与发布 -
36
综合项目:从需求到上线
上一篇让程序学会了”选路”,这一篇让它学会重复干活。写代码最爽的时刻之一,就是发现”这种事让循环干就行”。Python 有两种循环:for 和 while。
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 先想好退出条件
练习
- 用 for 循环求 1 到 100 的和(提示:累加变量)
- 用 while 循环写一个”猜数字”游戏:程序心里想一个 1-100 的数,你猜,它提示大了/小了,直到猜中(提示:random.randint)
- 思考:
for i in range(3):循环结束后i的值是多少?如果在循环里i = 100,会影响循环次数吗?