为了账号安全,请及时绑定邮箱和手机立即绑定

条件相反,结果不同

条件相反,结果不同

临摹微笑 2024-01-12 10:30:34
'''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 False           else: True'''如果我以相反的条件写入它,则会出现错误“IndexError:列表索引超出范围” if a == operator.gt:   for i in range(len(xs)):       if xs[i] > xs[i+1]:           return True       else: False
查看完整描述

1 回答

?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

主要问题是您编写for i in range(len(xs)):然后尝试访问xs[i+1]. 这必然会IndexError: list index out of range在循环的最后一次迭代中引发异常。


代码的第二个问题是else: Trueorelse: False部分,它什么也不做。您可能忘记了关键字return。就目前而言,您的代码相当于:


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

i == 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 operator

def 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 约定:可选参数reverse

a与参数进行比较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 内置函数sortedlist.sort;

  • 让用户给你一个比较运算符,并直接使用该运算符而不是<or>

使用或 的替代代码anyall

def 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))


查看完整回答
反对 回复 2024-01-12
  • 1 回答
  • 0 关注
  • 110 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信