Python内建对象类型

时间:2021-03-07 11:00:18

在Python中,所有数据都是对象,数据有各种类型,如数值型、列表型、字符串型等。除系统内建的数据类型外,程序员也可以创建自已的数据类型。以下主要介绍Python内建的数据类型。

3.1. Number数值型

在python中,数值有四种类型,分别是整型、长整形、浮点型和复数。

  • 整型---从-2147483648至2147483647,有符号位32位长,可表达的最大数为2^31-1。如:number=123,number1=-123。在数字前加0x或0X 前缀表示十六进制数,在数字前加前缀0表示八进制数,与C/C++ and perl一样。

    Python内建对象类型  
    为方便起见,sys模块包含一个maxint成员,该成员保留了整形变量的最大正数值。
    >>> import sys
    >>> print sys.maxint
    2147483647
  • 长整型---python支持任意长度的长整型,长整型的最大值和最小值由可用的内存确定。长整型数在数字常量尾加L or l,一般都是用L,因为小写的l太容易与数字1混淆了。如:long=1232132131231232132132131L。

  • 浮点数---python支持普通十进制和科学计数法表示的浮点数。如:number=123.456,nubmer1=123.2E10。浮点数在python中的存储格式与C中的双精度数相同。

  • 复数---复数的实部和虚部用加号分开,虚部使用后缀j表示,如:number=1.2+2j

3.2. String字符串型

  • 字符串在python被看成是单个字符的序列,具有序列对象的特殊功能,字符串是固定的,不可变的。如:string="hello world"。

  • 可在字符串中使用单引号和双引号。如:string="I'm a boy"。

  • 字符串内部的一个反斜杠“\”可允许把字符串放于多行:如:

    >>> "test \
    ... python"
    'test python'
  • 使用三个单引号或双引号可使字符串跨行显示。如:

    helptext="""this a help test.if you have any quesions.
    please call me anytime.I will help you.I
    like python.I hope so as you."""
  • 使用“+”号可连接字符串。如:string = "hello" + "world",注意,不能将字符串与其它对象进行连接。如string = "ok" + 5。其实不用“+”号,直接用空格也可连接两个字符串。如:string="hello" "world"。

  • 可用“*”号重复字符串,如:'hello'*5会生成'hellohellohellohellohello'。

  • 可用索引访问字符串中的字符。如:string="hello world",print string[1]将显示字符e。

  • 字符串可用in或not in运算符来测试字符是不属于一个字符串的成员。

  • 可对字符串分片,如string="hello world",print string[6:]将显示world。分片的格式为:

                 string[start:end]

    分片和索引的规则如下:

    • 返回的字符串包含从start起始到end但不包括end结束的所有字符。

    • 若指定了start但未指定end,则一直向后分片,直至字符串结束。

    • 若指定了end但未指定start,则从0开始分片直至end,但不包括end指定的字符。

    • 若start和end为负数,则索引从字符串尾部开始算起,最后一个字符为-1。

python提供了一个string模块来进行字符串处理。

3.2.1. 字符串的格式化

象C 中的sprintf函数一样,可以用“%”来格式化字符串。

Table 3.1. 字符串格式化代码

格式 描述
%% 百分号标记
%c 字符及其ASCII码
%s 字符串
%d 有符号整数(十进制)
%u 无符号整数(十进制)
%o 无符号整数(八进制)
%x 无符号整数(十六进制)
%X 无符号整数(十六进制大写字符)
%e 浮点数字(科学计数法)
%E 浮点数字(科学计数法,用E代替e)
%f 浮点数字(用小数点符号)
%g 浮点数字(根据值的大小采用%e或%f)
%G 浮点数字(类似于%g)
%p 指针(用十六进制打印值的内存地址)
%n 存储输出字符的数量放进参数列表的下一个变量中
Python内建对象类型  

%格式化符也可用于字典,可用%(name)引用字典中的元素进行格式化输出。

Python内建对象类型  

负号指时数字应该是左对齐的,“0”告诉Python用前导0填充数字,正号指时数字总是显示它的正负(+,-)符号,即使数字是正数也不例外。

Python内建对象类型  

可指定最小的字段宽度,如:"%5d" % 2。也可用句点符指定附加的精度,如:"%.3d" % 3。

3.2.2. 转义字符

在需要在字符中使用特殊字符时,python用反斜杠(\)转义字符。如下表:

Table 3.2. python支持的转义字符表

转义字符 描述
\(在行尾时) 续行符
\\ 反斜杠符号
\' 单引号
\" 双引号
\a 响铃
\b 退格(Backspace)
\e 转义
\000
\n 换行
\v 纵向制表符
\t 横向制表符
\r 回车
\f 换页
\oyy 八进制数yy代表的字符,例如:\o12代表换行
\xyy 十进制数yy代表的字符,例如:\x0a代表换行
\other 其它的字符以普通格式输出

3.2.3. Unicode字符串

在python2.0中才完全支持Unicode字符串,Unicode字符采用16位(0---65535)值表示,能进行多语言支持。要使用Unicode字符串,只要在字符串前加上“u”即可。如:

>>> a=u"test"
>>> print a
test

原始Unicode字符串用ur前缀,如:

>>> u'hello world\0020' 
u'hello world\x020'
>>> ur'hello world\0020'
u'hello world\\0020'

3.2.3.1. Unicode转换

只要和Unicode连接,就会产生Unicode字串。如:

>>> 'help'
'help'
>>> 'help,' + u'python'
u'help,python'

对于ASCII(7位)兼容的字串,可和内置的str()函数把Unicode字串转换成ASCII字串。如:

>>> str(u'hello world')
'hello world'
Python内建对象类型  
转换非ASCII兼容的字串会出错。编码和译码字符串时的错误引发UnicodeError异常。

可使用encode()函数转换Unicode字串格式:

u'unicode\xb1\xe0\xc2\xeb\xb2\xe2\xca\xd4'
>>> a.encode('utf-8') #转换成utf-8,显示结果会根据终端的字符集支持不同而不同,下面是在GB18030下的显示结果
'unicode\xc2\xb1\xc3\xa0\xc3\x82\xc3\xab\xc2\xb2\xc3\xa2\xc3\x8a\xc3\x94'

可使用unicode()函数把字符串转换成unicode格式,如:

>>> a=u'unicode测试'
>>> a
u'unicode\xb2\xe2\xca\xd4'
>>> a.encode('utf-8') #把unicode字串转换成utf-8
'unicode\xc2\xb2\xc3\xa2\xc3\x8a\xc3\x94'
>>> b=a.encode('utf-8') #给变量b赋值
>>> b
'unicode\xc2\xb2\xc3\xa2\xc3\x8a\xc3\x94'
>>>unicode(b,'utf-8') #用unicode()函数把utf-8格式字串转换回unicode格式。
u'unicode\xb2\xe2\xca\xd4' #和原始的这是a相同

ord()支持unicode,可以显示特定字符的unicode号码,如:

>>>ord('A')
65

使用unichr()函数可将unicode号码转换回unicode字符,如:

>>> unichr(65)
u'A'

3.2.4. 原始字符串

有时我们并不想让转义字符生效,我们只想显示字符串原来的意思,这就要用r和R来定义原始字符串。如:

print r'\t\r'

实际输出为“\t\r”。

3.3. List列表

  • 列表是序列对象,可包含任意的Python数据信息,如字符串、数字、列表、元组等。列表的数据是可变的,我们可通过对象方法对列表中的数据进行增加、修改、删除等操作。可以通过list(seq)函数把一个序列类型转换成一个列表。列表的几个例子:

    • list = [ "a", "b", "c" ],这是字符列表。

    • list = [ 1, 2, 3, 4 ],这是数字列表。

    • list = [ [1,2,3,4], ["a","b","c"] ],这是列表的列表。

    • list = [ (1,2,3,4), ("a","b","c") ],这是元组列表。

    • list((1,2))把一个元组转换成一个列表[1,2],list('test')可把字符串转换成['t','e','s','t']列表。

  • 访问列表可通过索引来引用,如:list[0]将引用列表的第一个值。list[0:1]返回第一和第二个元素。

  • 用range()和xrange()函数可自动生成列表,具体用法请参考“python参考篇”的内容。

  • 可通过列表综合来创建列表,该功能是在python2.0版本中新增加的。如果想对列表中的每个项进行运算并把结果存储在一个新列表中,可者想创建一个仅包含特定满足某种条件的项,采用该方法是很适合的。如:[x*x for x in range(1,10)]会得到一个X的平方的新列表;我们还可添加if条件控制输出,如:[x*x for x in range(1,10) if x%2==0];还可在列表中使用多个for语句,如:

    >>> [x+y for x in "123" for y in "abc"]
    ['1a', '1b', '1c', '2a', '2b', '2c', '3a', '3b', '3c']

    x,y值可取列表或元组等,以构成更复杂的结构。

  • “+”号可连接两个列表。

  • 访问列表的列表(嵌套列表)可用list[1][0],这将访问嵌套中的第二个列表的第一个元素。

  • 可用数字与列表相乘以复制内容,如:list*2会得到一个[1,2,3,4,1,2,3,4]的列表。注意,不能用列表与列表相乘。

  • 由于列表是可变的,我们可用赋值语句进行操作,如:list[0] = 2。

  • 列表对象方法可对列表进行操作,如列表内容的添加,删除,排序等。如list.sort()可对list列表进行排序。

    Table 3.3. 列表对象支持的方法

    方法 描述
    append(x) 在列表尾部追加单个对象x。使用多个参数会引起异常。
    count(x) 返回对象x在列表中出现的次数。
    extend(L) 将列表L中的表项添加到列表中。返回None。
    Index(x) 返回列表中匹配对象x的第一个列表项的索引。无匹配元素时产生异常。
    insert(i,x) 在索引为i的元素前插入对象x。如list.insert(0,x)在第一项前插入对象。返回None。
    pop(x) 删除列表中索引为x的表项,并返回该表项的值。若未指定索引,pop返回列表最后一项。
    remove(x) 删除列表中匹配对象x的第一个元素。匹配元素时产生异常。返回None。
    reverse() 颠倒列表元素的顺序。
    sort() 对列表排序,返回none。bisect模块可用于排序列表项的添加和删除。

3.4. Tuple元组

Tuple(元组)和List(列表)很相似,但元组是不可变的。不能对元组中的元素进行添加,修改和删除操作。如果需修改元组内容只有重建元组。元组用小括号来表示。如tuple=(1,2,3)。

  • tuple=(1,),这是单个元素的元组表示,需加额外的逗号。

  • tuple=1,2,3,4,这也可以是一个元组,在不使用圆括号而不会导致混淆时,Python允许不使用圆括号的元组。

  • 和列表一样,可对元组进行索引、分片、连接和重复。也可用len()求元组长度。

    Python内建对象类型  
    元组的索引用tuple[i]的形式,而不是tuple(i)。
  • 和列表类似,使用tuple(seq)可把其它序列类型转换成元组。

3.5. 序列对象

上面介绍的字符串、列表和元组的对象类型均属于称为序列的Python对象。它是一种可使用数字化索引进行访问其中元素的对象。

  • 可用算术运算符联接或重复序列。

  • 比较运算符(<,<=,>,>=,!=,==)也可用于序列。

  • 可通过下标(test[1]),切片(test[1:3])和解包来访问序列的某部份。解包示例如下:

    >>>s=1,2,3 
    >>>x,y,z=s
    >>>print x,y,z
    1,2,3
  • in运算符可判断当有对象是否序列对象成员,如:

    >>>list = [1,2,3]
    >>>1 in list
    1
    >>>4 in list
    0
  • 也可通过循环运算符对序列对象进行迭代操作。如:

    for day in days:
    print day

有关序列的处理函数请参考“python参考篇”相关内容,这里就不详细讲了。

3.6. Dictionary字典

字典是一个用大括号括起来的键值对,字典元素分为两部份,键(key)和值。字典是python中唯一内置映射数据类型。通过指定的键从字典访问值。如:

monthdays = { "Jan":31, "Feb":28, "Mar":31, "Apr":30, "May":31, "Jun":30, "Jul":31, "Aug":31, "Sep":30, "Oct":31, "Nov":30,"Dec":31 }
  • 字典可嵌套,可以在一个字典里包含另一个字典。如test={"test":{"mytest":10} }

  • 可用键访问字典,如monthdays["Jan"],可访问值31。如果没有找到指定的键,则解释器会引起异常。

  • 字典是可修改,如monthdays["Jan"]=30,可把Jan的值由31改为30。如monthdays["test"]=30可添加一个新键值对。

  • del monthdays["test"]可删除字典条目。

  • 字典不属序列对象,所以不能进行连接和相乘操作。字典是没有顺序的。

  • 字典提供keys和values方法,用来返回字典中定义的所有键和值。

  • 和列表一样,字典也提供了对象方法来对字典进行操作。

    Table 3.4. 字典方法

    方法 描述
    has_key(x) 如果字典中有键x,则返回真。
    keys() 返回字典中键的列表
    values() 返回字典中值的列表。
    items() 返回tuples的列表。每个tuple由字典的键和相应值组成。
    clear() 删除字典的所有条目。
    copy() 返回字典高层结构的一个拷贝,但不复制嵌入结构,而只复制对那些结构的引用。
    update(x) 用字典x中的键值对更新字典内容。
    get(x[,y]) 返回键x,若未找到该键返回none,若提供y,则未找到x时返回y。

3.7. File文件

可用内置的open()函数对文件进行操作。如:

input = open("test.txt")
for line in input.readlines():
print line
input.close()

3.8. 理解引用

  • Python把一块数据存储在对象中,变量是对象的唯一引用;它们是计算机内存中特殊地点的名字。所有对象都具有唯一的身份号、类型和值。对象的类型不会改变,对于可变类型而言,它的值是可变的。id(obj)函数可用于检索对象的身份,也就是内存中的对象的地址。

  • 每个对象都包含引用计数器,它记录当前有多少个变量正在引用该对象。当给对象指定一个变量或使对象成为列表或其它包容器的成员时,引用计数就增加;当从包容器中撤消、重新分配或删除对象时,引用计数减少。当引用计数达到0值时(即没有任何变量引用这个对象),python的回收机制会自动回收它使用的内存。注意,del可用来删除变量,但不能删除对象。

    Python内建对象类型  
    sys.gettrefcount(obj)函数可返回给定对象的引用计数。

3.9. copy and deepcopy

通过给列表分配一个变量能创建对列表的引用,如果要创建列表的副本就要理解浅副本和深副本的概念。

  • 列表或其他包容器对象的浅副本(Shallow)能够生成对象本身的副本,但也会创建对由列表包含的对象的引用。可用分片(object[:])和copy模块的copy(obj)函数创建。

  • 列表或其他对象包容器对象的深副本能够生成对象本身的副本,并递归地生成所有子对象的副本。可用copy模块的deepcopy(obj)函数创建。

比较两种副本,一般情况下表现一样,但当列表内包含另一个列表的情况下,父列表的浅副本将包含对子列表引用,而不是独立副本。其结果是,当更改内部列表时,从父列表的两个副本中都可见,如:

>>> a=[1,2,3,[4,5]]
>>> b=a[:]
>>> b
[1, 2, 3, [4, 5]]
>>> a[3].remove(4)
>>> a
[1, 2, 3, [5]]
>>> b
[1, 2, 3, [5]]

如果是深副本,就不会出现这种情况。如:

>>> a=[1,2,3,[4,5]]
>>> b=copy.deepcopy(a)
>>> b
[1, 2, 3, [4, 5]]
>>> a[3].remove(4)
>>> a
[1, 2, 3, [5]]
>>> b
[1, 2, 3, [4, 5]]

3.10. 标识数据类型

可通过type(obj)函数标识数据类型,如:

>>> type(a)
<type 'list'>
>>> type(copy)
<type 'module'>
>>> type(1)
<type 'int'>

types模块包含Python的内置数据类型的类型对象。如:

>>> import types
>>> types.ListType
<type 'list'>
>>> types.IntType
<type 'int'>

3.11. 数组对象

数组对象与列表类似,但数组只包含某些类型的简单数据。所以当数据较简单,且要求性能好的情况下,使用数组是一个好的选择。

Table 3.5. 数组类型代码

代码 等价的C类型 以字节为单位的最小尺寸
c char 1
b(B) byte(unsigned byte) 1
h(H) short(unsigned short) 2
i(I) int(unsigned int) 2
l(L) long(unsigned long) 4
f float 4
d double 8

数组创建方法如下:

>>> import array
>>> z=array.array("b")
>>> z.append(1)
>>> z
array('b', [1])

数组的itemsize和typecode成员可分别检索数组项的大小和数组对象的类型代码,如:

>>> z.itemsize
1
>>> z.typecode
'b'

3.1. 数组类型与其它数据类型的转换

  • tolist()方法可把数组转换为列表,如:

    >>> z.tolist()
    [1, 2, 3]

    fromlist(list)方法可把列表项附加到数组的末尾,如:

    >>> z.fromlist([10,11])
    >>> z
    array('b', [1, 2, 3, 10, 11])
    Python内建对象类型  
    如添加的列表类型与数组类型不同,则fromlist(list)不会把任何项添加到数组对象中。
  • tostring()方法,可以把数组转换为字节的序列,如:

    >>> z.tostring()
    '\x01\x02\x03\n\x0b'

    fromstring(list)方法刚好与tostring()相反,它获取一个字节串,并把它们转换为数组的值。如:

    >>> z.fromstring("\x0b")
    >>> z
    array('b', [1, 2, 3, 10, 11, 11])
  • tofile(file)方法可把数组转换为字节的序列,并把它们写入文件,如:

    >>> f=open("aa","wb")
    >>> z.tofile(f)
    >>> f.close()

    fromfile(file,count)方法用于从文件对象中读取特定数目的项,并把它们附加到数组中,如:

    >>> z.fromfile(open("aa","rb"),2)
    >>> z
    array('b', [1, 2, 3, 10, 11, 11, 1, 2])

    当取数项大于文件数据项时,formfile会产生EOFError异常。

  • 数组对象支持列表中的很多相同函数和方法:len,append等。访问成员的方法也可列表一样,可用下标和分片。