1. 程式人生 > >洗禮靈魂,修煉python(14)--模組decimal, fractions,operator,collections以及精度介紹

洗禮靈魂,修煉python(14)--模組decimal, fractions,operator,collections以及精度介紹

decimal

1.作用:

用於浮點數計算。相比內建的二進位制浮點數實現 float這個型別有助於 金融應用和其它需要精確十進位制表達的場合,控制精度,控制舍入以適應法律或者規定要求,確保十進位制數位精度,或者使用者希望計算結果與手算相符的場合。Decimal 重現了手工的數學運算,這就確保了二進位制浮點數無法精確保有的資料精度。 高精度使 Decimal 可以執行二進位制浮點數無法進行的模運算和等值測試

2.函式:

其實decimal模組最常用的函式就是Decimal()和getcontext(),其他基本很少用,以後用到再細說

Decimal():

簡單的檢視特性:

運算:

這樣太長對不對,所以需要調整精度,則使用函式getcontext():

裡面的prec子方法則調整精度的,所以可以先設定好精度再計算:

注意getcontext()函式必須加括號例項化才行【什麼是例項在類的章節會提到】

也可以對字串浮點型進行操作:

說到精度,那不得不提到round()這個BIF

round()如果只有一個數作為引數,類似四捨五入。當出現.5的時候,round()取靠近的偶數,這就是為什麼round(2.5) = 2。當指定取捨的小數點位數的時候,一般情況也是使用四捨五入的規則,但是碰到.5的這樣情況,如果要取捨的位數前的小數是奇數,則直接捨棄,如果偶數則向上取捨。所以它不是簡單意義上的四捨五入,而是ROUND_HALF_EVEN的策略

格式化也可以得到想要的精度:

python預設的是17位小數的精度,但是如果想得到更高精度的使用格式化則不行:

可以顯示這麼多,但是發現沒,10除以3會等於一個3.00……,大家都知道等於3.333……對吧?所以不準確,所以在高精度時使用格式化不行

 再看看前面提到的decimal模組的getcontext,prec就是預設的精度,顯示為28位,也可以設定為50位甚至更高,都可以。這樣在分析複雜的浮點數的時候,可以有更高的自己可以控制的精度。

math模組的ceil()和floor()也有點這麼個意思,自行體會

 fractions

1.作用:

表達分數的模組

2.函式:

這個模組的方法很少,並且其實用得也挺少,基本就是拿來表示分數的Fraction而已

也可以對字串浮點型進行操作:

operator

1.作用:

operator模組是python中內建的操作符函式介面,它定義了一些算術和比較內建操作的函式。operator模組是用c實現的,所以執行速度比python程式碼快

2.函式:

其實operator模組的方法基本和常用邏輯操作符和內建運算函式一樣,但是你記住比直接使用操作符來運算速度更快就行了:

但是itemgetter函式要特別提一下:

operator模組提供的itemgetter函式用於獲取物件的哪些維的資料,引數為一些序號,例:

可見,此時的itemgetter函式的引數為索引

那麼這個函式最常用的地方在哪?

結合sorted函式進行排序:

因為key可以接受一個函式(或者匿名函式),所以其實發現功效是一樣的【匿名函式在自定義函式那一章詳解】

collections

1.作用:

提供許多有用的集合類

2.函式:

老規矩,我只解析常用方法

namedtuple

因為tuple可以表示不可變集合,例如,一個點的二維座標: p = (3, 7)。也可以用namedtuple來表示:

很強勢對不對?

 看看方法:

有沒有發現,它其實就是用來表示這些的?

deque:使用列表存儲資料時,按索引訪問元素很快,但是插入和刪除元素就很慢,因為列表是線性儲存,資料量大的時候,插入和刪除效率很低。deque為了高效實現插入和刪除操作的雙向列表,適合用於佇列和棧:

其實和列表的一般方法沒什麼區別,就是速度快,deque除了實現list的append和pop,還有appendleft和popleft,這樣就可以非常高效地往頭部新增或刪除元素。

defaultdict:使用dict時,如果引用的Key不存在,就會丟擲KeyError。如果希望key不存在時,返回一個預設值,就可以用它:

 注意預設值是呼叫函式返回的,而函式在建立defaultdict時傳入,除了在Key不存在時返回預設值,(其實在之前也講解了當訪問引數不存在時,返回一個值的,自己去翻前面的文章,絕對講過),defaultdict的其他行為跟dict是完全一樣的

orderedDict:使用dict時,Key是無序的。在對dict做迭代時,我們無法確定Key的順序。

如果要保持Key的順序,可以用orderedDict:

注意,orderedDict的Key會按照插入的順序排列

Counter:是一個簡單的計數器:

 從上面看Counter其實也是dict的一個子類