「python學習手冊-筆記」003.數值類型

2020-12-05 紙鶴視界

003.數值類型

本系列文章是我個人學習《python學習手冊(第五版)》的學習筆記,其中大部分內容為該書的總結和個人理解,小部分內容為相關知識點的擴展。非商業用途轉載請註明作者和出處;商業用途請聯繫本人(gaoyang1019@hotmail.com)獲取許可。

「這不是演習!」

好了,從本章開始,我們就要正式進入python的學習.所涉及的內容深度會有所提升,但是還到不了學習完1+1=2之後就開始微積分推導的陡峭程度. 相關的補充內容我會以知識點補充或者外鏈的方式添加進來.

數值類型的基本知識

Python中的數值類型主要包括以下三類:

**整數:**也就是我們所熟悉的int類型. 在python3之中,不再區分整數和長整數.也就是說允許整數具備無限的精度. 當然,這個精度取決於我們計算機的內存大小. 「浮點數:」 浮點數在標準的CPython中,採用的是C語言的雙精度浮點數. 其精度和構建python解釋器的C語言編譯器的雙精度一致.具體的精度信息可以在 sys.float_info中查看,如下圖,詳細解釋請參考文檔 「複數:」 複數由實部和虛部構成,字面量的寫法可以寫成 a+bj的形式或者直接通過 complex(real,imag)來構建 In [2]: import sys# 雙精度浮點數相關信息In [3]: sys.float_infoOut[3]: sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)# 虛數的表示In [4]: cmplx = complex(1,2)In [5]: cmplxOut[5]: (1+2j)In [6]: type(cmplx)Out[6]: complex除了以上三種類型之外,python的數字類型還包括布爾類型.

各種進位的表示

python的整數默認採用十進位進行表示. 同樣,也支持二進位,八進位,十六進位的表示.

**二進位:**0b或者0B開頭表示 **八進位:**0o或者0O開頭表示(注意第二個字符是字母o) **十六進位:**0x或者0X開頭表示 可以使用內置函數bin(I),oct(I),hex(I)來進行進位轉換. 同時也支持int(str,base)將字符串轉換為對應的十進位整數.

In [12]: a =11In [13]: hex(a)Out[13]: '0xb'In [14]: oct(a)Out[14]: '0o13'In [15]: bin(a)Out[15]: '0b1011'# 將10按二進位轉換為十進位In [18]: int('10',base=2)Out[18]: 2# 將16進位ff轉換為十進位In [19]: int('ff',base=16)Out[19]: 255python的運算符

上表中基本把python中的運算符表達式全部列舉出來了. 而且是按照運算優先級從低到高的順序列舉出來的.

對於混合類型的運算,永遠向著精度更高的方向進行.當然也可以通過內置函數來進行強制類型轉換

In [4]: 40+3.14Out[4]: 43.14In [5]: int(3.14)Out[5]: 3In [6]: float(5)Out[6]: 5.0python的數值比較

數值的比較會輸出一個布爾值,比如:

In [10]: 1<2Out[10]: TrueIn [11]: 2.0>3Out[11]: FalseIn [13]: 2.0!=2.0Out[13]: False看第三項可以知道,python是支持混合類型的數值比較的.如前面所說,python在進行混合類型的數值運算的時候,會先將其轉換為精度更高的類型,然後再進行計算.

所謂鏈式比較如下例所示:

In [16]: 1<2<3Out[16]: TrueIn [17]: 1==2<3Out[17]: False其中第一個等效於1<2 and 2<3,第二個等效於1==2 and 2<3

數值的比較是基於數值大小進行的,對於整型的比較是沒問題的,但是對於浮點數的比較,就可能出現不可預知的錯誤. 比如以下的例子:

In [14]: 1.1+2.2 == 3.3Out[14]: FalseIn [15]: 1.1+2.2Out[15]: 3.3000000000000003這個例子就有點讓人匪夷所思了,1.1+2.2憑什麼不等於3.3...

這是由於浮點數是有限的比特位數,導致無法精確的表示某些數值.這個問題不僅在python中存在,在其他語言中同樣存在. 不過python有分數和小數,可以很好的規避這些問題. 畢竟python適合科學計算的特性不是白來的.

python中的除法

python中有三種風格的除法和兩種除法運算符.

「X/Y」

這個是所謂的經典除法和真除法.在python2中,對於整數而言,會省略小數的部分,對於浮點數則會保留小數部分. 在python3中,無論整數還是浮點數,真除法都會保留小數部分.

In [18]: 4/2Out[18]: 2.0In [19]: 10/3Out[19]: 3.3333333333333335「X//Y」

向下取整除法,注意這個叫法,叫「向下」取整,也就是比真正結果小的那個最接近的整數.

In [20]: 10//4Out[20]: 2In [21]: 10//3Out[21]: 3向下取整除法(floor division)和截斷除法的區別:

//操作符嚴格來說應該叫做向下取整除法,其獲取的結果是「真正結果之下」的最接近的整數.這個對於正數來說比較好理解,捨棄小數的部分.對於負數而言,就是比其結果小的最接近的負數.

In [25]: 10//4,10//-4Out[25]: (2, -3)In [26]: 10//9,10//-9Out[26]: (1, -2)通過這兩個例子就可以很好的看出來了.

那麼python中的截斷,可以通過math模塊中的trunc方法實現

In [28]: import mathIn [29]: math.floor(2.5)Out[29]: 2In [30]: math.floor(-2.5)Out[30]: -3In [31]: math.trunc(2.5)Out[31]: 2In [32]: math.trunc(-2.5)Out[32]: -2那對於所謂的截斷除法,我們可以使用一種特殊的方式.

In [33]: 5//-2Out[33]: -3In [34]: math.trunc(5/-2)Out[34]: -2按位操作

按位操作在處理網絡數據包,串行程序等二進位數據的時候十分方便,所以python中如C語言一樣,也支持位移操作.

In [1]: x=1# 左移兩位In [2]: x<<2Out[2]: 4# 按位或In [3]: x|2Out[3]: 3# 按位與In [4]: x&1Out[4]: 1# 按位異或In [5]: x ^ 1Out[5]: 0其他的就不多說了,不難. 用到時候查下文檔就完事兒了.

其他內置數值工具

數值處理相關的方法除了pow,abs這些內置方法之外,大部分的方法都在內置模塊math之中. 這裡舉一些例子:

In [6]: import mathIn [7]: math.piOut[7]: 3.141592653589793In [8]: math.eOut[8]: 2.718281828459045In [9]: math.sin(90)Out[9]: 0.8939966636005579In [10]: math.sqrt(144)Out[10]: 12.0In [11]: pow(2,4)Out[11]: 16In [12]: abs(-42.1)Out[12]: 42.1In [13]: min(3,2,1)Out[13]: 1In [14]: max(1,3,4,9)Out[14]: 9# 四捨五入In [15]: round(3.123),round(2,512),round(-3.123),round(-2.512)Out[15]: (3, 2, -3, -3)其他數值類型

複數

說實話,複數是個啥我都快忘了...但是python支持這玩意兒. 複數主要可以用在工程計算和科學計算中,當然作為一個數學學渣,心有餘而力不足. 所以這一塊不多說了. 簡單說一下複數的表達形式.

python中的複數是由兩個浮點數組成,分別表示複數的實部和虛部.可以寫成 X+Yj的形式. 複數相關的處理方法主要集中在cmath模塊中.

用到的時候再說吧,估計也用不到...

小數

python2.4之後引入了小數這種數據類型,正式名稱叫做Decimal. 需要注意的是python中的Decimal類型和浮點數不是一個東西. 小數很像浮點數,但是小數有固定的位數和小數點.比如,我們可以使用小數對象實現一個只有兩位小數位精度的浮點數.

根據之前的介紹我們已經了解了浮點數中一個詭異的現象,比如:

In [16]: 0.1+0.1+0.1-0.3Out[16]: 5.551115123125783e-17前文說過,這是由於浮點數存儲位數有限造成的.那麼python作為科學計算領域的老大,這麼不嚴謹的事情,肯定是不允許發生的.所以python中定義了一中新的數據類型Decimal來解決這個問題.

In [18]: Decimal('0.1')+Decimal('0.1')+Decimal('0.1')-Decimal('0.3')Out[18]: Decimal('0.0')這裡需要注意一點的是,上面我們是從字符串創建的小數對象.如果我們直接從浮點數創建小數對象呢?

In [19]: Decimal(0.1)+Decimal(0.1)+Decimal(0.1)-Decimal(0.3)Out[19]: Decimal('2.775557561565156540423631668E-17')完了,饒了一圈又回來了...

這是python處理的問題.直接從浮點數創建小數對象的話,這個轉換是精確的,也就說浮點數會按照其存儲的內容完完整整的被創建為小數.(感覺這一篇寫完了是不是可以寫一篇浮點數相關的文章...)

我們可以通過設置小數數值精度,捨入模式等方法來解決這個問題.(回頭用到的時候再寫吧,我現在也有點懵逼...)

分數

分數類型在python中稱之為Fraction,實現了一個有理數對象.實質上就是顯式的保持一個分子和一個分母,從而避免浮點數的精度問題. 分數的實現不像浮點數一樣依靠底層硬體,所以,分數在性能上比浮點數要弱.

In [2]: from fractions import Fraction# 1/3In [3]: x=Fraction(1,3)In [4]: y=Fraction(4,6)In [5]: xOut[5]: Fraction(1, 3)In [6]: yOut[6]: Fraction(2, 3)In [7]: print(y)2/3In [8]: x+yOut[8]: Fraction(1, 1)集合

集合,就是數學上的那個集合.按照集合的定義,一個元素在集合中無論添加多少次,在集合中也都會表示為1次,也就說集合不能有重複的元素(初中數學好像是這麼教的...) 所以集合這個類型在涉及數值和資料庫的操作中是有著廣泛應用的.

集合有著列表和字典的一些共同特性,比如集合是可迭代的對象,可以按需增長或者縮短,可以包含多種數據類型. 另外,集合中需要注意的,集合的元素是無序的.

集合的創建比較簡單:

In [9]: x=set('abcde')In [10]: y=set('abcfg')In [11]: xOut[11]: {'a', 'b', 'c', 'd', 'e'}In [12]: yOut[12]: {'a', 'b', 'c', 'f', 'g'}集合支持數學上集合的那些操作:

# 差集In [13]: x-yOut[13]: {'d', 'e'}# 併集In [14]: x|yOut[14]: {'a', 'b', 'c', 'd', 'e', 'f', 'g'}# 交集In [15]: x&yOut[15]: {'a', 'b', 'c'}# 異或(這個叫什麼集啊...沒學過呢...)In [16]: x^yOut[16]: {'d', 'e', 'f', 'g'}# x是否為y的超集,y是否為x的超集In [17]: x>y,x<yOut[17]: (False, False)集合也支持成員測試:

In [19]: 'a'in xOut[19]: True集合的修改:

In [20]: x.add('w')In [21]: xOut[21]: {'a', 'b', 'c', 'd', 'e', 'w'}# 求併集In [24]: x.update(set('awq'))In [25]: xOut[25]: {'a', 'b', 'c', 'd', 'e', 'q', 'w'}In [26]: x.remove('q')In [27]: xOut[27]: {'a', 'b', 'c', 'd', 'e', 'w'}集合作為一個可迭代對象,也支持len()方法和for循環以及列表表達式:

In [29]: for item in set('abc'):print(item*3)bbbcccaaa「集合的另外一種創建方法」

# 可以直接使用{}來創建集合In [30]: x={1,2,3,4}In [31]: xOut[31]: {1, 2, 3, 4}In [32]: type(x)Out[32]: set這裡需要注意的是,對於{}空的內容python依舊會認為其是一個字典,所以要創建空的集合還是要使用set()方法

In [34]: type({})Out[34]: dict作為一種可迭代對象,集合也支持推導表達式:

In [35]: {x for x in'spam'}Out[35]: {'a', 'm', 'p', 's'}最後需要注意一點,python的集合有一個限制. 那就是集合中只能包含不可變的(可哈希化的)對象類型. 像列表,字典這樣的玩意兒不能作為集合的元素.而像字符串,數字常量,元組這樣的類型是可以作為集合的元素的.

「集合的優勢」

上文中已經講過,集合中的元素只能出現一次.除了實現集合的數學特性之外. 集合還可以用來過濾重複性數據,提取列表,字符串以及其他可迭代類型中的差異,也可以用來進行一些順序無關的等價性測試.

# 使用集合進行重複項過濾In [36]: L = [1,2,2,3,4,5,2,1]In [37]: set(L)Out[37]: {1, 2, 3, 4, 5}In [38]: L=list(set(L))In [39]: LOut[39]: [1, 2, 3, 4, 5]「差異數據的提取」

In [40]: set('while')-set('what')Out[40]: {'e', 'i', 'l'}In [41]: set(dir(bytes))-set(dir(bytearray))Out[41]: {'__getnewargs__'}「進行順序無關性的兩組數據的等價性測試」

In [45]: L1 = [1,2,3,4,5]In [46]: L2 = [5,4,1,2,3]In [47]: L1 == L2Out[47]: FalseIn [48]: set(L1)==set(L2)Out[48]: True布爾類型

python的布爾型的定義和C語言有一點相似,本質上是int類型的子類. 有True和Flase兩個實例.其實就是整數1和0的定製版. 布爾類型提高了python代碼的可讀性. 這讓我們在設置flag的時候,更加形象. 我們可以寫while True而不用寫while 1

In [49]: type(True)Out[49]: boolIn [50]: True+4Out[50]: 5In [51]: True ==1Out[51]: TrueIn [52]: Trueis1Out[52]: False臥槽,這章終於寫完了...就這樣...

相關焦點

  • 「學習筆記」第六章 項目進度管理
    「學習筆記」「項目管理」第一章 什麼是項目管理「學習筆記」「項目管理」第二章 什麼是項目管理「學習筆記」「項目管理」第三章 項目管理流程控制「學習筆記」第四章 項目綜合管理「學習筆記」第五章 項目規模管理想看更多,敬請期待
  • 慢步python,你苦苦找尋的python中文使用手冊在哪裡?這裡有答案
    #學習難度大python對大家來說,應該算是相對新的程式語言。即使這樣,我們學習python的道路依舊困難重重。問題在,相關的學習資料不夠系統。初學者使用手冊像以前剛開始使用電視、手機一樣,都有一本使用說明書,即使用手冊。
  • 0基礎入門Python學習步驟如何安排?
    一、清楚學習目標 無論是學習什麼知識,都要有一個對學習目標的清楚認識。只有這樣才能朝著目標持續前進,少走彎路,從學習中得到不斷的提升,享受python學習計劃的過程。 雖然目前的程式語言有很多,但是基礎語法上的概念,本質上都是相通的。可以做到一通百通。
  • 前阿里P8甩我一份內部SpringCloud筆記手冊,真香
    其實,學習Spring,不要總停留在框架的使用上。理解並掌握底層原理並熟悉源碼實現,將這些「內化為自身的抽象思維能力」,「做到靈活運用」,才是你突破瓶頸,脫穎而出的重要方向!然而,一個人閱讀源碼是相當費力的。
  • 零基礎學習python,這幾本書少不了
    目前,社會上已經掀起了一波學習python的熱潮,但是很多人由於並沒有python基礎,不知道從哪裡開始學習,小編今天整理了零基礎學習python的一些書籍,希望對大家有所幫助。1.《"笨辦法"學Python》推薦理由:本書是一本python入門書籍,比較適合沒有計算機、編程基礎,但是對python感興趣的小白學習使用。這本書是以習題的方式一步一步引導讀者了解、學習python,從簡單的列印一直講到完整項目的實踐,讓初學者從基礎的python知識入手,最終體驗到軟體開發的基本過程。
  • 詳解學習python的十一個步驟
    學好python最重要的是堅持,只有堅持可以是王道,下面介紹了一些對於python初學者真正堅持學習的新概念:技巧1:每天的代碼當你學習一門新語言時,一致性是非常重要的。我們建議每天都致力於編寫代碼。這很難相信,但是肌肉記憶在編程中起著很大的作用。每天進行編碼將有助於發展肌肉記憶。
  • 「python opencv視覺零基礎實戰」七邏輯運算應用
    一、學習目標了解opencv中圖像的邏輯運算了解opencv中邏輯運算的應用如有錯誤歡迎指出~目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python
  • 「高達機體」GN-003/af-G02 陣風型主天使高達
    搭載「陣風」裝備的主天使鋼彈。「GN-003主天使鋼彈」設想在廣域大氣層內進行戰鬥時用的裝備衍生版本,就是這架GN-003/af-G02陣風型主 天使鋼彈。這是主天使鋼彈裝上附加高機動性與遠距離攻擊能力的增裝組件「陣風型」而成的形態,也可以在裝備此組件的狀態下從飛行形態直接變形成
  • python教程之python數學運算
    number=int(input('請輸入一個數值->'));#界面手動輸入數值,賦值給numberprint('類型:',type(number));#輸出number類型print('二進位:',bin(number));#函數bin將number轉換成二進位
  • 教你學習:Python-100-Days-05/06合集 函數
    教你學習: Python-100-Days-05/06合集 構造程序邏輯函數本項目是參考項目內容,進行個人理解,和原有項目有出入,如想了解詳情,請自行百度去搜索項目學完前面幾章,我們也開始一點點接觸python的冰山一角,學習了核心元素(變量,類型,運算符,表達式,分支結構,循環結構)之後,我們要開始通過學過的知識,來解決現實中的一些問題
  • Python最佳經典學習路線
    如何學習Python python語言基礎:(帶你熟悉python語言的特性,學會使用python開發環境,使用python開發一些簡單的案例) (1)Python3入門,數據類型,字符串 (2)判斷/循環語句,函數,
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    (6套課程) 注:零基礎全能篇中,針對windows和liunx系統均有兩套課程可供選擇學習,單純學python,哪個系統都一樣,初學者只需選擇自己熟悉的系統學習相應課程即可。基於liunx系統的python教程,課程裡也有liunx操作的詳細教學,不用擔心學習時不會操作liunx系統。
  • 「學習三部曲」是怎樣煉成的
    「學習三部曲」是怎樣煉成的金羊網  作者:羊城晚報出版社  2020-12-25 昨天下午,羊城晚報社副社長李宜航應邀為廣東省委黨校中青班學員作
  • python初學者必看的學習路線 Python是近幾年比較火的程式語言
    Python是近幾年比較火的程式語言之一,因為人工智慧的火爆,讓很多人都想從事python開發。很多零基礎學員在學習python的時候都會走一些彎路,下面小編就為大家分享python學習路線圖,幫助零基礎學員在學習的時候少走彎路。 很多人都在問Python學習步驟應該如何安排?
  • 「死亡筆記」續篇 新的筆記所有者是最高法院法官!
    「死亡筆記」續篇 新的筆記所有者是最高法院法官! 動漫 178動漫頻道 ▪ 2016-06-06 11:29:09   電影「死亡筆記 Light up the NEW world」將在2016年10月
  • 「讀書筆記」《漫畫算法》:克服對算法的恐懼,從漫畫開始
    既然我也覺得寫讀後感有一部分原因就是為了給網友們閱讀的,「那我就要吧讀後感寫的對大傢伙更有幫助一些」。嗯,我會在這個方向上好好思考並努力的。「如果作為一個完全沒接觸過「程式設計師小灰」公眾號的讀者,那麼這本書的結構是很合理的。尤其適合算法的入門學習。」這裡又想說句題外話了,其實現在很多的優質文章,都在被整理成書籍並出版,我覺得並不是一個壞事。恰恰相反,這些文章整理成書後,書籍的質量其實遠超一些教學書,比如大學裡一些中文的教程書。
  • 「人造人009 COJ」聲優發布!! 009由河本啟佑、003由種田梨沙擔當~
    「人造人009 COJ」聲優發布!! 「009/ 島村喬」:河本啟佑 「003/法蘭索娃・阿爾達努」:種田梨沙 「001
  • 「自動駕駛」,穩賺躺贏——X檔案-Search類(編號003)
    Search類「自動駕駛」前情回顧:2020年1月13日百度營銷啟動『鼠年oCPC自動駕駛活動』2020年1月21日至2月10日活動期間,25個客戶,81個搜索推廣帳戶參與活動,涵蓋243個投放包;客戶投放效果滿足預期,
  • 學會Python後,人生簡直開掛了!
    不知不覺,當代年輕人早就習慣於「忙碌」了。被「996」支配得體無完膚,不僅身體吃盡熬夜加班的苦頭,精神上也承受著過度的壓力。更可怕的是,很多時候一天下來,完全不知道自己究竟幹了什麼!作為職場必備技能,大部分行業都已在招聘 JD 中,紛紛給出了「熟悉 Python 優先」這樣的招聘條件。▲熟悉python成了很多崗位的招聘要求如今,國家的大力扶持,各大高校也相繼開設了人工智慧專業課程。當下,python 在信息搜集和數據分析方面的應用已經非常普遍,已經成了職場的必備技能,而不再只是程式設計師的專屬。
  • Python不同數值類型間的轉化,以及內置數學函數示例
    上一集我們知道了Python數值的4個不同類型:整型、浮點型、複數型、布爾型。檢測一下小學數學還會多少,Python中4個數值類型你記住了嗎?這次我們繼續了解數值之間的數學函數以及相互的轉化方法。將數值轉化為整型在Python中,允許數值類型進行互相轉化,Python已經內置好了轉化函數。例如將數值轉化為整型,使用的函數是int(n)這樣就把n變成了整型。