所有的Python對像都擁有三個特性:身份,類型和值。
身份:
每一個對象都有一個唯一的身份標識自己,任何對象的身份可以使用內建函數id()來得到。這個值可以被認爲是該對象的內存地址。
類型:
對象的類型決定了該對象可以保存什麼類型的值,可以進行什麼樣的操作,可以用內建函數type()查看Python對象的類型。
值:
對象表示的數據項
標準類型
數字(分爲幾個子類型,其中有三個是整型)
整型
布爾型
長整型
浮點型
複數型
字符串
列表
元組
字典
其他內建類型
類型
Null對象(None)
文件
集合/固定集合
函數/方法
模塊
類
>>>type(type(42))
<type'type'>
下列對象的布爾值是False
None
False(布爾類型)
所有的值爲零的數:
0(整型)
(浮點型)
0L(長整型)
0.0+0.0j(複數)
""(空字符串)
[](空列表)
()(空元組)
{}(空字典)
>>>foostr = 'abcde'
>>>foostr[::-1]
'edcba'
>>>foostr[::-2]
'eca'
>>>foolist = [123, 'xba', 342.23, 'abc']
>>>foolist[::-1]
['abc',342.23, 'xba', 123]
調用內建函數xrange()會生成一個Xrange對象,xrange()是內建函數range()的兄弟版本,用於需要節省內存使用或range()無法完成的超大數據集場合。
例3:foo1 和foo2指向不同的對象
foo1= 4.3
foo2= 1.3 + 3.0
兩個不同的對象,儘管這兩個對象有同樣大小的數值。
Python提供了is和 isnot
運算符來測試兩個變量是否指向同一個對象。象下面這樣執行一個測試
ais b這個表達式等價於下面的表達式id(a)== id(b)
Python僅緩存簡單整數,因爲它認爲在Python應用程序中這些小整數會經常被用到。
str()和repr()(及``運算符)
內建函數str()和 repr()或反引號運算符(``)可以方便的以字符串的方式獲取對象的
內容、類型、數值屬性等信息。str()函數得到的字符串可讀性好,而repr()函數得到的字符
串通常可以用來重新獲得該對象,通常情況下obj== eval(repr(obj)) 這個等式是成立的。
這兩個函數接受一個對象做爲其參數,返回適當的字符串。
str(),repr()和``運算在特性和功能方面都非常相似,事實上repr()和 ``做的
是完全一樣的事情,它們返回的是一個對象的“官方”字符串表示,也就是說絕大多數情況下
可以通過求值運算(使用eval()內建函數)重新得到該對象,但str()則有所不同。str()致力
於生成一個對象的可讀性好的字符串表示,它的返回結果通常無法用於eval()求值,但很適
合用於print語句輸出。需要再次提醒一下的是,並不是所有repr()返回的字符串都能夠用
eval()內建函數得到原來的對象:
>>>eval(`type(type))`)
File"<stdin>", line 1
eval(`type(type))`)
^
SyntaxError:invalid syntax
repr()輸出對Python比較友好,而str()的輸出對人比較友好。很多情況下這三者的輸出仍然都是完全一樣的。
表達式:
iftype(num) == type(0)...
減少函數調用的次數
如果我們仔細研究一下我們的代碼,會看到我們調用了兩次type()。要知道每次調用函數
都會付出性能代價,如果我們能減少函數的調用次數,就會提高程序的性能。
利用在本章我們前面提到的types模塊,我們還有另一種比較對象類型的方法,那就是
將檢測得到的類型與一個已知類型進行比較。如果這樣,我們就可以直接使用type對象而不
用每次計算出這個對象來。那麼我們現在修改一下代碼,改爲只調用一次type()函數:
>>>import types
>>>if type(num) == types.IntType...
減少查詢次數
這是一個對前一個例子較小的改進,如果你的程序像我們的例子中做很多次比較的話,程序的性能就會有一些差異。爲了得到整數的對象類型,解釋器不得不首先查找types這個模塊的名字,然後在該模塊的字典中查找IntType。通過使用from-import,你可以減少一次查詢:
fromtypes import IntType
iftype(num) is IntType...
ifisinstance(num, int)...