2015 8 28 Python基礎 2 物件

2022-03-24 14:10:07 字數 3912 閱讀 2699

python用物件模型來儲存資料。構造任何型別的值都是乙個物件。

python物件都有是三個特性:身份,型別和值

身份是每個物件的唯一身份標識。任何物件都可以用內建函式id()來得到身份。如:

>>> s = 1

>>>id(s)

38249176

身份可以認為是該物件的位址。

型別是資料以何種方式儲存,可以進行怎樣的操作,遵循怎樣的規則。可以使用內建函式type()來檢視。

值就是物件的資料項。

上面三個特性在物件建立時被賦值,除值以外其他特性都是唯讀。物件的型別是可以改變的,但對於初學者不建議這麼做

python是用點標記法來訪問屬性的,屬性包括物件的名字等等,最常用的屬性是函式和方法,不過有一些也有資料屬性。含有資料屬性的物件包括(不限於):類、類例項、模組、複數和檔案

python的標準型別有:數字、整型、布林、長整型、浮點、複數、字串、列表、元組和字典。同時還有如下內建型別:型別(對,型別本身是一種型別)、null物件、檔案、集合、函式/方法、模組、類。

型別也是一種物件,因為物件的一系列固有行為和特性需要事先定義,我們用型別這種物件來儲存這些資訊。

用內建函式type()可以得到特定物件的型別資訊

>>> type(7)

'int

'>

這裡輸出了,其實並不是簡單告訴這是乙個整數這樣的字串,而是乙個型別物件,這個物件會輸出乙個字串來告訴你他是乙個物件。我們可以這樣測試它

>>> type(type(7))

如果這只是乙個字串,它會顯示如果是物件型別,它會顯示

結果是

>>> type(type(7))

'type

'>

none,null物件

這是乙個特殊的型別,它只有乙個值是none,類似於c的void,沒有任何內建方法,沒有有用的屬性,布林值總是false

同時還有一些用類實現的內部型別,這裡暫不贅述。

標準型別運算子

物件值的比較

比較運算子來判斷同型別的物件是否相等,返回true或false。運算子有== 、<= 、 >=。多個比較可以在同一行裡進行,這一點和c不同。比較的順序式從左到右

>>> 3 < 4 < 5true

>>> 3 < 5 < 4false

大多數語言中會寫成這種形式

>>> 3 < 4 and 4 < 5true

>>> 3 < 5 and 5 < 4false

同時,可以用如下的寫法,數學中一般不寫

>>> 3 < 5 > 4true

物件身份的比較

這是對值比較的補充,python也支援物件本身的比較。

用的是如下的語句

a is b

它是用於比較a、b兩個變數是否是指向同樣的物件的。和a == b不相同。

a is b等價於

id(a) == id(b)

有如下的**

>>> foo1 = 2.0

>>> foo2 = 1.0 + 1.0

>>> foo1 ==foo2

true

>>> foo1 is

foo2

false

>>> foo1 = 2.0

>>> foo2 = 2.0

>>> foo1 is

foo2

false

>>> foo2 =foo1

>>> foo1 is

foo2

true

>>> foo3 = 2

>>> foo4 = 1 + 1

>>> foo3 is

foo4

true

這裡可以看到foo1和foo2的值是相等的,但它們身份不相等。也就是說並不是來自同乙個引用。說明在內部儲存它們時,是各自建立了兩個物件然後引用的。

然後還能看到,當我同時給foo1和foo2賦值2.0後,它們並不相等。是創造了兩個物件,只有將foo1直接賦值給foo2才能使它們指向同乙個物件。

從此可以理解python內部的賦值方式,每乙個值進行新物件創造再引用給變數。

但是,如果是對整數,結果就不同。書裡說明:

整數物件和字串物件是不可變物件,所以python 會很高效的快取它們。這會造成我們認為python 應該建立新物件時,它卻沒有建立新物件的假象。

也就是說,整型和浮點型出現不同的緣故是因為python高效地快取了它們。不過這個快取是有範圍的,一定要小心使用。

標準型別內建函式

函式功能

cmp(obj1, obj2) 

比較 obj1 和 obj2, 根據比較結果返回整數 i:

i < 0 if obj1 < obj2

i > 0 if obj1 > obj2

i == 0 if obj1 == obj2

repr(obj) 或 `obj`

返回乙個物件的字串表示

str(obj)

返回物件適合可讀性好的字串表示

type(obj)

得到乙個物件的型別,並返回相應的type 物件

repr()返回的是乙個物件的「官方」字串表示, 也就是說絕大多數情況下可以通過求值運算(使用eval()內建函式)重新得到該物件,但str()則有所不同。str() 致力於生成乙個物件的可讀性好的字串表示,它的返回結果通常無法用於eval()求值, 但很適合用於 print 語句輸出。也就是說 repr() 輸出對 python 比較友好, 而str()的輸出對人比較友好。雖然如此,很多情況下這三者的輸出仍然都是完全一樣的。所謂的對python友好和對人友好將會在數值這一部分中提到。

型別工廠函式

python2.2統一了型別和類,所有的型別也都是類,原來的內建轉換函式如type(),int()都成了工廠函式,也就是說雖然看上去像函式,但實際上是類。呼叫時是生成了乙個型別的例項。

關於類部分,由於本人學習的c語言裡沒有過多涉及,等到學習到類部分再做筆記。

儲存模型裡,

有儲存乙個或多個值的標量/原子型別,如數值和字串。

有容器型別,如列表、元組、字典。

因為python沒有char型別,所以字串是乙個自我包含的文字型別,不是c中和陣列相同的情況。

更新模型,

物件建立後,可以更新值的是更新模型,不允許更改的是不可變物件。列表和字典是可變模型,數字、字串、元組是不可變模型。

這裡面存在理解偏差,數值和字串變數可換,但物件不可更新,每次變換是重新創造了物件。

也就是說每次變換後id()的值都會發生變化。而字典和列表,改變值本身,id()始終不變。

訪問模型,

這種分類是區分資料型別的首要型別。按照訪問我們儲存的資料的方式來分類。有三種訪問方式:直接訪問、順序、對映。

直接訪問 數字

順序訪問 字串、列表、元組

對映訪問 字典

直接訪問不贅述,順序訪問的是序列型別,就是元素從0開始索引順序訪問,一次可以訪問乙個或者多個元素。

對映型別類似序列型別的索引屬性,但不適用位址偏移量取值,元素是無序存放的,通過乙個唯一的key來訪問。是鍵-值集合

分類資料型別的原因一是,python提供的高階資料,我們要將原始的型別和功能強大的擴充套件型別區分開,所以需要了解分類。二是幫助我們搞清每種型別的特點。

通過不同方面來分類的原因是這些資料結構本身的關係是複雜的,需要我們多次分清晰脈絡,讓我們對型別了解更深。

python沒有的型別

char或byte。python沒有8位的整數。可以用長度為1的字串替代。

指標。python幫助程式設計師管理記憶體,所以不用訪問指標。通過id()得到的值很接近位址,但是不能操作,所以指標也就沒有用。

沒有短整長整的區別,讓程式設計師更專注於該幹的事。

也沒有單雙精度的浮點型別。讓事情更簡單。

Python基礎 Python語法基礎

關鍵字是python語言的關鍵組成部分,不可隨便作為其他物件的識別符號 andas assert break class continue defdel elif else except exec finally forfrom global ifimport inis lambda notor p...

Python程式設計基礎之Python基礎

1.只能是乙個詞 2.包含字母,數字和下劃線 3.不能以數字開頭 this program syas hello and asks for your name print hello world1 print what is your name?ask for their name myname i...

Python基礎 介紹python基礎語法

型別可以混合,不必是單一的資料型別 操作和字串一樣,號和 號與字串操作也相同 成員運算子 in 在 not in 不在 用來判斷乙個元素是否在一組元素中,返回bool型別。身份運算子 is 是 is not 不是 位運算子 按位與 按位或 按位異或 按位取反 左移 右移 遍歷序列 list a 1,...