【问题标题】:Looping over range(0)循环范围(0)
【发布时间】:2018-12-11 09:24:59
【问题描述】:

这里是函数:

def is_sorted(L):
    """ (str) -> Bool

    Return True iff the L is sorted in nondecreasing order. Otherwise, return
    False.

    >>> is_sorted([1, 2, 3, 3])
    True
    >>> is_sorted([3, 2, 1, 3])
    False
    """
    if len(L) == 0:
        return False

    for i in range(len(L) - 1):
        if L[i] > L[i + 1]:
            return False

    return True

然后我在一个包含一个字符的列表上执行它,它返回 True。但是,我预计会收到“列表索引超出范围错误”。谁能解释它为什么会这样?

【问题讨论】:

  • 如果你在 python 解释器中输入list(range(0)),它将返回[]。所以你不能遍历一个空列表。

标签: python for-loop range


【解决方案1】:

range(a, b, s)[a, a+s, a+2*s..., x],其中x < b

所以range(0) -> range(0,0,1) 生成一个空的list。这意味着 for 循环的内部被跳过,返回 True

【讨论】:

  • 感谢您的回复!现在很清楚了。 @ RohithS98,您如何看待这种情况下的方法?有没有更好的解决方案?
  • @Nicko 这种方法很好。有一些更短(更少行)的方法可以像给定的here 那样做,但基本概念是相同的,并且具有相同的复杂性
【解决方案2】:

在幕后,for 语句在容器对象(这里是 range)上调用 iter()。该函数返回一个迭代器对象,该对象定义了 next() 方法,该方法一次访问容器中的一个元素。当没有更多元素时,next() 会引发 StopIteration 异常,告知 for 循环终止。

在您的 sn-p 中: range(0) 意味着循环永远不会运行,而是会引发 stopIteration 异常。如果它是 range(0,1) 你会得到预期的答案。 因此,它跳转到下一条语句并返回 true。

您可以阅读更多关于 python 中的迭代器协议。

【讨论】:

    【解决方案3】:

    它返回True,因为它已经不能进入循环,因为列表是[],它是空的,所以它只返回它后面的内容。

    【讨论】:

      【解决方案4】:

      for i in range(n) 表示我将遍历列表[0,1,2....,n-1]。在你的情况下range(0)=[](一个空列表),因为在 0 和 0 之间没有整数。这就是为什么这段代码没有被执行:

      for i in range(len(L) - 1): #empty list
          if L[i] > L[i + 1]: #this line is not getting executed
              return False
      

      这条线正在被执行,它正在返回True

      return True #this one is getting executed
      

      【讨论】:

        猜你喜欢
        • 2011-10-21
        • 1970-01-01
        • 2015-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-17
        • 2020-11-15
        相关资源
        最近更新 更多