查看全课大纲(第 16 / 51 节)
  1. 1.Python 是什么?为什么值得学?
  2. 2.如何为 Python 编程准备一个“全家桶”环境?
  3. 3.Python 有哪几种执行方法?
  4. 4.行与缩进到底有什么用?
  5. 5.注释有什么用,怎么写?
  6. 6.变量:如何给数据起个好名字?
  7. 7.运算符的优先级和常见坑点是什么?
  8. 8.Python 中,数字和布尔值究竟有哪几种?
  9. 9.输入函数 `input()` 和文件读取 `open()` 怎么用?
  10. 10.如何将程序的结果展示给用户或保存下来?
  11. 11.CSV 文件怎么读怎么写才方便?
  12. 12.列表是什么,如何创建和访问它?
  13. 13.列表的修改操作,有哪些方法?
  14. 14.列表切片为什么能取到部分元素?排序和查找又该怎么用?
  15. 15.判断语句:如何让程序根据条件做不同的事?
  16. 16.for 循环如何遍历序列中的元素?
  17. 17.while 循环什么时候才会停?
  18. 18.while 循环的结束条件,你写对了吗?
  19. 19.循环中途想提前结束,怎么办?
  20. 20.`break` 和 `continue` 到底有什么区别?
  21. 21.列表推导式如何让代码更简洁高效?
  22. 22.字符串怎么定义、拼接和操作?
  23. 23.元组:为什么定义单个元素时要加逗号?
  24. 24.集合(set)怎么用?如何快速去重和做集合运算?
  25. 25.字典是什么,为什么比列表更方便?
  26. 26.字典的增删改查与遍历,如何避免 KeyError?
  27. 27.函数里的变量,为什么有的能用有的不能用?
  28. 28.在函数内部修改全局变量,为什么有时不生效?
  29. 29.函数里能修改全局变量吗?返回值怎么用?
  30. 30.匿名函数:如何用 lambda 快速定义简单函数?
  31. 31.面向对象编程是什么,为什么需要它?
  32. 32.类中的方法和属性到底怎么定义和使用?
  33. 33.如何控制对对象内部属性和方法的访问?
  34. 34.异常发生时,程序会怎样继续执行?
  35. 35.如何组织代码:包和模块
  36. 36.`if __name__ == '__main__'` 到底有什么用?
  37. 37.如何用 IDE 的 Debug 功能排查程序错误?
  38. 38.Matplotlib 绘图的第一步该做什么?
  39. 39.Figure 是什么,如何设置图形尺寸?
  40. 40.如何自定义 Matplotlib 的坐标轴?
  41. 41.如何为图表添加图例,让不同曲线一目了然?
  42. 42.饼图怎么画才能直观展示数据占比?
  43. 43.如何用 Matplotlib 绘制散点图?
  44. 44.柱状图怎么画?
  45. 45.如何使用 Matplotlib 绘制等高线图?
  46. 46.如何在 Matplotlib 中绘制子图?
  47. 47.zip 函数如何把多个列表“打包”在一起?
  48. 48.如何给可迭代对象加上索引?
  49. 49.random 模块如何生成随机数?
  50. 50.math 模块怎么用?
  51. 51.Counter 如何快速统计元素出现次数?

for 循环如何遍历序列中的元素?

约 15 分钟

小象实战讲义 · Python 编程从入门到实践

在实际编程中,我们经常需要让一段代码反复执行,以完成特定的任务,例如对一系列数据进行处理。for 循环是 Python 中实现这种重复执行逻辑的主要工具之一。本节将系统讲解 for 循环的语法、执行流程,以及如何配合 range() 函数使用。学完本节,你将能够使用 for 循环遍历列表、字典等序列,并理解其内部工作过程。

💡 核心导读

  • for 循环的语法:for 临时变量 in 序列:,用于遍历序列中的每个元素。
  • 执行流程:依次从序列中取出元素,赋值给临时变量,执行循环体代码,直到序列遍历完毕。
  • range() 函数:用于生成一个整数序列,常与 for 循环搭配使用,控制循环次数。
  • 循环嵌套:在一个 for 循环内部可以再包含另一个 for 循环,用于处理更复杂的逻辑。

for 循环的基本语法与执行流程

for 循环的语法格式如下:

for 临时变量 in 序列:
    循环体代码块
  • 临时变量:由用户自定义,用于在每次循环中接收序列中的当前元素。
  • 序列:可以是列表、字典等可遍历的数据结构。
  • 冒号与缩进:for 语句以冒号 : 结尾,其下方缩进的代码块即为循环体。

它的执行流程遵循以下步骤:

  1. 当代码执行到 for 语句时,会尝试从序列中取出第一个元素。
  2. 如果成功取出元素,则将其赋值给临时变量,然后进入循环体执行代码。
  3. 循环体代码执行完毕后,程序会回到 for 语句开头,尝试取出序列中的下一个元素。
  4. 重复步骤 2 和 3,直到序列中所有元素都被处理完毕。
  5. 当序列中没有下一个元素时,循环结束,程序继续执行 for 循环之后的代码。

下面的例子清晰地展示了这个过程:

# 定义一个列表作为序列
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# 使用 for 循环遍历列表
for i in numbers:
    print(i)
0
1
2
3
4
5
6
7
8
9

在这个例子中,i 是临时变量,numbers 是序列。循环依次将 numbers 中的每个数字赋值给 i,然后执行 print(i),最终打印出 0 到 9。

使用 range() 函数生成序列

手动列出所有要遍历的数字(如 [0, 1, 2, ..., 9])非常繁琐。range() 函数可以方便地生成一个整数序列。

range() 函数的原型如下:

range(start, stop[, step])
  • start:序列的起始值(包含在序列中)。如果省略,默认为 0。
  • stop:序列的结束值(不包含在序列中)。这是必选参数。
  • step:步长,即序列中相邻两个数字的差值。如果省略,默认为 1。

range() 生成的是一个整数序列,可以直接放在 for 的 in 后面,由循环逐个取出其中的数字。

# 生成 0 到 9 的序列(等同于 range(0, 10, 1))
for i in range(10):
    print(i, end=' ')
print()  # 换行

# 生成 1 到 10 的序列
for i in range(1, 11):
    print(i, end=' ')
print()

# 生成 0 到 30 之间,步长为 5 的序列:0, 5, 10, 15, 20, 25
for i in range(0, 30, 5):
    print(i, end=' ')
print()

# 步长也可以是负数,生成递减序列
for i in range(5, -1, -1):
    print(i, end=' ')
0 1 2 3 4 5 6 7 8 9 
1 2 3 4 5 6 7 8 9 10 
0 5 10 15 20 25 
5 4 3 2 1 0 

重要特性:

  • 左闭右开:range(start, stop) 生成的序列包含 start,但不包含 stop。这是 Python 中一个常见的约定。
  • 空序列:如果 start 大于等于 stop 且步长为正,或者 start 小于等于 stop 且步长为负,range() 将生成一个空序列,for 循环不会执行。

循环嵌套示例:寻找素数

for 循环可以嵌套使用,即在一个循环体内部再写一个 for 循环。一个经典的例子是用两重循环逐个检查因子,找出 100 以内的所有素数(只能被 1 和自身整除的大于1的自然数)。

# 步骤1:初始化一个长度为100的列表,假设所有数都是素数(True)
is_prime = [True] * 100
# 0和1不是素数
is_prime[0] = is_prime[1] = False

# 步骤2:从2开始遍历到99
for i in range(2, 100):
    # 步骤3:对于每个数i,遍历从2到i-1的所有可能因子j
    for j in range(2, i):
        # 步骤4:如果i能被j整除,则i不是素数
        if i % j == 0:
            is_prime[i] = False

# 步骤5:输出所有标记为素数的数
print("100以内的素数有:")
for i in range(2, 100):
    if is_prime[i]:
        print(i, end=' ')
100以内的素数有:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 

代码逻辑解析:

  1. 创建一个布尔列表 is_prime,索引代表数字,值代表该数字是否为素数的假设。
  2. 外层循环 i 遍历所有待检查的数字(2 到 99)。
  3. 内层循环 j 遍历所有可能整除 i 的因子(2 到 i-1)。
  4. 如果 i % j == 0 成立,说明 i 能被 j 整除,不是素数,将 is_prime[i] 设为 False。
  5. 最后,遍历 is_prime 列表,打印出所有值仍为 True 的索引,即为素数。

📝 动手练一练

  1. 计算累加和:使用 for 循环和 range() 函数,计算 1 到 100 之间所有整数的和。
👉 点击查看参考答案

思路:初始化一个变量用于保存总和。使用 for 循环遍历 range(1, 101),将每个数加到总和变量上。

total = 0
for num in range(1, 101):
    total += num
print("1到100的和是:{}".format(total))
1到100的和是:5050

常见错误

错误写法现象或报错原因正确写法
for i in range(10):
print(i)
IndentationError: expected an indented block after 'for' statement on line 1for 循环体必须缩进。print(i) 与 for 语句对齐,Python 认为循环体为空。for i in range(10):
print(i)
for i in range(5, 1):
print(i)
无输出range(5, 1) 默认步长为 1,起始值大于结束值,生成空序列。循环一次也不执行。for i in range(5, 1, -1):
print(i)
for i in range(10)
print(i)
SyntaxError: expected ':'for 语句末尾缺少了冒号 :。for i in range(10):
print(i)
my_list = [1, 2, 3]
for i in mylist:
print(i)
NameError: name 'mylist' is not defined. Did you mean: 'my_list'?变量名拼写错误。定义的是 my_list,遍历时却用了 mylist。my_list = [1, 2, 3]
for i in my_list:
print(i)

小结

  • for 临时变量 in 序列: 是 for 循环的标准语法,用于遍历序列中的每个元素。
  • 循环体代码必须通过缩进来定义,通常缩进 4 个空格。
  • range(start, stop[, step]) 函数用于生成一个整数序列,常与 for 循环搭配来控制循环次数。其区间是 左闭右开 的。
  • for 循环可以嵌套,内层循环会在外层循环的每次迭代中完整执行一遍。
  • 遍历时,临时变量会依次被赋值为序列中的元素,可在循环体内使用。

📋 行动清单

  • 将本节寻找素数的代码在环境中运行一遍,并尝试修改代码,找出 200 以内的素数。
  • 编写一个 for 循环,使用 range() 倒序打印 10 到 1 的数字。
  • 思考:如果要遍历一个字典的所有键,for 循环应该怎么写?(提示:直接遍历字典拿到的是键)

—— 小象教研组

配套资料 · 直接下载

课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。

  • 第2章代码包:for循环(含1 个 Notebook)
    ZIP · 711B
    下载