Python的range函数是如何工作的?
如果我写了
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 个回答
for i in range(5):
这和下面的内容是一样的
for i in [0,1,2,3,4]:
当我教别人编程(几乎任何语言)时,我会用类似下面的代码示例来介绍 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)返回的是静态分配的整数列表,现在已经正式过时(经过多年的弃用)]。
在大多数编程语言中,“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循环就是让代码返回去重新执行某些内容,只不过这次用的是不同的变量值。
希望这能解答你的问题。