數(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。