亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

條件相反,結果不同

條件相反,結果不同

臨摹微笑 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 關注
  • 183 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號