在Python中,所有数据都是对象,数据有各种类型,如数值型、列表型、字符串型等。除系统内建的数据类型外,程序员也可以创建自已的数据类型。以下主要介绍Python内建的数据类型。
在python中,数值有四种类型,分别是整型、长整形、浮点型和复数。
-
整型---从-2147483648至2147483647,有符号位32位长,可表达的最大数为2^31-1。如:number=123,number1=-123。在数字前加0x或0X 前缀表示十六进制数,在数字前加前缀0表示八进制数,与C/C++ and perl一样。
为方便起见,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
字符串在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模块来进行字符串处理。
象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 | 存储输出字符的数量放进参数列表的下一个变量中 |
%格式化符也可用于字典,可用%(name)引用字典中的元素进行格式化输出。 |
负号指时数字应该是左对齐的,“0”告诉Python用前导0填充数字,正号指时数字总是显示它的正负(+,-)符号,即使数字是正数也不例外。 |
可指定最小的字段宽度,如:"%5d" % 2。也可用句点符指定附加的精度,如:"%.3d" % 3。 |
在需要在字符中使用特殊字符时,python用反斜杠(\)转义字符。如下表:
在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'
只要和Unicode连接,就会产生Unicode字串。如:
>>> 'help'
'help'
>>> 'help,' + u'python'
u'help,python'
对于ASCII(7位)兼容的字串,可和内置的str()函数把Unicode字串转换成ASCII字串。如:
>>> str(u'hello world')
'hello world'
转换非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'
-
列表是序列对象,可包含任意的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模块可用于排序列表项的添加和删除。
Tuple(元组)和List(列表)很相似,但元组是不可变的。不能对元组中的元素进行添加,修改和删除操作。如果需修改元组内容只有重建元组。元组用小括号来表示。如tuple=(1,2,3)。
tuple=(1,),这是单个元素的元组表示,需加额外的逗号。
tuple=1,2,3,4,这也可以是一个元组,在不使用圆括号而不会导致混淆时,Python允许不使用圆括号的元组。
-
和列表一样,可对元组进行索引、分片、连接和重复。也可用len()求元组长度。
元组的索引用tuple[i]的形式,而不是tuple(i)。 和列表类似,使用tuple(seq)可把其它序列类型转换成元组。
上面介绍的字符串、列表和元组的对象类型均属于称为序列的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参考篇”相关内容,这里就不详细讲了。
字典是一个用大括号括起来的键值对,字典元素分为两部份,键(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方法,用来返回字典中定义的所有键和值。
-
和列表一样,字典也提供了对象方法来对字典进行操作。
可用内置的open()函数对文件进行操作。如:
input = open("test.txt")
for line in input.readlines():
print line
input.close()
Python把一块数据存储在对象中,变量是对象的唯一引用;它们是计算机内存中特殊地点的名字。所有对象都具有唯一的身份号、类型和值。对象的类型不会改变,对于可变类型而言,它的值是可变的。id(obj)函数可用于检索对象的身份,也就是内存中的对象的地址。
-
每个对象都包含引用计数器,它记录当前有多少个变量正在引用该对象。当给对象指定一个变量或使对象成为列表或其它包容器的成员时,引用计数就增加;当从包容器中撤消、重新分配或删除对象时,引用计数减少。当引用计数达到0值时(即没有任何变量引用这个对象),python的回收机制会自动回收它使用的内存。注意,del可用来删除变量,但不能删除对象。
sys.gettrefcount(obj)函数可返回给定对象的引用计数。
通过给列表分配一个变量能创建对列表的引用,如果要创建列表的副本就要理解浅副本和深副本的概念。
列表或其他包容器对象的浅副本(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]]
可通过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'>
数组对象与列表类似,但数组只包含某些类型的简单数据。所以当数据较简单,且要求性能好的情况下,使用数组是一个好的选择。
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'
-
tolist()方法可把数组转换为列表,如:
>>> z.tolist()
[1, 2, 3]fromlist(list)方法可把列表项附加到数组的末尾,如:
>>> z.fromlist([10,11])
>>> z
array('b', [1, 2, 3, 10, 11])如添加的列表类型与数组类型不同,则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等。访问成员的方法也可列表一样,可用下标和分片。