如果我写
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
我怎样才能把它们做成一件?
答案 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]