Python range() 函数(手把手讲解)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

前言:Python range() 函数的基石作用

在 Python 开发中,循环结构是实现自动化操作的核心工具,而 range() 函数作为生成数字序列的“隐形引擎”,在 for 循环中扮演着关键角色。无论是遍历列表、创建等差数列,还是控制循环次数,range() 函数都能以高效简洁的方式完成任务。对于编程初学者而言,理解其工作原理与参数特性,能够显著提升代码编写效率;中级开发者则可通过进阶用法挖掘其更多可能性。本文将通过循序渐进的讲解、生动的比喻和实战案例,帮助读者全面掌握这一基础但强大的工具。


一、基础认知:range() 函数的数字生成机制

1.1 简单形式:单参数生成

range(stop) 是最基础的用法,它会从数字 0 开始,以步长 1 递增,直到但不包括 stop 值。

for num in range(5):  
    print(num, end=" ")  # 输出:0 1 2 3 4  

形象比喻:想象一个自动数数的机器人,你告诉它“数到5就停”,它会从0开始数,数到4时发现下一个数是5,于是停止。

1.2 双参数形式:指定起始值

通过 range(start, stop),可以自定义起始数字:

for num in range(3, 8):  
    print(num, end=" ")  # 输出:3 4 5 6 7  

此时,机器人会从 start 开始数,直到 stop-1 结束。


二、核心参数详解:start、stop、step 的协同作用

2.1 必要与可选参数

  • stop:唯一必须参数,定义序列的结束边界(不包含自身)。
  • start(可选):起始值,默认为 0
  • step(可选):步长,默认为 1,控制每次递增的幅度。

2.2 步长的魔法:负数与跳跃

通过调整 step,可以生成递减序列或跳跃式序列:

for num in range(5, 0, -1):  
    print(num, end=" ")  # 输出:5 4 3 2 1  

for num in range(0, 10, 2):  
    print(num, end=" ")  # 输出:0 2 4 6 8  

生活化类比:步长就像电梯按钮,step=2 相当于每次跳过一层楼,而负数步长则让电梯“倒着运行”。


三、进阶技巧:range() 的隐藏能力

3.1 处理负数与复杂场景

start 大于 stop 且步长为正时,序列不会生成任何数值。此时需结合负步长:

for num in range(5, 1, 1):  
    print(num)  

for num in range(5, 0, -1):  
    print(num)  # 输出5到1  

3.2 与列表的转换

直接使用 list() 函数可将 range 对象转为列表:

numbers = list(range(1, 6))  
print(numbers)  # 输出:[1, 2, 3, 4, 5]  

注意range() 本身返回的是一个不可变序列对象,内存占用极低,适合处理大规模数据。

3.3 浮点数的挑战

range() 不支持浮点数步长,但可通过 numpy 库的 arange() 实现类似功能:

import numpy as np  
float_numbers = np.arange(0, 1, 0.1)  
print(float_numbers)  # 输出:[0.  0.1 0.2 ... 0.9]  

四、常见问题与解决方案

4.1 为什么最后一个数字没有显示?

由于 stop 参数不包含在结果中,若需包含终点,需调整 stop 值:

for num in range(6):  
    print(num)  # 输出0到5  

4.2 如何生成包含负数的序列?

通过调整 startstep 即可:

negative_nums = list(range(-3, 4))  
print(negative_nums)  # 输出:[-3, -2, -1, 0, 1, 2, 3]  

4.3 如何反向遍历列表?

结合 range() 可轻松实现:

my_list = ["a", "b", "c", "d"]  
for index in range(len(my_list)-1, -1, -1):  
    print(my_list[index])  # 输出d c b a  

五、实战案例:range() 的应用场景

5.1 生成斐波那契数列

利用 range() 控制循环次数,构建经典数列:

n = 10  
a, b = 0, 1  
for _ in range(n):  
    print(a, end=" ")  
    a, b = b, a + b  # 输出:0 1 1 2 3 5 8 13 21 34  

5.2 批量文件重命名

通过 enumerate() 结合 range(),可实现文件名序号自增:

import os  

files = os.listdir("path/to/files")  
for index, filename in enumerate(files):  
    new_name = f"file_{index+1}.txt"  
    os.rename(filename, new_name)  

5.3 矩阵行数与列数的遍历

在二维数组操作中,range() 能精准控制坐标:

matrix = [[1, 2], [3, 4]]  
for row in range(len(matrix)):  
    for col in range(len(matrix[row])):  
        print(matrix[row][col], end=" ")  

六、性能优化:为何选择 range() 而非其他方法?

6.1 内存效率对比

直接生成列表 [0,1,2,...,n] 会占用大量内存,而 range() 是惰性生成序列,仅存储起始值、步长和长度,尤其在处理 10^6 级别数据时优势显著:
| 数据规模 | 列表内存(MB) | range() 内存(MB) |
|----------|----------------|---------------------|
| 1,000 | 0.008 | 0.0002 |
| 1,000,000| 7.6 | 0.0002 |

6.2 迭代速度测试

通过 timeit 模块对比,range() 的迭代速度远超手动生成列表:

import timeit  

print(timeit.timeit("for _ in range(1000): pass", number=1000))  # 约0.002秒  
print(timeit.timeit("for _ in [0]*1000: pass", number=1000))    # 约0.005秒  

结论:掌握 range() 是 Pythoner 的必修课

通过本文的系统解析,我们看到 range() 函数不仅是循环的“数字工厂”,更是优化代码性能的“隐形推手”。从基础的起始/结束值设置,到负数步长的灵活运用,再到结合其他函数实现复杂场景,它始终以简洁的语法承载着强大的功能。对于编程初学者,建议通过动手实践不同参数组合加深理解;中级开发者则可探索其在算法、数据处理等领域的进阶应用。记住,真正掌握 Python range() 函数 的关键,在于理解其“按需生成、不占用额外内存”的设计哲学,这正是 Python 语言高效优雅的缩影。

行动建议:尝试用 range() 解决日常开发中的序列生成问题,例如创建进度条、生成坐标网格或自动化测试用例。通过持续实践,你将发现这一函数的更多可能性!

最新发布