不同结果的逆转条件
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: True
或 else: 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+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
将参数 a
与 operator.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 内置 sorted
和 list.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))
'''
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: True
或 else: 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+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
将参数 a
与 operator.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 内置sorted
和list.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))