条件相反,结果不同

'''


import operator

def sorted (a, xs):

   '''a is the operator, xs is a list''' 

  if a == operator.gt:

       for i in range(len(xs)):

           if xs[i] < xs[i+1]:

               return False

           else: True

'''


如果我以相反的条件写入它,则会出现错误“IndexError:列表索引超出范围”


 if a == operator.gt:

   for i in range(len(xs)):

       if xs[i] > xs[i+1]:

           return True

       else: False


临摹微笑
浏览 126回答 1
1回答

海绵宝宝撒

主要问题是您编写for i in range(len(xs)):然后尝试访问xs[i+1]. 这必然会IndexError: list index out of range在循环的最后一次迭代中引发异常。代码的第二个问题是else: Trueorelse: False部分,它什么也不做。您可能忘记了关键字return。就目前而言,您的代码相当于:import operatordef sorted (a, xs):   '''a is the operator, xs is a list'''   if a == operator.gt:       for i in range(len(xs)):           if xs[i] < xs[i+1]:               return Falsei == len(xs)-1当和i+11 太大时,将在循环的最后一次迭代中引发异常。是否会得到异常IndexError: list index out of range取决于for-loop 是否有机会继续其最后一次迭代,或者函数是否会在 -loopreturn的最后一次迭代之前for。另一个问题是你调用了你的 function sorted,它已经是 python 中内置函数的名称。重复使用该名称会导致混乱和可能的错误。由于您的函数不返回排序列表,而是测试列表是否已排序,因此我建议改为调用它is_sorted。要同时解决这两个问题:删除else分支;添加与关键字return True 相同级别的缩进for;range(len(xs))用。。。来代替range(len(xs)-1)。-1你明白这里的必要性吗?想象一下,如果您的列表有 3 个元素。需要进行多少次比较才能检查是否已排序?您需要将第一个元素与第二个元素进行比较;然后是第二个和第三个;就是这样。3 个元素仅进行 2 次比较。如果省略-1,您将尝试将第三个元素与虚构的第四个元素进行比较,并且 python 解释器会抱怨并引发IndexError: list index out of range。最终代码:import operatordef is_sorted (a, xs):   '''a is the operator, xs is a list'''   if a == operator.gt:       for i in range(len(xs)-1):           if xs[i] < xs[i+1]:               return False       return True遵循 python 约定:可选参数reversea与参数进行比较operator.gt有点笨拙,因为编写的函数无论如何都不能与自定义运算符一起使用。我建议遵循python 内置函数sorted和 的list.sort()约定,它使用默认reverse为 的可选参数False。代码:def is_sorted(xs, reverse=False):  if not reverse:    for i in range(len(xs)-1):      if xs[i] > xs[i+1]:        return False    return True  else:    for i in range(len(xs)-1):      if xs[i] < xs[i+1]:        return False    return True进一步改进建议:添加可选参数,key如 python 内置函数sorted和list.sort;让用户给你一个比较运算符,并直接使用该运算符而不是<or>使用或 的替代代码anyalldef is_sorted(xs):  return all(xs[i] <= xs[i+1] for i in range(len(xs)-1))def is_sorted(xs):  return not any(xs[i] > xs[i+1] for i in range(len(xs)-1))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python