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

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

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

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)

上面的代碼輸出結果為:

圖2

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

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

圖3

2.2.2布爾型和布爾對象

布爾型其實是整型的子類型,布爾型數(shù)據只有兩個取值: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,))

結果如下:

圖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

運行結果如下:

圖5

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

#無_nozero_()

class C:pass

c=C()

print bool(c)

運行結果如下:

圖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

運行結果如下:

圖7

2.2.4復數(shù)

在Python中旅薄,有關復數(shù)的概念如下:

l虛數(shù)不能單獨存在,它們總是和一個值為0.0的實數(shù)部分一起來構成一個復數(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

運行結果如下:

圖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對象。

運行結果如下:

圖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)

布爾型轉換

chr(x)

ASCII碼->單字符串

complex(re, im)

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

divmod(x, y)

除法及取余

float(x)

浮點轉換函數(shù)

hex(x)

整型->十六進制字符串

int(x)

整型轉換

long(x)

長整型轉換

pow(x)

指數(shù)運算

oct(x)

整型->八進制字符串

round(x[, n])

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

unichr(x)

ASCII碼->Unicode單字符串

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

首先煤蹭,如果兩個操作數(shù)都是同一種數(shù)據類型,沒有必要進行類型轉換。僅當兩個操作數(shù)類型不一致時硝皂,Python才會去檢查一個操作數(shù)是否可以轉換為另一類型的操作數(shù)常挚。如果可以,轉換它并返回轉換結果稽物。

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

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

如果有一個操作數(shù)是復數(shù)斤葱,另一個操作數(shù)被轉換為復數(shù)慷垮。

否則,如果有一個操作數(shù)是浮點數(shù)揍堕,另一個操作數(shù)被轉換為浮點數(shù)料身。

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

否則芹血,兩者必然都是普通整數(shù),無須類型轉換楞慈。

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

轉換流程圖如下圖所示:

圖10

2.2.7轉換工廠

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

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

圖11

2.2.8進制轉換

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

圖12

2.2.9 ASII轉換

chr函數(shù)和ord函數(shù)分別用來將數(shù)字轉換為字符姥芥,和字符轉換為數(shù)字兔乞。

圖13

2.2.10小結

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

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末锚国,一起剝皮案震驚了整個濱河市腕巡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌血筑,老刑警劉巖绘沉,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異豺总,居然都是意外死亡车伞,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門喻喳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來另玖,“玉大人,你說我怎么就攤上這事表伦∏ィ” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵蹦哼,是天一觀的道長渠退。 經常有香客問我沦零,道長闻坚,這世上最難降的妖魔是什么棚辽? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮局劲,結果婚禮上勺拣,老公的妹妹穿的比我還像新娘。我一直安慰自己容握,他們只是感情好宣脉,可當我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著剔氏,像睡著了一般塑猖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谈跛,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天羊苟,我揣著相機與錄音,去河邊找鬼感憾。 笑死蜡励,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播凉倚,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼兼都,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了稽寒?” 一聲冷哼從身側響起扮碧,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎杏糙,沒想到半個月后慎王,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡宏侍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年赖淤,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谅河。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡咱旱,死狀恐怖,靈堂內的尸體忽然破棺而出旧蛾,到底是詐尸還是另有隱情莽龟,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布锨天,位于F島的核電站,受9級特大地震影響剃毒,放射性物質發(fā)生泄漏病袄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一赘阀、第九天 我趴在偏房一處隱蔽的房頂上張望益缠。 院中可真熱鬧,春花似錦基公、人聲如沸幅慌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胰伍。三九已至,卻和暖如春酸休,著一層夾襖步出監(jiān)牢的瞬間骂租,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工斑司, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留渗饮,地道東北人。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像互站,于是被迫代替她去往敵國和親私蕾。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內容