Python黑帽編程之 數(shù)值類型

數(shù)值類型,說白了就是處理各種各樣的數(shù)字,Python中的數(shù)值類型包括整型、長整型、布爾、雙精度浮點、十進制浮點和復數(shù),這些類型在很多方面與傳統(tǒng)的C類型有很大的區(qū)別。

Python中的數(shù)值類型都是不可變類型,意味著創(chuàng)建、修改數(shù)字的值,都會產(chǎn)生新的對象,當然這是幕后的操作,編程過程中大可不必理會。

2.2.1標準整型和長整型

標準整型等價于C中的有符號長整型(long),與系統(tǒng)的最大整型一致(如32位機器上的整型是32位,64位機器上的整型是64位),可以表示的整數(shù)范圍在[-sys.maxint-1, sys.maxint]之間。整型字面值的表示方法有3種:十進制(常用)、八進制(以數(shù)字“0”開頭)和十六進制(以“0x”或“0X”開頭)。

# -*- coding:utf-8 -*-

a = 0101

print 'a='+str(a)

b=64

print 'b='+str(b)

c=-237

print 'c='+str(c)

d=0x80

print 'd='+str(d)

e=-0x92

print 'e='+str(e)

上面的代碼輸出結(jié)果為:

圖2

長整型是整型的超集,可以表示無限大的整數(shù)(實際上只受限于機器的虛擬內(nèi)存大小)。長整型字面值的后面帶有字母“L”或“l(fā)”(推薦使用大寫的“L”)。

長整型和標準整型,目前已經(jīng)基本統(tǒng)一,當數(shù)學運算遇到整型異常的情況,在Python2.2以后的版本,會自動轉(zhuǎn)換為長整型。例如:

圖3

2.2.2布爾型和布爾對象

布爾型其實是整型的子類型,布爾型數(shù)據(jù)只有兩個取值:True和False,分別對應整型的1和0。

每一個Python對象都天生具有布爾值(True或False),進而可用于布爾測試(如用在if、while中)。

以下對象的布爾值都是False,除此之外是True:

None

False(布爾型)

0(整型0)

0L(長整型0)

0.0(浮點型0)

0.0+0.0j(復數(shù)0)

''(空字符串)

[](空列表)

()(空元組)

{}(空字典)

用戶自定義的類實例,該類定義了方法__nonzero__()或__len__(),并且這些方法返回0或False

下面我們通過幾段代理來加深對布爾類型的認識。

# -*- coding:utf-8 -*-

#基本測試

print bool(1)

print bool(True)

print bool('0')

print bool([])

pring bool((1,))

結(jié)果如下:

圖4

下面我們看看bool類型作為只有0和1取值的特殊整型的特性。

# -*- coding:utf-8 -*-

#使用bool數(shù)

foo = 42

bar = foo<42

print bar

print bar+10

print '%s' %bar

print '%d' %bar

運行結(jié)果如下:

圖5

再來驗證下沒有_nonzero_()方法的對象,默認是True。

#無_nozero_()

class C:pass

c=C()

print bool(c)

運行結(jié)果如下:

圖6

2.2.3雙精度浮點型

Python里的浮點型數(shù)字都是雙精度,類似C語言的double類型。可以用十進制或者科學計數(shù)法表示。下面我們看一些典型的浮點型數(shù)字。

# -*- coding:utf-8 -*-

print 0.0

print -777.

print -5.555567119

print 96e3 * 1.0

print -1.609E-19

運行結(jié)果如下:

圖7

2.2.4復數(shù)

在Python中,有關(guān)復數(shù)的概念如下:

l虛數(shù)不能單獨存在,它們總是和一個值為0.0的實數(shù)部分一起來構(gòu)成一個復數(shù)。

l復數(shù)由實數(shù)部分和虛數(shù)部分組成。

l表示虛數(shù)的語法:real+imagj.

l實數(shù)部分和虛數(shù)部分都是浮點型。

l虛數(shù)部分必須有后綴j或J。

下面是幾個復數(shù)的例子:

print 64.375+1j

print 1.23e-045+6.7e+089j

運行結(jié)果如下:

圖8

2.2.5十進制浮點型

十進制浮點通常稱為decimal類型,主要應用于金融計算。雙精度浮點型使用的是底和指數(shù)的表示方法,在小數(shù)表示上精度有限,會導致計算不準確,decimal采用十進制表示方法,看上去可以表示任意精度。

下面我們看一下十進制浮點的例子。

from decimal import *

dec=Decimal('.1')

print dec

print Decimal(.1)

print dec +Decimal(.1)

使用decimal類型,首先要引入decimal模塊,然后通過Decimal類來初始化一個Decimal對象。

運行結(jié)果如下:

圖9

2.2.6操作符

下表是主要的操作類型,供參考。

操作

說明

bool

int

long

float

complex

x ** y

指數(shù)運算

+x

符號不變

-x

符號取反

~x

按位取反

x * y

乘法

x / y

除法

x // y

地板除

x % y

取余

x + y

加法

x - y

減法

x << y

位左移

x >> y

位右移

x & y

按位與

x ^ y

按位異或

x | y

按位或

abs(x)

取絕對值

bin(x)

整型->二進制字符串

bool(x)

布爾型轉(zhuǎn)換

chr(x)

ASCII碼->單字符串

complex(re, im)

實部為re,虛部為im的復數(shù)

divmod(x, y)

除法及取余

float(x)

浮點轉(zhuǎn)換函數(shù)

hex(x)

整型->十六進制字符串

int(x)

整型轉(zhuǎn)換

long(x)

長整型轉(zhuǎn)換

pow(x)

指數(shù)運算

oct(x)

整型->八進制字符串

round(x[, n])

保留n位小數(shù)并四舍五入

unichr(x)

ASCII碼->Unicode單字符串

在Python中同時支持不同數(shù)值類型的數(shù)字進行混合運算,數(shù)字類型不一致怎么做運算?這個時候就涉及到強制類型轉(zhuǎn)換問題。這種操作不是隨意進行的,它遵循以下基本規(guī)則:

首先,如果兩個操作數(shù)都是同一種數(shù)據(jù)類型,沒有必要進行類型轉(zhuǎn)換。僅當兩個操作數(shù)類型不一致時,Python才會去檢查一個操作數(shù)是否可以轉(zhuǎn)換為另一類型的操作數(shù)。如果可以,轉(zhuǎn)換它并返回轉(zhuǎn)換結(jié)果。

由于某些轉(zhuǎn)換是不可能的,比如果將一個復數(shù)轉(zhuǎn)換為非復數(shù)類型,將一個浮點數(shù)轉(zhuǎn)換為整數(shù)等等,因此轉(zhuǎn)換過程必須遵守幾個規(guī)則。要將一個整數(shù)轉(zhuǎn)換為浮點數(shù),只要在整數(shù)后面加個.0就可以了。要將一個非復數(shù)轉(zhuǎn)換為復數(shù),則只需要要加上一個“0j”的虛數(shù)部分。

這些類型轉(zhuǎn)換的基本原則是:整數(shù)轉(zhuǎn)換為浮點數(shù),非復數(shù)轉(zhuǎn)換為復數(shù)。在Python語言參考中這樣描述coerce()方法:

如果有一個操作數(shù)是復數(shù),另一個操作數(shù)被轉(zhuǎn)換為復數(shù)。

否則,如果有一個操作數(shù)是浮點數(shù),另一個操作數(shù)被轉(zhuǎn)換為浮點數(shù)。

否則,如果有一個操作數(shù)是長整數(shù),則另一個操作數(shù)被轉(zhuǎn)換為長整數(shù);

否則,兩者必然都是普通整數(shù),無須類型轉(zhuǎn)換。

數(shù)字類型之間的轉(zhuǎn)換是自動進行的,程序員無須自己編碼處理類型轉(zhuǎn)換。Python提供了coerce()內(nèi)建函數(shù)來幫助你實現(xiàn)這種轉(zhuǎn)換。

轉(zhuǎn)換流程圖如下圖所示:

圖10

2.2.7轉(zhuǎn)換工廠

函數(shù)int(), long(), float()和complex()用來將其它數(shù)值類型轉(zhuǎn)換為相應的數(shù)值類型。從Python2.3開始,Python的標準數(shù)據(jù)類型添加了一個新成員:布爾(Boolean)類型。從此true和false現(xiàn)在有了常量值即True和False(不再是1和0)。

下面是使用工廠函數(shù)的簡單例子。

圖11

2.2.8進制轉(zhuǎn)換

目前我們已經(jīng)看到Python支持8進制、十進制和十六進制整型,同時還提供了oct()和hex()內(nèi)建函數(shù)來返回八進制和十六進制字符串。

圖12

2.2.9 ASII轉(zhuǎn)換

chr函數(shù)和ord函數(shù)分別用來將數(shù)字轉(zhuǎn)換為字符,和字符轉(zhuǎn)換為數(shù)字。

圖13

2.2.10小結(jié)

本節(jié)對Python數(shù)值類型做個比較全面的講解,網(wǎng)絡編程過程中會有大量的數(shù)值運算。

更高級的科學計算,推薦大家了解下兩個著名的第三方包,NumPy和SciPy。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,316評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,481評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,241評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,939評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,697評論 6 409
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,182評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,247評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,406評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,933評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,772評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,973評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,516評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,638評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,866評論 1 285
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,644評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,953評論 2 373

推薦閱讀更多精彩內(nèi)容