一、數字
在看《Python 核心編程》的時候,我就有點疑問,為什麼沒有把Python數字放在基礎範圍之內呢,可能作者先要通過Python對象,然後在深入到數字,這樣會更加容易理解。這裡有一個觀點就是“Python的一切皆對象”原則,通過上一節的學習變數賦值,就能深刻體現這個原則,具體見下節的學習入門筆記。
由於數字在Python中用到的並不很多,就像學js的數字類型一樣,我覺得最好放在基礎篇之內,這樣對於下節的對象有個鋪墊的作用。
本節主要是學習Python的數字類型、操作、與數字有關的內建函數。
1、數字類型
在上節中說,Python變數無須定義類型,這是由於它是動態類型的語言,在記憶體中根據所賦值動態地確定其類型。如果偏偏要在python中給變數分類的話,那麼可分:可變類型和不可變類型。
這裡整理了可變類型(mutable)和不可變類型(immutable)的相關知識:
(或許我們在學習了下一節才能對此有深刻理解,如果曾學習過C,它像C指標的藝術;如果學了C#,它像C#實值型別與參考型別的性質;如果學了js,它的性質基本上同Python;總的來說,一切的程式設計語言都圍繞著基礎核心,只是各自體現不一樣而已,我們要學會融會貫通,舉一反三。。。不過感覺好難哦。)這裡推薦一篇文章:《如何學會600多種程式設計語言》 -----------------------------------------------------------------------------------不可變類型(immutable):就是記憶體中的那可內容(value)是否可以被改變,如果是不可變則,在對對象本身操作的時候,必須在記憶體的另外地方再申請一塊地區(因為老地區#不可變#),老的地區就丟棄了(如果還有其他ref,則ref數字減1,類似unix下的hard-link)。
可變類型(mutable):對對象操作的時候,不需要再在其他地方申請記憶體,只需要在此對象後面連續申請(+/-)即可,也就是它的address會保持不變,但地區會變長或者變短。
不可變類型有:string、interger、tuple:
1 >>> var1 = 1 2 >>> var2 = var1 3 >>> var1,var2 4 (1, 1) 5 >>> id(var1),id(var2) #同指同一記憶體地區,id相同 6 (21200672, 21200672) 7 >>> var1 += 1 8 >>> var1,var2 9 (2, 1)10 >>> id(var1),id(var2)
#由於var1,var2資料不可變的,對var1+1後,申請另外一塊地區,id(var1)變了,id(var2)不變,對此地區ref數字-111 (21200660, 21200672)12 >>>
可變類型:list,dict
1 >>> lst1 = [1,2,3] 2 >>> lst2 = lst1 3 >>> lst1,lst2 4 ([1, 2, 3], [1, 2, 3]) 5 >>> id(lst1),id(lst2) 6 (28497360, 28497360) 7 >>> lst1.append(4)#可變類型的,append後,address會保持不變 8 >>> lst1,lst2 9 ([1, 2, 3, 4], [1, 2, 3, 4])10 >>> id(lst1),id(lst2)#lst1,lst2一直指向同一地區11 (28497360, 28497360)12 >>>13 在操作這種類型的時候要特別小心,dict的key不用可變類型的,函數傳參的時候不用可變類型的。14 eg:15 >>> def dis(arg=[]):16 ... arg.append('1')17 ... print arg18 ...19 >>> dis()20 ['1']21 >>> dis()22 ['1', '1']23 >>>id(dis())24 ['1', '1', '1']25 50524661526 >>>id(dis())27 ['1','1','1','1']28 505246615
參考:http://blog.chinaunix.net/uid-26249349-id-3080279.html
數字就是不可變類型,也就是說更改數位值就會產生新的對象,當然這個我們無須考慮。
python數字類型可分為:整型、長整型、布爾型、雙精確度浮點型、十進位浮點型和複數
(1)、整型:
如:0101、8、-3、0X80、-0X78
(2)、布爾型
True、False
(3)、長整型
在整型後面加L(或l),目前整型和長整型在慢慢統一。只有對它調用repr()函數才有機會看到L,調用str()函數則看不到L:
>>> aLong=11111111111111111111>>> aLong (在命令列中,直接輸入變數名顯示值,這種情況實際上調用了repr()函數) 11111111111111111111L>>> print aLong (在命令列中,如果在變數前面使用print 則調用str()函數) 11111111111111111111>>>
(4)、雙精確度浮點型
類似C中的double。實際精度依賴Python解譯器的編譯器。
(5)、複數
1 >>> aComplex=2.1+3j 2 >>> aComplex 3 (2.1000000000000001+3j) 4 >>> aComplex.real 5 2.1000000000000001 6 >>> aComplex.imag 7 3.0 8 >>> aComplex.conjugate() 9 (2.1000000000000001-3j)10 >>>
更多見python core programming
2、操作符
分別是:+、-、*、/、%、**、//(地板除)
很有意思的是,python的除法運算。
在js中實現以下代碼:
1 <script type="text/javascript">2 var a=1,b=2;3 var c=0.1,d=0.2;4 var result1=a/b;5 var result2=c/d;6 alert(result1);#0.5 7 alert(result2);#0.58 </script>
如果我們在Python中實現,則如下:
>>>1/20>>>0.1/0.20.5
有些奇怪吧,Python是這樣處理的;
傳統除法:如果是整型除法,則傳統除法會捨棄小數點部分,返回一個整型(地板除);如果運算元之一是浮點型,則執行真正地除法。
真正除法:返回真實的商,在未來Python版本中會成為統一標準,不過現在我們通過from __future__ import division可以實現。
>>> from __future__ import division>>> 1/20.5>>> 1.0/2.00.5
地板除:從Python2.2開始,新操作符//,被稱為地板除、即不管運算元是什麼類型,總會捨棄小數部分,返回整數。
>>> 1//20>>> 1.0//2.00.0>>> -1//2-1
其他動作符有興趣可以在《Python 核心編程》和官網文檔看看。
3、與數字有關的內建函數
關於更多內建函數,將會在後面學習中具體說明,今天先學習關於數位內建函數。它們有:
(1)、標準內建函數:
cmp()、str()、type()對於任何類型都可以使用
>>> cmp(1,2) #比較大小 -1>>> cmp(2,1)1>>> cmp(2,2)0>>> str(0xFF) #轉換成字串'255'>>> type(0xFF) #返回物件類型<type 'int'>>>> type('str')<type 'str'>
(2)、轉換工廠函數:
int()、long()、float()、bool()、complex(),它們都是轉換成跟數字有關的函數。如:
>>> '111''111'>>> int('222')222>>> long('222')222L>>> float('222')222.0>>> bool(1)True>>> complex(2)(2+0j)>>> bool(True)True>>> bool(454)True>>> bool(0)False
(3)、功能函數
有abs()返回給定參數的絕對值:
>>> abs(-3)3
coerce()資料類型對兩個參數進行轉換函式:
>>> coerce(1,2)(1, 2)>>> coerce(1,-2)(1, -2)>>> coerce(1,123L)(1L, 123L)>>> coerce(1.3,123L)(1.3, 123.0)>>> coerce(1j,123L)(1j, (123+0j))
divmod()通過取餘,返回商和餘數的元祖:
>>> divmod(10,2)(5, 0)>>> divmod(10,3)(3, 1)
pow()和**都可以進行指數運算:
>>> 5**225>>> pow(5,2)25
round()四捨五入:
>>> round(3)3.0>>> round(3.45)3.0>>> round(3.999999,1)4.0
更多內建函數見Python官網文檔。