for 循环
约 1258 字大约 4 分钟
2025-04-04
for 循环本质是“遍历一个可迭代对象”,而不是 C/Java 那种带计数器的循环。学好它的关键是熟悉 Python 的迭代生态:range、enumerate、zip、dict 的几种迭代方式,以及不太常用但很有用的 for-else。
- for 是“遍历可迭代对象”,循环变量是赋值结果
- enumerate 同时拿索引和元素
- zip 并行遍历多个序列
- 字典的 items / keys / values 三种迭代方式
- for-else:循环没被 break 时执行
- 1对字符串、列表、字典、文件对象各跑一次 for,确认它们都是可迭代对象。
- 2用 enumerate(lst, start=1) 同时拿到从 1 开始的编号和元素,告别 range(len(lst))。
- 3用 zip(names, ages) 同时遍历两个列表,再试 zip 长度不一致时它会按最短的那个停。
- 4迭代字典时分别用 for k in d、for v in d.values()、for k, v in d.items(),体会三种语义。
- 5写一段“在循环里找符合条件的项,找到 break”,再加 else 子句确认“没找到才走 else”。
与以死循环形式存在的 while 循环不同的是,for 循环往往以有限循环的形式存在。
for 循环的基本结构为:
for i in XXX:
循环体其中,
for:关键字i:变量名in:关键字xxx:可迭代对象
用已有的知识,如果我们想分别打印字符串 'alice' 中的每一个字符,可以使用 while 循环来实现:
python playground
name = 'alice'
count = 0
while count < len(name):
print(name[count])
count += 1这里补充一个知识点,函数 len() 是一个公共方法,它可以获得传入参数的长度:
python playground
name = 'alice'
len(name) # 4如果使用 for 循环,我们可以更简便地实现目的:
python playground
name = 'alice'
for i in name: # 每次循环,for都会把取到的元素赋值给i
print(i) # 打印变量i看下面这样一个例子:
python playground
for i in 'abcde':
pass
print(i)最终打印出来的结果只有一个 e。那是因为 for 循环本质是一个 赋值 操作,每次循环都是将可迭代对象中的一个元素 赋值 给变量。当进行最后一次循环时,字符串 “abcde” 的最后一个元素 “e” 被赋值给了变量 i。循环结束,i 没有被重新 赋值。虽然打印的动作不在循环体中,但不影响打印出 e 的结果。
for 循环打印九九乘法表:
python playground
for i in range(1, 10):
for j in range(1, 10):
if i >= j:
print(f'{j} * {i} = {i * j}', end=' ')
print('')思考题,下面的代码会打印出什么样的结果呢?
python playground
num = 5
count = 1
while num:
for i in 'abc':
print(i + str(count))
count += 1
num -= 1同时拿索引和元素:enumerate
新手最容易写出 for i in range(len(lst)) 然后 lst[i] 这种代码,更地道的写法是 enumerate:
python playground
names = ['alice', 'bob', 'tom']
for idx, name in enumerate(names):
print(idx, name)
# 索引从 1 开始
for idx, name in enumerate(names, start=1):
print(idx, name)并行遍历多个序列:zip
需要同时取两个(或多个)序列的同位置元素时,用 zip:
python playground
names = ['alice', 'bob', 'tom']
ages = [18, 25, 30]
for name, age in zip(names, ages):
print(name, age)zip 会按最短的那个序列停止;如果想按最长的对齐、缺位置补默认值,用 itertools.zip_longest。
迭代字典的三种姿势
字典本身是可迭代的,默认迭代的是键。但实操中更常见的是迭代键值对:
python playground
d = {'name': 'alice', 'age': 18, 'gender': 'female'}
for k in d: # 等价于 for k in d.keys()
print(k)
for v in d.values():
print(v)
for k, v in d.items(): # 最常用:同时拿键和值
print(k, '=', v)for-else:循环没被 break 时执行
for 语句也支持 else 子句,它只在循环正常结束(没被 break 中断)时执行。最经典的用法是“查找”模式:
python playground
data = [1, 3, 5, 7, 9]
target = 4
for x in data:
if x == target:
print(f'找到 {target}')
break
else:
print(f'没找到 {target}')这个特性减少了一个“是否找到”的标志变量,但它的语义和很多语言不同(不是“不进 for 时走 else”),容易让读代码的人困惑,用前先想想可读性。
- Python 的 for 是“遍历可迭代对象”,循环变量来自每次迭代的赋值。
- 需要索引用 enumerate,需要并行多个序列用 zip —— 这两个内置函数能消灭一大半笨拙的循环。
- 字典默认迭代键,items() 拿键值对、values() 拿值,按需选。
- for-else 的 else 只在“没 break 退出”时执行,适合“查找/检查”场景,但可读性需要权衡。
- 改循环时若可能,优先用列表/字典/集合推导式或 sum/any/all 这类内置函数,往往更短更快。
版权所有
版权归属:Shuo Liu
