循环结构最好的方法

时间:2015-10-05 10:52:10

标签: python

考虑相同循环结构的这两个变体:

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也只会被评估一次?

3 个答案:

答案 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