Python的范围功能如何工作?

时间:2009-11-15 17:06:38

标签: python for-loop 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

然后我打电话给,它只给5 但是,如果我添加''print a'',它会给出1,2,3,4,5 所以我的问题是这里的区别是什么? 我是一个字符串或列表或其他什么?

也许任何人都可以帮我理清:

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 个答案:

答案 0 :(得分:49)

大多数(如果不是全部)编程语言中的“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

这将打印给出的 last 值。每次循环迭代时,语句a=i+1都将用新值覆盖最后一个值a

代码基本上按顺序从上到下运行,for循环是一种使代码返回的方法,并且其中一个变量具有不同的值。

我希望这能回答你的问题。

答案 1 :(得分:18)

当我教某人编程(几乎任何语言)时,我引入for循环,其术语与此代码示例类似:

for eachItem in someList:
    doSomething(eachItem)

...这很方便,是语法上有效的Python代码。

Python range()函数simple返回或生成一个整数列表,从一些下限(零,默认情况下)直到(但不包括)某个上限,可能以某个其他数字的增量(步长) (一,默认情况下)。

所以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,1

请注意,我说过几次,Python的range()函数返回或生成序列。这是一个相对高级的区别,通常对新手来说不是问题。在旧版本的Python range()中构建了一个列表(为其分配内存并使用值填充)并返回对该列表的引用。对于可能消耗相当多内存的大范围而言,这可能是低效的,并且在某些情况下,您可能希望迭代一些可能大范围的数字,但可能会“break”早期退出循环(例如,在找到您感兴趣的某个特定项目之后)。

Python通过名为 generator 的编程构造支持更有效的方法来实现相同的语义(做同样的事情)。 Python不是分配和填充整个列表并将其作为静态数据结构返回,而是可以使用必需信息(上限和下限以及步/增量值)实例化一个对象...并返回对它的引用。然后,该对象跟踪它最近返回的数字并计算新值,直到它达到上限(并且它使用称为“StopIteration”的异常将该序列的结尾发送给调用者)。这种技术(动态地计算值,而不是一次性地预先计算值)被称为“懒惰评估”。

语言中的其他构造(例如for循环的基础构造)可以使用该对象,就好像它是一个列表一样。

对于大多数情况,您不必知道您的Python版本是使用range()的旧实现还是基于生成器的较新实现。你可以使用它并且快乐。如果您正在处理数百万个项目的范围,或者每个项目创建数千个不同的范围,那么您可能会注意到在旧版本的Python上使用range()会降低性能。在这种情况下,您可以重新考虑您的设计并使用while循环,或创建实现生成器的“延迟评估”语义的对象,或者使用xrange()版本的range()如果您的Python版本包含它,或者隐式使用生成器的Python版本中的range()函数。

诸如生成器之类的概念以及更多一般形式的惰性求值,超越了基础知识,渗透到Python编程中。对于简单的编程任务,它们通常是您不必知道的事情,但是当您尝试使用更大的数据集或更严格的约束(例如时间/性能或内存限制)时,它们会变得非常重要。

答案 2 :(得分:7)

for i in range(5):

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

答案 3 :(得分:6)

range(x)返回从0到 x - 1的数字列表。

>>> range(1)
[0]
>>> range(2)
[0, 1]
>>> range(3)
[0, 1, 2]
>>> range(4)
[0, 1, 2, 3]

for i in range(x):print i返回的列表中的每个元素执行一次正文(在第一个示例中为range())。 正文内部使用i来引用列表中的“当前”项。 在这种情况下,i引用一个整数,但它可以是任何类型,具体取决于您循环的对象。

答案 4 :(得分:0)

range函数会给你一个数字列表,而for循环将遍历列表并为每个项执行给定的代码。

for i in range(5):
      print i

这只执行print i五次,因为我的范围从0到4。

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

这将执行a=i+1五次。由于您在每次迭代时都会覆盖a的值,因此最后只能得到最后一次迭代的值,即4 + 1.

有用的链接:
http://www.network-theory.co.uk/docs/pytut/rangeFunction.html
http://www.ibiblio.org/swaroopch/byteofpython/read/for-loop.html

答案 5 :(得分:0)

它是循环的,可能问题出在打印部分......

如果找不到系统打印的逻辑,只需将内容添加到您想要内容的位置:

for i in range(len(vs)):
    print vs[i]
    print fs[i]
    print rs[i]