python中的比較

python語言對於各種類型都可以比較。

例如int類型,當進行大小比較時,其實是調用了__cmp__函數,或者可以顯式調用cmp(),返回值爲{-1, 0, 1},表示小於,等於,大於。


對於str類型,list類型,,class類型等,其實是調用__eq__, __ne__, __gt__,__ge__,__lt__, __le__等函數,分別對應==, !=, >, >=, <, <=等.

可以根據需要覆蓋這些函數達到重載運算符的目的。注意,這裏有個坑,就是__eq__, __ne__是兩個運算函數,而不像Java裏面,只有一個Object.equals()函數。

筆者在使用unittest庫做TDD編程時,就遇到這種情況。對某個class重載了==運算符,並且測試中會對含有該class實例的list進行assertListEqual。結果明明相等的兩個list,卻assert失敗。經過查看unittest源碼,發現其中對list逐個比較時,使用了不是==,而是!=。而!=並沒有重載,所以出現了不可預知的問題,即a==b和a!=b都爲True。



對於list/tuple類型,默認按順序逐個比較元素,然後比較首個不同的值。

對於set類型,運算符>,<分別表示子集和超集,因此有可能出現集合a<b與a>b同時爲false的情形,比如:

>>> a=set('123')
>>> b=set('234')
>>> a<b
False
>>> a>b
False
>>> b<a
False
>>> b>a
False
>>> a==b
False
>>>

對於dict類型,先比較長度。然後再從雙方最小key開始,看兩邊對於相同key有沒有不同的value,沒有的話說明兩個dict相等。當碰到不同key-value,相比較key,相同的話再比較value。

當碰到不同類型進行比較時,往往退化爲類型名稱的比較。



對於浮點數的比較,我們知道,無論哪種語言,只要才用IEEE浮點數表示,就意味着不是所有浮點數都能精確表示出來。

一般的比較浮點數,都是用閾值來判斷,即abs(a - b) < threshold,來認爲兩者足夠接近。

此外,還有一種方式,就是比較兩個浮點數之間允許有多少個其他可以精確表達的浮點數存在,相當於相對誤差,即abs ( (int&)f1 - (int&)f2 ) < absDelta


參考 http://hi.baidu.com/kanif/item/91a1605567e202c59e266793

參考http://www.flatws.cn/article/program/python/2011-03-16/17012.html

發佈了53 篇原創文章 · 獲贊 8 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章