Python基礎(chǔ)之?dāng)?shù)據(jù)類型詳解
一、整數(shù)
python2中整形可以分為一般整形和長整形,但是在python3中,兩者以及合二為一了,只有整形。python中的整形是具有無限精度的(只有內(nèi)存能放下),可以表示任意位數(shù)的數(shù)字。例如:
>>> 1111_2222_3333_4444_5555_6666_7777_8888_9999_0000 1111222233334444555566667777888899990000
python人性化的地方在于,上面的代碼中,我每四位做了一個(gè)分割,讓數(shù)字看起來很清晰。外國人可能更喜歡每3位做一個(gè)分割。
>>> 123_456_789 123456789 >>>
二、浮點(diǎn)數(shù)
浮點(diǎn)數(shù)在CPython中的標(biāo)準(zhǔn)實(shí)現(xiàn)是采用C語言中的雙精度類型(double)來實(shí)現(xiàn),因此一個(gè)浮點(diǎn)數(shù)占8字節(jié),這點(diǎn)對(duì)于python而言可能不重要。重要的是它是按照IEEE754標(biāo)準(zhǔn)實(shí)現(xiàn)的。例如:
>>> 1.234 1.234 >>> 1.23412313131231233 1.2341231313123124 >>> 1.231123E100 1.231123e+100
浮點(diǎn)數(shù)支持科學(xué)計(jì)數(shù)法寫法。
三、復(fù)數(shù)
python內(nèi)部集成了復(fù)數(shù)類型,這對(duì)于坐標(biāo)或者復(fù)變函數(shù)與積分變換計(jì)算而言可能提供了大大的方便,但是通常處理數(shù)值計(jì)算的時(shí)候,我們還是采用numpy庫。復(fù)數(shù)可以直接用1+1j類似的方式來直接初始化,也可以使用內(nèi)建函數(shù)complex(real,imag)來創(chuàng)建一個(gè)復(fù)數(shù)。例如:
>>> a = 1+2j >>> a (1+2j) >>> type(a) <class 'complex'> >>> b = complex(2,2) >>> b (2+2j) >>>
當(dāng)然了,python也提供了復(fù)數(shù)相關(guān)計(jì)算的實(shí)現(xiàn),例如:
>>> b + a (3+4j) >>> a - b (-1+0j) >>> a * b (-2+6j) >>> a / b (0.75+0.25j) >>>
四、運(yùn)算符,優(yōu)先級(jí)以及結(jié)合性
每一門語言都有自己所支持的運(yùn)算符,運(yùn)算符之間是有優(yōu)先級(jí)的,操作數(shù)和運(yùn)算符之間是由結(jié)合性的。一般而言,我們沒有必要清楚的記住每一個(gè)運(yùn)算符直接的關(guān)系。這就要求在編寫程序的時(shí)候,多使用()來表達(dá)表達(dá)式的精確意義。例如:
>>> x = 1 >>> y = 2 >>> not x and y or y > x != 1 False
這樣的表達(dá)式就已經(jīng)過于復(fù)雜了,不太好理解其中的邏輯。當(dāng)然了,你的真實(shí)意圖可能如下:
>>> ((not x) and y) or (y > (x != 1)) True
這時(shí)候,結(jié)果就和上面的不一樣了,所以如果沒有必要,不要寫復(fù)雜表達(dá)式,如果寫了,那么請(qǐng)給復(fù)雜表達(dá)式加上()來精確的表達(dá)你的意思。
五、混合類型計(jì)算
混合類型之間的計(jì)算結(jié)果總是向復(fù)雜的類型轉(zhuǎn)換。例如:
>>> num = 1 + 2.3 >>> type(num) <class 'float'> >>> num = 1 + (2 + 3j) >>> type(num) <class 'complex'>
六、除法
在python3中除法可以分為正常除法和取整除法兩種。由于python2已經(jīng)停止了支持,本專欄的所有內(nèi)容將只針對(duì)python3。
/:現(xiàn)在python3中的/總是執(zhí)行真除法,無論操作數(shù)的類型是什么。執(zhí)行結(jié)果總是包含小數(shù)部分。
//:執(zhí)行向下取整除法,如果操作數(shù)都是整數(shù),那么結(jié)果將會(huì)是整數(shù);如果其中任意一個(gè)操作數(shù)是浮點(diǎn)數(shù),那么執(zhí)行結(jié)果將會(huì)是浮點(diǎn)數(shù)。
仔細(xì)看下面的例子:
>>> 3 / 2 1.5 >>> 3.0 / 2 1.5 >>> 3 // 2 1 >>> 3.0 // 2 1.0
盡管,我們可能很少書寫包含最后一種情形的表達(dá)式,但是我們需要注意它的結(jié)果,它仍舊是先執(zhí)行向下取整除法,然后加上小數(shù)部分。再來看下面的例子,來證實(shí)這確實(shí)是向下取整除法。
>>> -2.9 // 1 -3.0 >>> -2.1 // 1 -3.0
七、十進(jìn)制,八進(jìn)制,十六進(jìn)制和二進(jìn)制
python中默認(rèn)字面值是10進(jìn)制,也可以使用下面的方式來產(chǎn)生其它進(jìn)制的字面值
>>> 0o12 # 8進(jìn)制 10 >>> 0xA # 16進(jìn)制 10 >>> 0b10 # 2進(jìn)制 2
它們都是以0開頭,8進(jìn)制跟字母o(大小寫都可以),16進(jìn)制跟字母x,2進(jìn)制跟字母b;之后跟上數(shù)值部分即可。當(dāng)然了,python也提供了相應(yīng)的函數(shù)來完成進(jìn)制直接的相互轉(zhuǎn)換。
>>> a = 3
>>> oct(a)# 轉(zhuǎn)成8進(jìn)制字符串
'0o3'
>>> hex(a)# 轉(zhuǎn)成16進(jìn)制字符串
'0x3'
>>> bin(a)# 轉(zhuǎn)成2進(jìn)制字符串
'0b11'
>>> int('0b10',2) # 將2進(jìn)制轉(zhuǎn)為10進(jìn)制
2
>>> int('0xa',16) # 將16進(jìn)制 轉(zhuǎn)為10進(jìn)制
10
>>> int('0o12',8) # 將8進(jìn)制轉(zhuǎn)為10進(jìn)制
10
int()函數(shù)(其實(shí)不是函數(shù))用于將一個(gè)字符串或數(shù)字轉(zhuǎn)換為整型。該函數(shù)的用法如下:
int(x, base=10)
x是數(shù)值字符串,base是該數(shù)值字符串的進(jìn)制,base擁有一個(gè)默認(rèn)值10.
python中還有另外一個(gè)函數(shù)eval(),該函數(shù)將其中的字符串當(dāng)做python代碼來執(zhí)行,因此,它的效果如下:
>>> eval('0o12')
10
>>> eval('0xa')
10
>>> eval('0b10')
2
該函數(shù)運(yùn)行的比較慢,因?yàn)樗麜?huì)將字符串作為程序的一個(gè)片段編譯運(yùn)行,所以該函數(shù)使用的時(shí)候?qū)嶋H上存在著比較大的安全風(fēng)險(xiǎn)。
八、位操作
python也支持C語言的位操作,但是在大多數(shù)時(shí)候,我們是用不到的。下表是位操作運(yùn)算符。
| 位運(yùn)算符 | 功能 |
| << | 按位左移 |
| >> | 按位右移 |
| | | 按位或 |
| & | 按位與 |
| ^ | 按位異或 |
| ~ | 按位取反 |
其中值得一提的是,按位左移多少位就相當(dāng)于給原數(shù)字乘上2的N次方,同理按位右移多少位就相當(dāng)于給原數(shù)字除以2的N次方。在python中幾乎是不會(huì)用到位運(yùn)算的。
九、集合
python中的集合也是數(shù)值類型,集合提供了樸素集合論中集合的基本功能。滿足確定性,互異性,無序性。需要特別注意的是,集合只包含不可變對(duì)象(可哈希的)類型,列表和字典是不能嵌入其中的,元組是可以的。但是集合本身是可變對(duì)象。關(guān)于集合的運(yùn)算可以閱讀集合論相關(guān)知識(shí)。
下面的例子展示集合中的元素只能是不可變對(duì)象,但是集合本身是可變對(duì)象。
>>> a.add(1)
>>> a
{1}
>>> a.add("123")
>>> a
{'123', 1}
>>> b = 1,2
>>> a.add(b)
>>> a
{'123', 1, (1, 2)}
集合中添加數(shù)字,字符串,元組等不可變對(duì)象是沒有問題的。下面看一下添加可變對(duì)象會(huì)發(fā)生什么。
>>> c = [1,2,3]
>>> a.add(c)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> d = {'1':1,'2':2}
>>> a.add(d)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
>>> e = set()
>>> a.add(e)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'set'
可以看到,無論是list,dict,set哪一個(gè),都會(huì)提示類型錯(cuò)誤,不可哈希類型。
十、布爾類型
python提供了顯示的布爾類型,True和False是預(yù)置的兩個(gè)布爾值。實(shí)際上,True和False是bool的兩個(gè)實(shí)例,而bool只是內(nèi)置類型int的子類。True和False的行為和1,0一致。bool為True和False重新定義了str和repr的字符串格式,所有打印出來就會(huì)顯示True和False,而不是1,0.
有意思的是python制定了1,0兩種情況下的顯示,沒有定義其余值的顯示。所以顯示的時(shí)候會(huì)發(fā)生下面的情況。
>>> True + 1 2
十一、其他數(shù)值類型
小數(shù)和分?jǐn)?shù)類型都需要導(dǎo)入模塊來創(chuàng)建,在這里不做過多的介紹。它們相比于浮點(diǎn)數(shù)而言,是精確的。尤其是當(dāng)你需要高精度計(jì)算的時(shí)候,這就十分有必要了,通常大多數(shù)場合下,我們都不怎么需要它們。
>>> from decimal import Decimal
>>> a = Decimal('0.1')
>>> a
Decimal('0.1')
>>> from fractions import Fraction
>>> b = Fraction(1,3) # 1是分子,3是分母
>>> b
Fraction(1, 3)
到此這篇關(guān)于Python基礎(chǔ)之?dāng)?shù)值類型詳解的文章就介紹到這了,更多相關(guān)Python數(shù)值類型內(nèi)容請(qǐng)搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。
關(guān)注官方微信