Python的范围功能如何工作?

use*_*037 23 python for-loop range

如果我写

for i in range(5):
      print i
Run Code Online (Sandbox Code Playgroud)

然后它给出0,1,2,3,4这
是否意味着Python同时为0分配0,1,2,3,4?
但是,如果我写道:

for i in range(5):
      a=i+1
Run Code Online (Sandbox Code Playgroud)

然后我打电话给a,它只给5
但是如果我加''打印''它给出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
Run Code Online (Sandbox Code Playgroud)

如果我运行这种代码,那么只有当l = 5时我才能得到答案
我怎样才能让它们开始循环?

即l = 0得到vs [1],fs [1],rs [1]的值,
则l = 1得到vs [2],rs [2],fs [2] ......的值等等.
但是python给出了不同的fs数组,vs,rs,对应不同的l值

我怎么能把它们做成一件?

ang*_*son 49

大多数(如果不是全部)编程语言中的"for循环"是一种不止一次运行一段代码的机制.

这段代码:

for i in range(5):
    print i
Run Code Online (Sandbox Code Playgroud)

可以想到这样工作:

i = 0
print i
i = 1
print i
i = 2
print i
i = 3
print i
i = 4
print i
Run Code Online (Sandbox Code Playgroud)

所以你看,什么情况是不是i得到值0,1,2,3,4 与此同时,而是顺序.

我假设当你说"叫a,它只给5"时,你的意思是这样的:

for i in range(5):
    a=i+1
print a
Run Code Online (Sandbox Code Playgroud)

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

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

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


Jim*_*nis 20

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

for eachItem in someList:
    doSomething(eachItem)
Run Code Online (Sandbox Code Playgroud)

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

Python range()函数simple返回或生成一个整数列表,从一些下限(零,默认情况下)直到(但不包括)某个上限,可能以某个其他数字(默认为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()构建了一个列表(为其分配内存并使用值填充)并返回对该列表的引用.对于可能消耗相当多内存的大范围而言,这可能是低效的,并且对于某些情况,您可能希望迭代某些可能较大范围的数字,但可能会break早期" "退出循环(在找到某些特定项目之后)你感兴趣的,例如).

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

然后,语言中的其他构造(例如for循环中的那些构造)可以使用该对象,就像它是一个列表一样.

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

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

  • @SamiulSk:range() 函数返回一个生成器对象。该对象保持自己的状态(范围内的当前位置)。对该对象的每次 next() 调用都会产生下一个值(并相应地更新其状态)。这对于 Python 生成器来说都是正确的。 (2认同)

Jos*_*rce 7

for i in range(5):
Run Code Online (Sandbox Code Playgroud)

是相同的

for i in [0,1,2,3,4]:
Run Code Online (Sandbox Code Playgroud)

  • 对于较新的版本来说并非如此。当您调用 range() 时,较新版本的 python 不会简单地返回一个列表。请参阅上面@Jim Dennis 的回答,了解它们是如何工作的。 (3认同)

Bas*_*ard 6

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

>>> range(1)
[0]
>>> range(2)
[0, 1]
>>> range(3)
[0, 1, 2]
>>> range(4)
[0, 1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

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