Python内建对象类型

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

3.1. Number数值型

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

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

    [Note] 
    为方便起见,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存储输出字符的数量放进参数列表的下一个变量中
[Note] 

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

[Note] 

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

[Note] 

可指定最小的字段宽度,如:"%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'
[Note] 
转换非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()求元组长度。

    [Note] 
    元组的索引用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可用来删除变量,但不能删除对象。

    [Note] 
    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类型以字节为单位的最小尺寸
cchar1
b(B)byte(unsigned byte)1
h(H)short(unsigned short)2
i(I)int(unsigned int)2
l(L)long(unsigned long)4
ffloat4
ddouble8

数组创建方法如下:

>>> 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])
    
    [Note] 
    如添加的列表类型与数组类型不同,则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等。访问成员的方法也可列表一样,可用下标和分片。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值