[英]list.index() function for Python that doesn't throw exception when nothing found
[英]Python list.index throws exception when index not found
為什么 list.index 會拋出異常,而不是使用任意值(例如-1
)? 這背后的想法是什么?
對我來說,處理特殊值而不是異常看起來更干凈。
編輯:我沒有意識到-1
是一個潛在的有效值。 盡管如此,為什么不做其他事情呢? None 的值怎么樣?
因為-1
本身就是一個有效的索引。 它可以使用不同的值,例如None
,但這沒有用, -1
可以在其他情況下(因此str.find()
),並且僅相當於錯誤檢查,這正是異常是給。
補充一下 Devin 的回答:這是特殊返回值與異常之間的老爭論。 許多編程大師更喜歡異常,因為在出現異常時,我可以看到整個堆棧跟蹤並立即推斷出什么是錯誤的。
好吧,特殊值實際上必須是None
,因為 -1 是一個有效的索引(意味着列表的最后一個元素)。
您可以通過以下方式模擬此行為:
idx = l.index(x) if x in l else None
“異常值與錯誤值”的爭論部分是關於代碼清晰度的。 考慮帶有錯誤值的代碼:
idx = sequence.index(x)
if idx == ERROR:
# do error processing
else:
print '%s occurred at position %s.' % (x, idx)
錯誤處理最終被塞進了我們算法的中間,使程序流程變得模糊。 另一方面:
try:
idx = sequence.index(x)
print '%s occurred at position %s.' % (x, idx)
except IndexError:
# do error processing
在這種情況下,代碼量實際上是相同的,但主要算法沒有被錯誤處理破壞。
在 Python 中,-1 是一個有效索引,表示列表末尾的數字(而不是開頭),所以如果你要
idx = mylist.index(someval)
nextval = mylist[idx+1]
然后你會得到數組的第一個值,而不是意識到有一個錯誤。 這樣你就可以捕獲異常並處理它。 如果您不想要異常,則只需事先檢查:
if someval in mylist:
idx = mylist.index(someval)
編輯:返回 None 沒有任何意義,因為如果您要測試 None,您不妨測試該值是否在上面的列表中!
主要是為了確保盡快發現錯誤。 例如,考慮以下情況:
l = [1, 2, 3]
x = l.index("foo") #normally, this will raise an error
l[x] #However, if line 2 returned None, it would error here
您會注意到,如果 index 返回 None,則會在l[x]
而不是x = l.index("foo")
處引發錯誤。 在這個例子中,這並不是什么大問題。 但是想象一下,第三行在百萬行程序中的某個完全不同的地方。 這可能會導致一些調試噩夢。
我同意 Devin Jeanpierre 的觀點,並補充說在小例子中處理特殊值可能看起來不錯,但是(除了一些值得注意的例外,例如 FPU 中的 NaN 和 SQL 中的 Null)它幾乎沒有擴展。 它唯一有效的地方是:
def GetListIndex(list, searchString):
try:
return list.index(searchString)
except ValueError:
return False
except Exception:
raise
一個簡單的想法: -1
完全可以用作索引(與其他負值一樣)。
這是一個語義論證。 如果你想知道一個元素的索引,你就聲稱它已經存在於列表中。 如果你想知道它是否存在,你應該使用in
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.