百度T7架構師透析Python對象你需要知道這些

1. Python對象

Python使用對象模型來存儲數據。構造任何類型的值都是一個對象。


所有的Python對象都擁有三個特性:身份,類型和值。

身份:

每一個對象都有一個唯一的身份標識自己,任何對象的身份可以使用內建函數 id() 來得到。這個值可以被認爲是該對象的內存地址。您極少會用到這個值,也不用關心它究竟是什麼。

類型:

對象的類型決定了該對象可以保存什麼類型的值,可以進行什麼樣的操作,以及遵循什麼樣的規則。你可以用內建函數 type() 來查看Python對象的類型。因爲在Python中類型也是對象,所以 type() 返回的是對象而不是簡單的字符串。

值:

對象表示的數據項

上面三個特性在對象創建的時候就被賦值,除了值之外,其他兩個特性都是隻讀的。

如果對象支持更新操作,那麼它的值就可以改變,否則也是隻讀的。對象的值是否可更改被稱爲對象的可改變性(mutability),只要一個還沒有被銷燬,這些特性就一直存在。

Python有一系列的基本(內建)數據類型,絕大多數應用程序通常使用標準類型,對特定的數據存儲則通過創建和實例化類來實現。

1.1 對象屬性

某些Python對象有屬性、值或相關聯的可執行代碼,比如方法。Python用點( . )標記法來訪問屬性。屬性包括相應對象的名字等等。最常用的屬性是函數和方法,不過有一些Python類型也有數據屬性。含有數據屬性的對象包括(但不僅限於):類、類實例、模塊、複數和文件。

 

2. 標準類型

數字(分爲幾個子類型,其中有三個是整型)

整型

長整型

浮點型

複數型

布爾型

字符串

列表

元祖

字典

3. 其他內建類型

類型

Null對象(None)

文件

集合/固定集合

函數/方法

模塊

3.1 類型對象和type類型對象

對象的一系列固有行爲和特性(比如支持哪些運算,具 有哪些方法)必須事先定義好。從這個角度看,雖然看上去把類型本身也當成對象有點特別,但類型正是保存這些信息的最佳位置。描述一種 類型所需要的信息不可能用一個字符串來搞定,所以類型不能是一個簡單的字符串,這些信息 不能也不應該和數據保存在一起, 所以我們將類型定義成對象。


>>> type(12)

<type 'int'>

>>> type(type(12))

<type 'type'>

沒錯,所有類型對象的類型都是 type。

3.2 None,Python的Null對象

Python有一個特殊的類型,被稱作Null對象或者NoneType,它只有一個值,那就是None。他不支持任何運算也沒有任何內建方法。

None沒有什麼有用的屬性,它的布爾值總是False。

布爾值

所有的標準對象均可用於布爾測試,同類型的對象之間可以比較大小。每個對象天生具有布爾 True 或 False 值。空對象、值爲零的任何數字或者Null 對象 None的布爾值都是False。

下列對象的布爾值是False。

None

False

所有值爲零的數

空字符串

空列表

空元組

空字典


4. 內部類型 

代碼

跟蹤記錄

切片

省略

Xrange

一般的程序員通常不會直接和這些對象打交道。

4.1 代碼對象

代碼對象是編譯過的Python源代碼片段,它是可執行對象。通過調用內建函數compile() 可以得到代碼對象。代碼對象可以被exec命令或eval() 內建函數來執行。

代碼對象本身不包含任何執行環境信息,它是用戶自定義函數的核心,在被執行時動態獲得上下文。一個函數除了有代碼對象屬性以外,還有一些其他函數必須的屬性,包括函數名,文檔字符串,默認參數,及全局命名空間等等。

4.2 幀對象

幀對象表示Python的執行棧幀。幀對象包含Python解釋器在運行時所需要知道的所有信息。它的屬性包括指向上一幀的鏈接,正在被執行的代碼對象,本地及全局名字空間字典以及當前指令等。每次函數調用產生一個新的幀,每一個幀對象都會相應創建一個C棧幀。用到幀對象的一個地方是跟蹤記錄對象。

4.3 跟蹤記錄對象

當你的代碼出錯時,Python就會引發一個異常。如果異常未被捕獲和處理,解釋器就會退出腳本運行,並顯示診斷信息。當異常發生時,一個包含針對異常的棧跟蹤信息的跟蹤記錄對象被創建。如果一個異常有自己的處理程序,處理程序就可以訪問這個跟蹤記錄對象。

4.4 切片對象

當使用Python擴展的切片語法時,就會創建切片對象。擴展的切片語法允許對不同的索引切片操作,切片對象也可以由內建函數slice() 來生成。步進切片允許利用第三個切片元素進行步進切片,它的語法是sequence[起始索引 :結束索引:步進值]。

4.5 省略對象

省略對象用於擴展切片語法中,起記號作用。 這個對象在切片語法中表示省略號。類似Null 對象 None, 省略對象有一個唯一的名字 Ellipsis, 它的布爾值始終爲 True。

4.6 XRange 對象

         調用內建函數 xrange() 會生成一個 Xrange 對象,xrange()是內建函數 range()的兄弟版本, 用於需要節省內存使用或 range()無法完成的超大數據集場合。


5. 標準類型運算符

5.1 對象值的比較

比較運算符用來判斷同類型對象是否相等,所有的內建類型均支持比較運算,比較運算返 回布爾值 True 或 False。

<

>

<=

>=

==

!=

5.2 對象身份比較

作爲對值比較的補充,Python 也支持對象本身的比較。對象可以被賦值到另一個變量(通 過引用)。因爲每個變量都指向同一個(共享的)數據對象,只要任何一個引用發生改變,該對象的其它引用也會隨之改變。

a is b

這個表達式等價於下面的表達式 id(a) == id(b)

>>> a = [ 5, 'hat', -9.3]
>>> b = a
>>> a is b
True
>>> a is not b
False
>>>
>>> b = 2.5e-5
>>> b
2.5e-005
>>> a
[5, 'hat', -9.3]
>>> a is b
False
>>> a is not b
True

在上面的例子中,使用的是浮點數而不是整數。爲什麼這樣?整數對象和 字符串對象是不可變對象,所以Python會很高效的緩存它們。這會造成我們認爲Python應該創建新對象時,它卻沒有創建新對象的假象。看下面的例子:

>>> a = 1
>>> id(a)
8402824
>>> b = 1
>>> id(b)
8402824
>>>
>>> c = 1.0
>>> id(c)
8651220
>>> d = 1.0
>>> id(d)
8651204

在上面的例子中,a 和 b 指向了相同的整數對象,但是 c 和 d 並沒有指向相同的浮點數 對象。


Python僅緩存簡單整數,因爲它認爲在Python應用程序中這些小整數會經常被用到。目前Python 緩存的整數範圍是(-1,256),不過這個範圍是會改變的。


5.3 布爾類型

布爾邏輯運算符 and, or 和 not 都是 Python 關鍵字,not 運算符擁有最高優先級,只比所有比較運算符低一級。 and 和 or 運 算符則相應的再低一級。


>>> x, y = 3.1415926536, -1024
>>> x < 5.0
True
>>> not (x < 5.0) 
False
>>> (x < 5.0) or (y > 2.718281828) 
True
>>> (x < 5.0) and (y > 2.718281828) 
False
>>> not (x is y)
True
6. 標準類型內建函數
6.1 type()
type() 接受一個對象做爲參數,並返回它的類型。它的返回值是一個類型對象。
>>> type(4)     # int type
<type 'int'>
>>>
>>> type('Hello World!')
<type 'string'>
# string type
>>>
>>> type(type(4))       # type type
<type 'type'>

6.2 str() 和 repr() (及 `` 運算符)

內建函數 str() 和 repr() 或反引號運算符(``) 可以方便的以字符串的方式獲取對象的 內容、類型、數值屬性等信息。


>>> str(4.53-2j)
'(4.53-2j)'
>>>
>>> str(1)
'1'
>>>
>>> str(2e10)
'20000000000.0'
>>>
>>> str([0, 5, 9, 9])
'[0, 5, 9, 9]'
>>>
>>> repr([0, 5, 9, 9])
'[0, 5, 9, 9]'
>>>
>>> `[0, 5, 9, 9]`
'[0, 5, 9, 9]'

repr() 輸出對 Python 比較友好, 而 str()的輸出對人比較友好。雖然如此, 很多情況下這三者的輸出仍然都是完全一樣的。


6.3  type() 和 isinstance()

type()內建函數可以幫助你確認調用的就是你想要的函數或對象。除了內建函數 type(), 還有一個有用的內建函數叫 isinstance().利用它可以確認一 個對象的類型。


7. 類型工廠函數

原來的 所謂內建轉換函數象 int(), type(), list() 等等, 現在都成了工廠函數。 也就是說雖然他 們看上去有點象函數, 實質上他們是類。當你調用它們時, 實際上是生成了該類型的一個實 例, 就象工廠生產貨物一樣。

dict()

bool()

set() ,frozenset()

object()

classmethod()

staticmethod()

super()

property()

file()

8. 標準類型的分類

如果讓我們最囉嗦的描述標準類型,我們也許會稱它們是 Python 的“基本內建數據對象原 始類型”。

“基本”,是指這些類型都是Python提供的標準或核心類型。

“內建”,是由於這些類型是Python默認就提供的

“數據”,因爲他們用於一般數據存儲

“對象”,因爲對象是數據和功能的默認抽象

“原始”,因爲這些類型提供的是最底層的粒度數據存儲

“類型”,因爲他們就是數據類型

8.1 存儲模型                                                                        

以存儲模型標準的類型分類

分類  Python 類型 標量/原子類型 數值(所有的數值類型),字符串(全部是文字) 容器類型 列表、元組、字典

8.2 更新模型

以更新模型爲標準的類型分類

分類

Python 類型

可變類型

列表, 字典

不可變類型

數字、字符串、元組

>>> x = 'Python numbers and strings'
>>> print id(x)
16191392
>>> x = 'are immutable?!? What gives?'
>>> print id(x)
16191232
>>> i = 0
>>> print id(i)
7749552
>>> i = i + 1
>>> print id(i)

上面的例子中,事實上是一個新對象被創建,然後它取代了舊對象。

新創建的對象被關聯到原來的變量名, 舊對象被丟棄,垃圾回收器會在適當的時機回收這 些對象。你可以通過內建函數 id()來確認對象的身份在兩次賦值前後發生了變化。

>>> aList = ['ammonia', 83, 85, 'lady']
>>> aList
['ammonia', 83, 85, 'lady']
>>>
>>> aList[2]
85
>>>
>>> id(aList)
135443480
>>>
>>> aList[2] = aList[2] + 1
>>> aList[3] = 'stereo'
>>> aList
['ammonia', 83, 86, 'stereo']
>>>
>>> id(aList)
135443480
>>>
>>> aList.append('gaudy')
>>> aList.append(aList[2] + 1)
>>> aList
['ammonia', 83, 86, 'stereo', 'gaudy', 87]
>>>
>>> id(aList)
135443480

注意列表的值不論怎麼改變, 列表的 ID 始終保持不變。

8.3 訪問類型

以訪問模型爲標準的類型分類

分類

Python 類型

直接訪問

數字

順序訪問

字符串、列表、元組

映射訪問

字典


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章