一、for语句用于遍历序列的元素(如一个字符串,元组或列表)或其他可以迭代的对象。
基础
示例代码
list = [1,2,3,4,5] # for 迭代器 in 列表: for x in list: print(x, end=',')
输出内容
1,2,3,4,5,
结论
利用for循环可以对列表进行逐个访问, 每次向列表中取出一个元素,拷贝给迭代器。
深入
for循环有个计数器
示例代码
list = [1, 2, 3, 4, 5] for x in list: list.pop(0) print(x, end= " : ") print(list)
输出内容
1 : [2, 3, 4, 5] 3 : [3, 4, 5] 5 : [4, 5]
逻辑描述
循环取列表中的每个元素, 第一次循环: 取第一个元素(值:1) 弹出(pop) 下标为0的元素(值:1) 打印:1 : [2, 3, 4, 5] 第二次循环: 取第二个元素(值:3) 弹出(pop) 下标为0的元素(值:2) 打印:3 : [3, 4, 5] 第三次循环: 取第三个元素(值:5) 弹出(pop) 下标为0的元素(值:3) 打印:5 : [4, 5]
总结
每次弹出首个元素,
x
还是会正常取到 n + 1 位置的元素值,说明 for 循环中有一个隐藏的计数器,来记录当前读到第几个元素了。
是拷贝不是元素本身
示例代码
list = [1,2,3,4,5] for x in list: list.pop(0) print(" old: ", end=str(x)) x = 1 print(" new: ", end=str(x)) print(" new list: ", end=str(list)) print()
输出内容
old: 1 new: 1 new list: [2, 3, 4, 5] old: 3 new: 1 new list: [3, 4, 5] old: 5 new: 1 new list: [4, 5]
总结
每次修改元素
x
列表本身并没有修改,说明x
不是元素本身,而是元素的拷贝。
如何修改列表本身
示例代码 1
list = [1,2,3,4,5] for x in range(len(list)): print(list, end=' : ') print(list[x]) list.pop(0)
输出错误:因为它并不是迭代器,它是访问元素本身,因为list在每次循环时,都弹出元素,当list访问到不存在的下标元素时,发生了错误。
示例代码 2
list = [1, 2, 3, 4, 5] for x in range(len(list)): print(list, end=' : ') list[x] = 1 print(list[x])
输出内容
[1, 2, 3, 4, 5] : 1 [1, 2, 3, 4, 5] : 1 [1, 1, 3, 4, 5] : 1 [1, 1, 1, 4, 5] : 1 [1, 1, 1, 1, 5] : 1
总结
从代码中可以看出,这是一个典型的迭代器,它具备计数功能。
每一次for循环,它的计数器都会加 1,若访问到了下个元素,则拷贝其值到迭代器 x 中,若访问不到下个元素,则退出当前循环。它访问的不是元素本身,而是元素的拷贝。
二、for else
用 break
关键字终止当前循环就不会执行当前的 else
语句,而使用 continue
关键字快速进入下一论循环,或者没有使用其他关键字,循环的正常结束后,就会触发 else
语句。
触发 else
正常结束的循环
list = [1,2,3,4,5] for x in list: print(x) else: print("else")
使用 continue 关键字
list = [1,2,3,4,5] for x in list: continue print(x) else:
不触发 else
list = [1,2,3,4,5]
for x in list:
print(x)
break
else:
print("else")
总结
for else语句可以总结成以下话。
如果我依次做完了所有的事情(for正常结束),我就去做其他事(执行else),若做到一半就停下来不做了(中途遇到break),我就不去做其他事了(不执行else)。
- 只有循环完所有次数,才会执行
else
。 break
可以阻止else
语句块的执行。