Python的range函数是如何工作的?

27 投票
6 回答
143686 浏览
提问于 2025-04-15 16:02

如果我写了

for i in range(5):
      print i

那么它会给出0, 1, 2, 3, 4
这是不是意味着Python同时把0, 1, 2, 3, 4都赋值给了i呢?
但是如果我写:

for i in range(5):
      a=i+1

然后我调用a,它只给出5
但如果我加上''print a'',它会给出1, 2, 3, 4, 5
所以我的问题是,这里有什么区别呢?
i是字符串、列表还是其他什么东西?

或者有没有人能帮我理清楚:

for l in range(5):
    #vs,fs,rs are all m*n matrixs,got initial values in,i.e vs[0],fs[0],rs[0] are known
    #want use this foor loop to update them
    vs[l+1]=vs[l]+fs[l]
    fs[l+1]=((rs[l]-re[l])
    rs[l+1]=rs[l]+vs[l]
#then this code gives vs,fs,rs

如果我运行这种代码,那么我只有在l=5的时候才能得到答案
我该如何让它们开始循环呢?
也就是说,当l=0时,得到了vs[1], fs[1], rs[1],
然后l=1时,得到了vs[2], rs[2], fs[2]......依此类推。
但是Python给出的fs, vs, rs数组是不同的,分别对应不同的l值。
我该如何把它们合成一块呢?

6 个回答

6
for i in range(5):

这和下面的内容是一样的

for i in [0,1,2,3,4]:
23

当我教别人编程(几乎任何语言)时,我会用类似下面的代码示例来介绍 for 循环:

for eachItem in someList:
    doSomething(eachItem)

... 这段代码在语法上是有效的 Python 代码。

Python 的 range() 函数简单来说就是生成一个整数列表,从某个下限(默认是零)开始,一直到某个上限(不包括这个上限),而且可以按某个步长(默认是1)递增。

所以 range(5) 会生成一个序列:0, 1, 2, 3, 4(到上限但不包括上限)。

如果调用 range(2,10),它会返回:2, 3, 4, 5, 6, 7, 8, 9。

如果调用 range(2,12,3),它会返回:2, 5, 8, 11。

注意我提到过几次,Python 的 range() 函数返回的是或生成一个序列。这是一个相对高级的区别,对于初学者来说通常不会造成困扰。在旧版本的 Python 中,range() 会创建一个列表(为它分配内存并填充值),然后返回这个列表的引用。这在处理大范围时可能会效率低下,因为它可能会消耗大量内存,尤其是在你可能会“提前退出”循环的情况下(比如找到你感兴趣的某个特定项后)。

Python 提供了更高效的方式来实现相同的功能,这种方式叫做生成器。它不是一次性分配和填充整个列表,而是创建一个包含必要信息(上下限和步长)的对象,并返回这个对象的引用。

这个(代码)对象会跟踪它最近返回的数字,并计算新值,直到达到上限(此时它会通过一种叫做“StopIteration”的异常来通知调用者序列结束)。这种动态计算值而不是一次性计算的方式被称为“惰性求值”。

语言中的其他结构(比如 for 循环的底层实现)可以像处理列表一样处理这个对象(对它进行迭代)。

在大多数情况下,你不需要知道你使用的 Python 版本是旧版的 range() 还是基于生成器的新版本。你只需使用它,开心就好。

如果你在处理数百万个项目的范围,或者创建成千上万的不同范围,每个范围都有成千上万的项目,那么你可能会注意到在旧版 Python 中使用 range() 会有性能损失。在这种情况下,你可以重新考虑你的设计,使用 while 循环,或者创建实现“惰性求值”语义的对象,或者如果你的 Python 版本包含 xrange(),可以使用它,或者使用一个隐式使用生成器的 range() 函数。

生成器等概念,以及更一般的惰性求值形式,贯穿于 Python 编程中,随着你超越基础知识,它们会变得越来越重要。对于简单的编程任务,你通常不需要了解这些,但当你尝试处理更大的数据集或在更严格的限制下工作(例如时间/性能或内存限制)时,它们就会变得重要。

[更新:对于 Python3(当前维护的 Python 版本),range() 函数始终返回动态的“惰性求值”迭代器;旧版本的 Python(2.x)返回的是静态分配的整数列表,现在已经正式过时(经过多年的弃用)]。

54

在大多数编程语言中,“for循环”是一种让一段代码重复执行多次的机制。

这段代码:

for i in range(5):
    print i

可以理解为这样工作:

i = 0
print i
i = 1
print i
i = 2
print i
i = 3
print i
i = 4
print i

所以你会看到,i并不是同时获得0、1、2、3、4这些值,而是一个接一个地获得。

我猜当你说“调用a时,它只给5”,你是指这样的情况:

for i in range(5):
    a=i+1
print a

这会打印出最后给a的值。每次循环执行时,语句a=i+1都会用新值覆盖a之前的值。

代码基本上是从上到下顺序执行的,而for循环就是让代码返回去重新执行某些内容,只不过这次用的是不同的变量值。

希望这能解答你的问题。

撰写回答