我使用for循环使用以下代码:
total = 0
for num in range(101):
total = total + num
print(total)
现在使用while循环获得相同的结果:
num = 0
total = 0
while num <= 99:
num = num + 1
total = total + num
print(total)
为什么在第一种情况下不必定义num,但是在第二种情况下必须定义num?它们都不都是变量吗?
答案 0 :(得分:3)
好吧,for
是一个特殊的语句,它会自动为您定义变量。要求您事先声明变量将是多余的。
while
是通用循环构造。 while
语句的条件甚至不必包含变量。例如
while True:
或
while my_function() > 0:
答案 1 :(得分:2)
在python中,大多数情况下不需要定义/声明变量。
规则是,如果您编写(分配)变量,则该变量是该函数的局部变量;如果您只阅读它,那么它是一个全局的。
在顶级(任何函数之外)分配的变量是全局的...因此,例如:
x = 12 # this is an assignment, and because we're outside functions x
# is deduced to be a global
def foo():
print(x) # we only "read" x, thus we're talking of the global
def bar():
x = 3 # this is an assignment inside a function, so x is local
print(x) # will print 3, not touching the global
def baz():
x += 3 # this will generate an error: we're writing so it's a
# local, but no value has been ever assigned to it so it
# has "no value" and we cannot "increment" it
def baz2():
global x # this is a declaration, even if we write in the code
# x refers to the global
x += 3 # Now fine... will increment the global
for
语句只是一个写入变量的循环:如果不存在声明,则该变量将被视为局部变量;否则,该变量将被视为局部变量。如果有global
或nonlocal
声明,则所使用的变量将具有相应的作用域(nonlocal
用于从嵌套函数中的代码写入封闭函数的局部变量:在Python中很少使用)。
答案 2 :(得分:2)
我想从稍微不同的角度来解决这个问题。
如果我们看一下official Python grammar specification,我们可以看到(大约),一个while
语句需要一个test
,而一个for
语句需要一个{{ 1}}和exprlist
。
从概念上讲,我们可以理解testlist
语句需要做一件事:一个可以重复计算的表达式。
另一方面,while
语句需要两个:要求值的表达式的集合,以及将这些求值结果绑定到的多个名称。 / p>
考虑到这一点,有意义的是for
语句不会自动创建临时变量,因为它也可以接受文字。相反,while
语句必须绑定到某些名称。
(严格来说,就Python语法而言,在for
语句中放置一个您希望有名称的文字是有效的,但是在上下文上这没有意义,因此该语言禁止使用)
答案 3 :(得分:1)
如果您来自C
,C++
或Java
之类的其他编程语言,请不要与for in
的python循环混淆。
在python中,for in
循环从项目列表中选择一个项目,并在所选择的项目的帮助下执行某些操作。
答案 4 :(得分:1)
For循环迭代列表中的每个元素,直到给定范围。因此,无需任何变量即可检查条件。
循环迭代直到给定条件为真。这里我们需要一些变量或值来检查条件,因此在循环之前使用了变量num。
答案 5 :(得分:0)
Python for
循环分配变量并让您使用它。我们可以将for
循环转换为while
循环,以了解Python的实际工作方式(提示:它使用了iterables!):
iterator = iter(iterable) # fresh new iterator object
done = False
while not done:
try:
item = next(iterator)
# inside code of a for loop, we can use `item` here
except StopIteration:
done = True