考虑相同循环结构的这两个变体:
x = find_number_of_iterations()
for n in range(x):
# do something in loop
和
for n in range(find_number_of_iterations()):
# do something
第二个循环是否会在每个后续循环运行中评估方法find_number_of_iterations
,或者即使在第二个变量中,方法find_number_of_iterations
也只会被评估一次?
答案 0 :(得分:1)
无论哪种方式,该函数只被调用一次。您可以按如下方式证明:
>>> def test_func():
"""Function to count calls and return integers."""
test_func.called += 1
return 3
# first version
>>> test_func.called = 0
>>> x = test_func()
>>> for _ in range(x):
print 'loop'
loop
loop
loop
>>> test_func.called
1
# second version
>>> test_func.called = 0
>>>
>>> for _ in range(test_func()):
print 'loop'
loop
loop
loop
>>> test_func.called
1
该函数被调用一次,调用该函数的结果被传递给range
(然后调用range
的结果被迭代);这两个版本在逻辑上是等价的。
答案 1 :(得分:1)
该函数被调用一次。从逻辑上讲,如果要在每次迭代时调用它,那么循环范围可能会发生变化,从而造成各种各样的破坏。这很容易测试:
def find_iterations():
print "find_iterations called"
return 5
for n in range(find_iterations()):
print n
结果:
$ python test.py
find_iterations called
0
1
2
3
4
答案 2 :(得分:1)
我怀疑你的导师的困惑可以追溯到Python for for循环的语义与其他语言的语义差别很大。
在像C这样的语言中,for循环或多或少是一个while循环的语法糖:
for(i = 0; i < n; i++)
{
//do stuff
}
相当于:
i = 0;
while(i < n)
{
//do stuff
i++
}
在Python中它是不同的。它的for循环是基于迭代器的。迭代器对象只初始化一次,然后在后续迭代中使用。以下片段显示Python的for循环不能(轻松)转换为while循环,并且还显示使用while循环,您的导师的关注是有效的:
>>> def find_number_of_iterations():
print("called")
return 3
>>> for i in range(find_number_of_iterations()): print(i)
called
0
1
2
>>> i = 0
>>> while i < find_number_of_iterations():
print(i)
i += 1
called
0
called
1
called
2
called