所有的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)...