Python 黑帽編程 2.2 數值類型

數值類型,說白了就是處理各類各樣的數字,Python中的數值類型包括整型、長整型、布爾、雙精度浮點、十進制浮點和複數,這些類型在不少方面與傳統的C類型有很大的區別。javascript

Python中的數值類型都是不可變類型,意味着建立、修改數字的值,都會產生新的對象,固然這是幕後的操做,編程過程當中大可沒必要理會。java

2.2.1 標準整型和長整型

標準整型等價於C中的有符號長整型(long),與系統的最大整型一致(如32位機器上的整型是32位,64位機器上的整型是64位),能夠表示的整數範圍在[-sys.maxint-1, sys.maxint]之間。整型字面值的表示方法有3種:十進制(經常使用)、八進制(以數字「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安全

長整型是整型的超集,能夠表示無限大的整數(實際上只受限於機器的虛擬內存大小)。長整型字面值的後面帶有字母「L」或「l」(推薦使用大寫的「L」)。微信

長整型和標準整型,目前已經基本統一,當數學運算遇到整型異常的狀況,在Python2.2之後的版本,會自動轉換爲長整型。例如:網絡

圖3函數

2.2.2 布爾型和布爾對象

布爾型實際上是整型的子類型,布爾型數據只有兩個取值:True和False,分別對應整型的1和0。測試

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

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

None

False(布爾型)

0(整型0)

0L(長整型0)

0.0(浮點型0)

0.0+0.0j(複數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數

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裏的浮點型數字都是雙精度,相似C語言的double類型。能夠用十進制或者科學計數法表示。下面咱們看一些典型的浮點型數字。

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

print 0.0

print -777.

print -5.555567119

print 96e3 * 1.0

print -1.609E-19複製代碼

運行結果以下:


圖7

2.2.4 複數

在Python中,有關複數的概念以下:

. 虛數不能單獨存在,它們老是和一個值爲0.0的實數部分一塊兒來構成一個複數。

. 複數由實數部分和虛數部分組成。

. 表示虛數的語法:real+imagj.

. 實數部分和虛數部分都是浮點型。

. 虛數部分必須有後綴j或J。

下面是幾個複數的例子:

print 64.375+1j

print 1.23e-045+6.7e+089j複製代碼

運行結果以下:

圖8

2.2.5 十進制浮點型
十進制浮點一般稱爲decimal類型,主要應用於金融計算。雙精度浮點型使用的是底和指數的表示方法,在小數表示上精度有限,會致使計算不許確,decimal採用十進制表示方法,看上去能夠表示任意精度。

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

from decimal import *



dec=Decimal('.1')

print dec

print Decimal(.1)

print dec +Decimal(.1)複製代碼

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

運行結果以下:


圖9

2.2.6 操做符

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

在Python中同時支持不一樣數值類型的數字進行混合運算,數字類型不一致怎麼作運算?這個時候就涉及到強制類型轉換問題。這種操做不是隨意進行的,它遵循如下基本規則:

首先,若是兩個操做數都是同一種數據類型,沒有必要進行類型轉換。僅當兩個操做數類型不一致時, Python纔會去檢查一個操做數是否能夠轉換爲另外一類型的操做數。若是能夠,轉換它並返回轉換結果。

因爲某些轉換是不可能的,好比果將一個複數轉換爲非複數類型,將一個浮點數轉換爲整數等等,所以轉換過程必須遵照幾個規則。要將一個整數轉換爲浮點數,只要在整數後面加個.0就能夠了。要將一個非複數轉換爲複數,則只須要要加上一個「0j」的虛數部分。

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

若是有一個操做數是複數,另外一個操做數被轉換爲複數。

不然,若是有一個操做數是浮點數,另外一個操做數被轉換爲浮點數。

不然, 若是有一個操做數是長整數,則另外一個操做數被轉換爲長整數;

不然,二者必然都是普通整數,無須類型轉換。

數字類型之間的轉換是自動進行的,程序員無須本身編碼處理類型轉換。Python 提供了 coerce() 內建函數來幫助你實現這種轉換。

轉換流程圖以下圖所示:


圖10

2.2.7 轉換工廠

函數 int(), long(), float() 和 complex() 用來將其它數值類型轉換爲相應的數值類型。從Python2.3開始,Python 的標準數據類型添加了一個新成員:布爾(Boolean)類型。今後 true 和 false 如今有了常量值即 True 和 False(再也不是1和0)。

下面是使用工廠函數的簡單例子。


圖11

2.2.8 進制轉換

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


圖12

2.2.9 ASII 轉換

chr函數和ord函數分別用來將數字轉換爲字符,和字符轉換爲數字。


圖13

2.2.10 小結

本節對Python數值類型作個比較全面的講解,網絡編程過程當中會有大量的數值運算。

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

第2.3節《字符串、列表和元組》已經在微信訂閱號搶先發布,心急的同窗進入訂閱號(二維碼在下方),從菜單「網絡安全」—>」Python黑帽編程」進入便可。

本節視頻教程獲取方法,請掃描二維碼,在菜單「網絡安全」——>」Python黑帽編程」中找到對應的本文2.2.10節,有詳細方法。

因爲教程仍在創做過程當中,在整套教程完結前,感興趣的同窗請關注個人微信訂閱號(xuanhun521,下方二維碼),我會第一時間在訂閱號推送圖文教程和視頻教程。問題討論請加qq羣:Hacking (1羣):303242737 Hacking (2羣):147098303。

關注以後,回覆請回復「Python」,獲取更多內容。
相關文章
相關標籤/搜索