一、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)。

  1. 只有循环完所有次数,才会执行 else
  2. break 可以阻止 else 语句块的执行。