【问题标题】:Python Generating Infinite Loop When First Arg is 0当第一个 Arg 为 0 时 Python 生成无限循环
【发布时间】:2014-04-14 02:12:53
【问题描述】:

我不明白为什么当 totalArea 的 'start' 参数为 0 时,下面的代码会陷入无限循环。我一直在看 Python Tutor 中运行的代码,并且 j 通过 Stop -1 的值执行,但是然后重置为 0 而不会移动到 Stop 的值。

import math
def totalArea(start, stop, step):
    def f(x):
        return 10*math.e**(math.log(0.5)/5.27 * x)

    area = 0.0
    j = start

    while j <= len(range(start, stop)):

        for j in range(start, stop):
            area += float(step) * f(j)

    print area

totalArea(0, 11, 1)

【问题讨论】:

    标签: python while-loop infinite-loop


    【解决方案1】:

    范围函数返回一个不包含结束值的列表:

    >> range(5)
    [0, 1, 2, 3, 4]
    

    【讨论】:

      【解决方案2】:

      假设start=0stop=11。那么len(range(start,stop))为11,即[0,1,2,3,4,5,6,7,8,9,10]的长度。在while 循环内,j 迭代值 0 到 10。如您所见,j 永远不会超过 11,因此while 循环永远不会终止。

      【讨论】:

        【解决方案3】:

        在外部 (while) 循环中,len(range(start,stop) 是一个常数 (11)。在内部 (for) 循环中,j 取值 0 到 10(根据 range 的帮助:

        Return a list containing an arithmetic progression of integers.
            range(i, j) returns [i, i+1, i+2, ..., j-1]
        

        )

        为什么不去掉外层的while循环呢?

        【讨论】:

          【解决方案4】:
          while j <= len(range(start, stop)):
              for j in range(start, stop):
          

          每次 for 循环结束时,j = 10

          len(range(start, stop))11

          所以j &lt;= len(range(start, stop))永远

          while 循环似乎完全是多余的。尝试完全删除它:

          def totalArea(start, stop, step):
              def f(x):
                  return 10*math.e**(math.log(0.5)/5.27 * x)
          
              area = 0.0
              j = start
          
              for j in range(start, stop):
                  area += float(step) * f(j)
          
              print area
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-07-01
            • 2021-06-03
            • 2018-10-04
            • 2014-11-21
            • 1970-01-01
            • 2011-12-08
            • 1970-01-01
            相关资源
            最近更新 更多