Python对象
python对象具有三个特性:身份(id)、类型(type)、值。
三特性在对象创建时被赋值。只有值可以改变,其他只读。
类型本身也是对象。
python之内建函数type()
示例程序:
>>> type(2) # 2的类型为int
<type ‘int’>
>>> type(s) # s为一个类的对象
<type ‘instance’>
>>> type(type(5))
<type ‘type’> # type(5)的类型为type
<type ‘int’>是一个类型对象,<type ‘type’>是类型对象的类型
python之Null
python有一个特殊的类型,即 Null 对象或者 NoneType,它只有一个值 None.
None的布尔值总是False.
下列对象的布尔值为False.
None
False
所有的值为零的数:
0(整形)
0.0(浮点型)
0L(长整形)
0.0+0.0j(复数)
“”(空字符串)
[](空列表)
()(空元组)
{}(空字典)
python之切片对象
sequence[起始索引 : 结束索引 : 步进值]
示例程序:
>>> foostr = ‘12345’
>>> foostr[::-1]
‘54321’
>>> foostr[::1]
‘12345’
>>> foostr[::-2]
‘531’
>>> foostr[::2]
‘135’
>>>
python之对象比较
python提供了 is 和 is not 运算符来测试两个变量是否指向同一个对象。
示例程序:
>>> a = 1.3
>>> b = 1 + 0.3
>>> id(a)
12362032
>>> id(b)
12362000
>>> a is b
False
>>> a is not b
True
>>>
内建函数str和repr以及“运算符
内建函数str()和repr()或反引号操作符(“)可以方便地以字符串的方式获取对象的内容、类型、数值属性等信息。str()函数得到的字符串可读性好,而repr()函数得到的字符串通常可以用来重新获得该对象,通常情况下obj == eval(repr(obj)) 这个等式是成立的。这两个函数接受一个对象作为其参数,返回适当的字符串。在下面的例子里,我们会随机取一些Python对象来查看他们的字符串表示。
>>> 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]’
|
尽管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()的输出对用户比较友好。虽然如此,很多情况下这三者的输出仍然都是完全一样的。
核心笔记:为什么我们有了repr()还需要“?
在Python学习过程中,你偶尔会遇到某个操作符和某个函数是做同样一件事情。之所以如此是因为某些场合函数会比操作符更适合使用。举个例子,当处理类似函数这样的可执行对象或根据不同的数据项调用不同的函数处理时,函数就比操作符用起来方便。另一个例子就是双星号(**)乘方运算和pow()内建函数,x ** y 和 pow(x,y) 执行的都是x的y次方
type()和isinstance()
Python不支持方法或函数重载,因此你必须自己保证调用的就是你想要的函数或对象。type()返回任意Python对象的类型,而不局限于标准类型。让我们通过交互式解释器来看几个使用type()内建函数返回多种对象类型的例子。
>>> type(”) <type ‘str’> >>> >>> s = ‘xyz’ >>> type(s) <type ‘str’> >>> >>> type(100) <type ‘int’> >>> type(0+0j) <type ‘complex’> >>> type(0L) <type ‘long’> >>> type(0.0) <type ‘float’> >>> >>> type([]) <type ‘list’> >>> type(()) <type ‘tuple’> >>> type({}) <type ‘dict’> >>> type(type) <type ‘type’> >>> >>> class Foo: pass # new-style class … >>> foo = Foo() >>> class Bar(object): pass # new-style class … >>> bar = Bar() >>>
>>> type(Foo) <type ‘classobj’> >>> type(foo) <type ‘instance’> >>> type(Bar) <type ‘type’> >>> type(bar) <class ‘__main__.Bar’>
|
Python2.2统一了类型和类,如果你使用的是低于Python2.2的解释器,你可能看到不一样的输出结果。
>>> type(”) <type ‘string’> >>> type(0L) <type ‘long int’> >>> type({}) <type ‘dictionary’> >>> type(type) <type ‘builtin_function_or_method’> >>> >>> type(Foo) # assumes Foo created as in above <type ‘class’> >>> type(foo) # assumes foo instantiated also <type ‘instance’>
|
除了内建函数type(),还有一个有用的内建函数叫做 isinstance()。
Python类型操作符和内建函数总结
下表列出了所有操作符和内建函数,其中操作符顺序是按优先级从高到低排列的。同一种灰度的操作符拥有同样的优先级。注意在operator模块中有这些(和绝大多数Python)操作符相应的同功能的函数可供使用。
标准类型操作符和内建函数
操作符/函数
|
描 述
|
结 果a
|
字符串表示
|
“
|
对象的字符串表示
|
str
|
内建函数
|
cmp(obj1, obj2)
|
比较两个对象
|
int
|
repr(obj)
|
对象的字符串表示
|
str
|
str(obj)
|
对象的字符串表示
|
str
|
type(obj)
|
检测对象的类型
|
type
|
值比较
|
<
|
小于
|
bool
|
>
|
大于
|
bool
|
<=
|
小于或等于
|
bool
|
>=
|
大于或等于
|
bool
|
==
|
等于
|
bool
|
!=
|
不等于
|
bool
|
<>
|
不等于
|
bool
|
对象比较
|
is
|
是
|
bool
|
is not
|
不是
|
bool
|
布尔操作符
|
not
|
逻辑反
|
bool
|
and
|
逻辑与
|
bool
|
or
|
逻辑或
|
bool
|
基本内建数据对象原始类型
我们也许会称它们是Python的“基本内建数据对象原始类型”。
l “基本”是指这些类型都是Python提供的标准或核心类型。
l “内建”是由于这些类型是Python默认就提供的。
l “数据”是因为他们用于一般数据存储。
l “对象”是因为对象是数据和功能的默认抽象。
l “原始”是因为这些类型提供的是最底层的粒度数据存储。
l “类型”是因为他们就是数据类型。
不支持的类型
1.char或byte
Python没有 char 或 byte 类型来保存单一字符或8位整型。你可以使用长度为1的字符串表示字符或8位整型。
2.指针
Python替你管理内存,因此没有必要访问指针。在Python中你可以使用id()函数得到一个对象的身份号,这是最接近于指针的地址。因为你不能控制这个值,所以其实没有太大意义。其实在Python中,一切都是指针。
3.int vs short vs long
Python 的普通整型相当于标准整型类型,不需要类似C语言中的 int、short和long 这三种整型类型。事实上Python的整型实现等同于C语言的长整型。由于Python的整型与长整型密切融合,用户几乎不需要担心什么。你仅需要使用一种类型,就是Python的整型。即便数值超出整型的表达范围,比如两个很大的数相乘,Python会自动的返回一个长整型给你而不会报错。
4.float vs double
C语言有单精度和双精度两种浮点类型。Python 的浮点类型实际上是C语言的双精度浮点类型。Python认为同时支持两种浮点类型的好处与支持两种浮点类型带来的开销不成比例,所以Python 决定不支持单精度浮点型。对那些宁愿放弃更大的取值范围而需要更高精确度的用户来说,Python 还有一种十进制浮点型类型 Decimal,不过你必须导入decimal模块才可以使用它。浮点型总是不精确的。Decimals则拥有任意的精度。在处理金钱这类确定的值时,Decimal类型就很有用。在处理重量、长度或其他度量单位的场合,float足够用了。