之前我学习过Visual Basic,现在我正在学习Python。我意识到在Python中,我们不必在for loop
中初始化标识符的值,但它在while loop
中是相反的。我觉得在Visual Basic中看起来不熟悉,我们必须在两个循环中声明一个变量作为标识符。
例如,来自Python wiki,
x = 1
while True:
print "To infinity and beyond! We're getting close, on %d now!" % (x)
x += 1
完美运行。但是,在我评论x = 1
之后,它会生成错误。为什么它不能像for loop
那样x
从0开始?
此外,即使我们在for loop
中为标识符分配值,例如
num = 10
for num in range(5):
print num
print num
循环将覆盖赋值的值。为什么会这样?
我知道这里有很多for loop
和while loop
个问题,但大多数都是OP代码的案例研究。我想要的是对Python结构本身以及执行for loop
或while loop
时语言的一些基础操作的更一般性解释。此外,在这种情况下,我指的是Python 2.7.11。如果你能指出3.5.1的结构差异,我将非常感激。非常感谢。
答案 0 :(得分:4)
__init__
如果您对x = 1
while True:
print "To infinity and beyond! We're getting close, on %d now!" % (x)
x += 1
发表评论,则此行会引发错误:
x = 1
因为它意味着x += 1
,因为没有定义x,它会引发一个错误(python不知道什么值加1)
x = x + 1
你在两个变量中使用相同的名称,在循环内部和外部,这就是为什么你在循环中有另一个值num = 10
for num in range(5):
print num
print num
的原因。
好的做法是在循环变量中有变量的另一个名称,因为你真的不需要为循环变量设置相同的变量,就像你在循环外面一样
所以,你可以这样写:
num
答案 1 :(得分:1)
因为'range'表示你继承了什么值并将num定义为本地值。你看几句话但是有一个更复杂的过程。
一个例子可能是Javascript语言。在for循环中,您可以看到循环迭代的值的初始值,您可以看到最大值和增量。 for(var num = 0; var< 5; var + = 1)在python中你看到num在范围(5)中。 while循环更明确。
num是用于全局变量和局部变量的名称这一事实可能会引起混淆。实际上,您在循环中看到的num是另一个变量。
答案 2 :(得分:1)
因为Python的for
循环更像是C#' foreach
或JS' for of
,
而VB' for
更像是帕斯卡尔for
。
我会使用Pascal而不是VB,因为我知道它更好。
Pascal' for
:
var i: byte;
begin
for i := 0 to 5 do
begin
writeln(i);
end;
end.
使用for
可以在Python中轻松复制每个Pascal的range
循环:
for i in range(5):
print(i)
但是,Python for
更多的是:
for c in "HelloWorld!":
print(c)
如果不直接处理索引,就无法在Pascal中复制它。
Pascal和VB的for
使用索引 - 它们从某个索引迭代到另一个索引,而Python的for
循环使用iterables(数组,字符串) ,文件,生成器等等。)