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