不同结果的逆转条件

reversed condition with different outcome

'''

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: list index out of range"

 if a == operator.gt:
   for i in range(len(xs)):
       if xs[i] > xs[i+1]:
           return True
       else: False

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

您的代码的第二个问题是 else: Trueelse: 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)-1i+1 1 太大时,将在循环的最后一次迭代中引发异常。

是否会得到异常 IndexError: list index out of range 取决于 for 循环是否有机会继续其最后一次迭代,或者函数是否会 return for-循环的最后一次迭代。

另一个问题是您调用的函数 sorted,它已经是 python 中内置函数的名称。重复使用该名称会导致混淆和可能的错误。由于您的函数不是 return 排序列表,而是测试列表是否已排序,因此我建议改为调用它 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

将参数 aoperator.gt 进行比较有点笨拙,因为您编写的函数无论如何都不适用于自定义运算符。我建议遵循 python builtins sorted and list.sort() 的约定,它使用默认为 False.

的可选参数 reverse

代码:

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
  • 让用户给你一个比较运算符,直接用那个运算符代替<>

替代代码使用 any or all

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