这一篇很关键。很多人学 for 循环时,会很快遇到一个高频搭档:
range()
而且几乎一看到循环,就会反复看见它。
上一篇你已经学会了 for 循环。
你知道 for 的本质,是把一组内容一个一个拿出来处理。
比如:
for char in'Python': print(char)
这很好理解。 因为字符串 'Python' 本来就是一组字符。
可你很快会遇到另一类需求:
打印 1 到 5 重复执行 10 次 输出 0 到 9 从 3 数到 8 每次加 2 的打印数字
这时候问题来了。
这些数字序列,你并没有提前手写成一组内容。 那 for 到底要“遍历”谁?
这时候,range() 就派上用场了。
你可以先记住一句最核心的话:
range() 的作用,就是帮你快速生成一段有规律的整数序列,给 for 循环使用。
这一篇,我们就把它彻底讲透。
一、什么是 range()
先说最直白的理解。
range() 是 Python 里一个专门用来生成数字范围的工具。
比如你想让程序处理:
1、2、3、4、5
你当然可以自己写很多次。 但这太笨了。
range() 可以帮你快速表示:
从哪开始 到哪结束 每次怎么变化
它最大的价值就在于:
让你不用手动写一堆数字, 也能得到一组有规律的整数。
二、为什么 for 循环经常和 range() 一起出现
因为 for 需要“一组可逐个处理的数据”。
字符串可以提供字符序列。 而 range() 则可以提供整数序列。
比如你想打印 5 次欢迎语, 最自然的想法就是:
我要做 5 轮。
那这 5 轮怎么表示出来。 就可以交给 range()。
比如:
for i in range(5): print('欢迎学习 Python')
这段代码就会执行 5 次。
所以你可以把它们的关系理解成:
for 负责一轮一轮处理range() 负责提供这一轮一轮要走的数字
它们经常一起出现,就是因为特别合拍。
三、先看最基础的写法:range(5)
直接看例子:
for i in range(5): print(i)
输出结果会是:
01234
很多新手第一次看到这里都会愣一下。
为什么是 0 到 4, 不是 1 到 5
这就是 range() 最需要先搞明白的地方。
range(5) 的意思不是“生成到 5 为止”。 而是:
从 0 开始 到 5 之前结束
也就是说,包含开头,不包含结尾。
所以:
range(5) 实际得到的是:
0 1 2 3 4
一共 5 个数。
这个规则你一定要尽早习惯。 因为后面会反复用到。
四、可以把 range(5) 理解成“生成 5 个从 0 开始的整数”
这个理解方式特别实用。
很多时候你不用死记“到哪之前结束”这种说法, 你可以先用更朴素的方式理解:
range(5)
就是给你 5 个整数:
第 1 个是 0 第 2 个是 1 第 3 个是 2 第 4 个是 3 第 5 个是 4
所以它一共循环 5 次, 但数字是从 0 开始的。
这也是为什么很多程序里的计数、下标、编号,会经常从 0 开始。 这在 Python 里是很常见的思路。
五、for i in range(5) 里的 i 是什么
比如这段:
for i in range(5): print(i)
这里的 i 是一个变量。 它在每一轮循环里,依次接收 range(5) 生成的每个数字。
也就是说:
第一轮,i = 0第二轮,i = 1第三轮,i = 2第四轮,i = 3第五轮,i = 4
所以程序才会把这些数字依次打印出来。
你可以把 i 理解成:
当前这一轮拿到的数字
变量名 i 很常见, 但它不是固定必须写 i。 你也可以写成:
for num in range(5): print(num)
效果是一样的。
只是因为 i 在循环里特别常见, 所以大家经常用它。
六、先做一个最基础的 range() 练习
下面这段代码你最好现在就敲一遍。
for i in range(5): print(i)
然后你再改成:
for i in range(3): print(i)
输出会变成:
012
再改成:
for i in range(8): print(i)
输出会是:
01234567
通过这种小改动,你会很快建立一个感觉:
range(n) 就是在生成从 0 开始,到 n 之前结束的一串整数。
七、如果我想得到 1 到 5,而不是 0 到 4,怎么办
这时候就要用 range() 的第二种写法:
range(开始值, 结束值)
比如:
for i in range(1, 6): print(i)
输出结果就是:
12345
这里的意思是:
从 1 开始 到 6 之前结束
也就是 1 到 5。
这就是 range() 第二种非常常用的形式。
你可以先记成一句特别朴素的话:
range(开始, 结束)表示从开始值起步,到结束值之前停下
还是“包含开始,不包含结束”。
八、range(1, 6) 为什么不是到 6
这个点一定要再强调一下。
因为很多新手刚开始最容易在这里写错。
range(1, 6)
不是 1 到 6, 而是 1 到 5。
因为 range() 的结束值永远是不包含的。
所以:
range(1, 6) → 1, 2, 3, 4, 5range(2, 5) → 2, 3, 4range(10, 13) → 10, 11, 12
你以后只要看到 range(start, end), 都可以马上在脑子里翻译成:
从 start 开始,到 end 前一位结束
这个感觉一旦熟了,后面会顺很多。
九、自己做一个“打印 1 到 10”的练习
这个练习特别适合现在做。
for i in range(1, 11): print(i)
输出就是:
12345678910
然后你再自己改一下。
比如打印 3 到 7:
for i in range(3, 8): print(i)
输出会是:
34567
这种练习很有效, 因为它能帮你彻底建立“结束值不包含”的感觉。
十、range() 还有第三种写法:带步长
这是很重要的一种扩展。
写法是:
range(开始值, 结束值, 步长)
前两个你已经懂了。 第三个“步长”,表示每次增加多少。
比如:
for i in range(1, 10, 2): print(i)
输出结果会是:
13579
因为它是:
从 1 开始 每次加 2 到 10 之前结束
所以就跳着走。
这就是步长的作用。
十一、步长可以帮你生成“隔一个取一个”的数字序列
比如你想打印所有奇数:
for i in range(1, 10, 2): print(i)
这会得到 1、3、5、7、9。
你想打印所有偶数:
for i in range(2, 11, 2): print(i)
输出会是:
246810
这就是 range() 特别方便的地方。
你不需要自己写很多判断, 只要把规律告诉它:
从哪里开始 每次走几步 什么时候停
它就能帮你生成想要的数字序列。
十二、自己动手做一个“打印奇数”的练习
这个特别适合当前阶段。
for i in range(1, 11, 2): print(i)
输出是:
13579
然后你再自己改成打印偶数:
for i in range(2, 11, 2): print(i)
输出会变成:
246810
这个练习特别有助于你理解第三个参数“步长”的意义。
十三、range() 也可以倒着走
这点很多新手会觉得很神奇,其实一点也不复杂。
只要你把步长写成负数, 它就可以倒着数。
比如:
for i in range(5, 0, -1): print(i)
输出结果会是:
54321
这段代码的意思是:
从 5 开始 每次减 1 到 0 之前结束
因为结束值不包含,所以不会打印 0。
这个写法以后做倒计时、反向遍历时很常见。
十四、自己做一个“倒计时”小练习
比如:
for i in range(10, 0, -1): print(i)
输出就是:
10987654321
你还可以在最后加一句:
print('开始')
变成:
for i in range(5, 0, -1): print(i)print('开始')
这样就很像一个最基础的小倒计时程序了。
十五、for 和 range() 最经典的组合,就是“按次数重复”
比如你想把一句话打印 5 次:
for i in range(5): print('欢迎学习 Python')
这时候你可能会问:
既然 i 没用到,为什么还要写它
因为 for 总得有个变量来接每一轮的值。 只是这里我们不关心具体值本身, 只关心“循环 5 次”这件事。
也就是说:
range(5) 提供 5 轮for 帮你把这 5 轮一个个跑完
所以这组搭配会特别高频。
十六、如果想让每次输出都带上“第几次”,range() 就更有用了
比如:
for i in range(5): print(f'这是第{i}次输出')
输出会是:
这是第0次输出这是第1次输出这是第2次输出这是第3次输出这是第4次输出
但很多时候我们更习惯从 1 开始数。 那就可以这样写:
for i in range(1, 6): print(f'这是第{i}次输出')
输出就会变成:
这是第1次输出这是第2次输出这是第3次输出这是第4次输出这是第5次输出
这个例子特别好, 因为它能帮你感受到:
range() 不只是为了生成数字本身, 还经常被用来表示“第几轮”
十七、range() 和 while 相比,为什么这么常见
因为它太省事了。
用 while 打印 1 到 5,你得自己写:
count = 1while count <= 5: print(count) count += 1
而用 for + range():
for i in range(1, 6): print(i)
明显更短,也更自然。
所以很多“按次数”“按顺序输出数字”的场景里,for + range() 往往会比 while 更受欢迎。
这也是为什么你后面一看到循环,就会经常看到 range()。
十八、不要把 range() 想成神秘对象,你就把它当成“帮你准备数字”的工具
这点特别重要。
很多新手一看到 range(),会下意识把它想成某种很难的高级东西。 其实完全不用。
你现在最朴素的理解就足够了:
它的任务就是帮你准备一串有规律的整数,给 for 用。
比如:
range(5) 帮你准备 0 到 4range(1, 6) 帮你准备 1 到 5range(2, 11, 2) 帮你准备 2、4、6、8、10range(5, 0, -1) 帮你准备 5、4、3、2、1
就这么简单。
十九、自己动手做一个“打印 1 到 100 中的偶数”练习
这个练习特别适合练步长。
for i in range(2, 101, 2): print(i)
你当然不用手动检查 100 个数。 但你要从这个例子里体会到一件事:
只要规律清楚,range() 就能帮你自动把序列生成出来
这比你一个一个写数字,高效太多了。
二十、range() 生成的不是随便的数,而是“按规则排列的一串整数”
这个理解特别关键。
它不是随机的。 不是乱来的。 而是严格按照你给的参数生成。
比如:
range(3, 15, 3)
你就可以在脑子里直接展开:
3 6 9 12
因为:
从 3 开始 每次加 3 到 15 之前结束
所以以后你看到一个 range(), 不要害怕。 就老老实实按这三个问题去拆:
从哪开始 到哪结束 每次怎么走
拆完以后,基本就明白了。
二十一、今天一定要亲手完成的 4 个练习
第一个,打印 0 到 4。
for i in range(5): print(i)
第二个,打印 1 到 5。
for i in range(1, 6): print(i)
第三个,打印 1 到 9 的奇数。
for i in range(1, 10, 2): print(i)
第四个,打印 5 到 1 的倒序数字。
for i in range(5, 0, -1): print(i)
这四个练习几乎把 range() 的核心用法都覆盖了。 你只要自己敲一遍,再改几个参数试试,感觉会很快建立起来。
二十二、再做一个综合小练习
下面这个程序很适合做今天的收尾。
需求:
把“欢迎学习 Python”打印 5 次,并显示当前是第几次。
代码如下:
for i in range(1, 6): print(f'第{i}次:欢迎学习 Python')
运行结果会是:
第1次:欢迎学习 Python第2次:欢迎学习 Python第3次:欢迎学习 Python第4次:欢迎学习 Python第5次:欢迎学习 Python
这个例子很有代表性, 因为它把 for、range()、f-string 全串起来了。
你还可以自己升级一下:
把 5 次改成 10 次 或者把欢迎语换成自己的内容 或者让它倒着打印次数
比如:
for i in range(5, 0, -1): print(f'倒计时第{i}次')
这样一改,你会更熟。
二十三、写在最后
range() 这个知识点,表面看起来只是循环里的一个小工具。 但你后面会越来越发现,它几乎无处不在。
因为很多循环场景,本质上都和“按顺序处理数字范围”有关。
打印 1 到 10 循环 5 次 每隔 2 个处理一次 倒着数 做计数 做编号
这些事,range() 都特别顺手。
所以你现在最需要建立的,不是去死记每一种形式。 而是先形成这三个问题的直觉:
从哪开始 到哪结束 每次怎么走
只要这三个问题你能顺着想, 大多数 range() 写法都不会太难。
本文小结
range() 用来生成一段有规律的整数序列,常和 for 一起使用。range(5) 表示从 0 开始,到 5 之前结束,也就是 0 到 4。range(开始, 结束) 表示从开始值起步,到结束值之前停止。range(开始, 结束, 步长) 可以控制每次变化多少,也可以实现倒序。 学习 range() 最关键的,不是背形式,而是学会按“开始、结束、步长”三个维度去理解它。
下篇预告
第 27 篇,我们继续把循环能力往前推进。
break、continue、pass 分别该在什么时候用
到那一篇,你会真正学会:循环途中如果想提前结束、跳过某次、或者先占个位,Python 分别该怎么写。