对象类型 | 常量示例/用法 |
Number(数字) | 3.14159, 1234, 999L 3+4j |
String(字符串) | 'spam', "guido's" |
List(列表) | [1,[2, 'Three'],4] |
Dictionary(字典) | {'food':'spam', 'taste':'yum'} |
Tuple(元组) | (1,'spam',4,'U') |
File(文件) | text=open('egges','r').read() |
常量 | 解释 |
1234, -24, 0 | 正常整数(C的长整型) |
999999999999999L | 长整数(无限大小) |
1.23, 3.14e-10, 4E210, 4.0e+210 | 浮点数(C的双整型) |
0177, 0x9ff | 八进制和十六进制常量 |
3+4j, 3.0+4.0j, 3J | 复数常量 |
操作 | 描述 |
x or y | 逻辑或(只有x为假,y才被计算) |
lambda args: expression | 匿名函数 |
x and y | 逻辑与(只有x为真的时候,y才被计算) |
not x | 逻辑反 |
<,<=,>,>=,==,<>,!=, | 比较操作 |
is, is not, | 身份测试 |
in, not in | 序列成员关系测试 |
x | y | 位或 |
x ^ y | 位异或 |
x & y | 位与 |
x‘<<’y y'<<'x | 把x向左或向右移动y位 |
x+y, x-y | 相加/合并,相减 |
x*y, x/y, x%y | 乘/重复,除,余数/格式 |
-x, +x, ~x | 一元取反,一致,位取补 |
x[i], x[i:j], x.y, x(...) | 索引,分片,限定,函数调用 |
(...), [...], {...}, '...' | 元组,列表,字典,转化为字符串 |
内置函数和内置模块用于数字处理:(模块是外部组件,但内置函数却包含在名字空间中)
>>> import math
>>> math.pi
3.14159265359
>>> abs(-42), 2**4, pow(2,4)
(42,16,16)
操作 | 解释 |
S1 = ' ' | 空字符串 |
S2 = "spam 's" | 双引号 |
block = " " " ..." " " | 三引号块 |
s1 + s2 | 合并 |
s2 * 3 | 重复 |
s2[i] | 索引 |
s2[i:j] | 分片 |
len(s2) | 长度 |
"a %s parror" % 'dead' | 字符串格式 |
for x in s2, | 迭代 |
'm' in s2 | 成员关系 |
string模块可到处大多数标准C库的字符串处理工具
regex和re模块为字符串田间了正则表达式匹配
空字符串可以写成中间为空的两个引号。
注意:字符串常量可以用单引号或双引号包围;两种方式都同样工作,但它们都允许一个引号字符出现在字符串内部而无需用反斜线转义。
三引号块(表第3行):当字符串被三个引号围起来时,它们可以跨过多行。
python将所有三引号文本收集到一个多行字符串中,该字符串带有嵌入的换行符。
>>> import string #标准的模块
>>> S = "spammify"
>>> string.upper(S) #转化为大写
>>> string.find(S, "mm") #返回索引的子串
>>> string.atoi("42"),'42' #转化字符串。
>>> # atoi把字符串转化为一个数字,并把反引号所引的任何对象都转化为字符串形式的 (42,'42')
>>> string.join(string.split(S, ”mm", "XX")
>>> # split把一个字符串截成一列被界定符和空格符围绕的子字符串。join把它们放在一起,两个中间有一个传递性的分界符或空格。以"XX"代 替"mm"像是一个迂回方法,但是这是一个任意替代全局子字符串的方法。 'spaXXify'
数字 | 支持+ 和* 的操作 |
序列 | 支持索引、分片、合并等操作 |
映射 | 支持键索引等操作 |
操作 | 解释 |
L1 = [] | 一个空的列表 |
L2 = [0,1,2,3] | 四项:索引为0到3 |
L3 = ['abc', ['def', 'ghi']] | 嵌套的子列表 |
L2[i], L3[i][j] | 索引 |
L2[i:j] | 分片 |
len(L2) | 求长度 |
L1 + L2 | 合并 |
L3 * 3 | 重复 |
for x in L2, | 迭代 |
3 in L2 | 成员关系 |
L2.append(4), | 方法:增长 |
L2.sort(), | 排序 |
L2.index(1), | 查找 |
L2.reverse() | 反转,等等 |
del L2[k] | 删除 |
L2[i:j] = [] | 缩小 |
L2[i] = 1, | 索引赋值 |
L2[i:j] = [4,5,6] | 分片赋值 |
range(4), xrange(0,4) | 生成整数的列表/元组 |
除了列表之外,字典可能是python中最有弹性的内置数据结构类型。列表是有序的对象集合,字典就是无序的集合;他们的主要区别就是字典中的项是通过键 来存取的,列表是通过偏移存取。字典的主要属性有:通过键而不是偏移量来存取,无序的任意对象集合,可变长度、异构、任意嵌套,属于可变映射类型,对象引用表(散列表,但在底层,字典像列表一样存储对引用)
操作 | 解释 |
d1 = {} | 空的字典 |
d2 = {'spam':2, 'eggs':3} | 两项的字典 |
d3 = {'food':{'ham':1,'egg':2}} | 嵌套 |
d2['eggs'],d3['food']['ham'] | 通过键索引 |
d2.has_key('eggs'), | 方法:成员关系测试, |
d2.keys(), | 键的列表 |
d2.values() | 值的列表,等等 |
len(d1) | 长度(所存储的项的数目) |
d2[key] = new, del d2[key] | 添加/改变,删除 |
和列表一样,向字典中已经存在的索引进行赋值会改变与它相关联的值。与列表不同的是,一旦你给一个新的字典键赋值,你就在字典中生成了一个新的项。在列表 中不用,因为python认为超出了列表末尾的偏移就是越界的。要扩充一个列表,你要用append方法或者分片赋值。
>>> table = { ' Python': 'Guido van Rossum', 'Perl': 'Larry Wall', 'Tcl': 'John Ousterhout' }
>>> for lang in table.keys(): print lang, '\t', table[lang]
有些python扩展程序还提供了表面与实际工作都和字典一样的接口。
python的dbm按键存取文件接口看上去特别像一个已经打开的字典:可用键索引来存储、取得字符串:
import anydbm
file = anydbm.open("filename") #连接到扩展文件
file['key'] = 'data' #通过键存储数据
data = file['key'] #通过键取得数据
如果我们用“shelve”代替“anydbm“,可以存储整个python的对象(shelve是通过键访问的持久的python数据库)
在Internet工作中,python的CGI脚本也支持实现了一个类似字典的接口。一个对cgi.FieldStorage范围的调用产生了一个类似字典的对象。在客户端Web页上每一个输入字段有一项:
import cgi
form = cgi.FieldStorage() #解析格式数据(stdin,environ)
if form.has_key('name') :
showReply('Hello, '+ form['name'].value)
使用字典的注意事项:序列操作不能工作,赋值给新的索引将添加项,键没有必要总是字符串
元组由简单的对象组构成。除了不能原位改变(它们是不可变的),并且通常写成一串圆括号中的项之外,元组与列表类似。元组的属性有:任意对象的有序集合,通过偏移存取,属于不可变序列类型,固定长度、异常、任意嵌套,对象引用的数组
操作 | 解释 |
() | 一个空的元组 |
t1 = (0,) | 只有一项的元组(不是一个表达式)单项元组 |
t2 = (0,1,2,3,4) | 一个有五项的元组 |
t2 = 0,1,2,3,4 | 另一个有五项的元组(同上一行一样) |
t3 = ('abc', ('def', 'ghi')) | 嵌套 |
t1[i], t3[i][j] t1[i:j] len(t1) | 索引 分片 求长度 |
t1+t2 t2*3 | 合并 重复 |
for x in t2,3 in t2 | 迭代成员关系 |
操作 | 解释 |
output = open('/tmp/spam', 'w') | 生成输出文件('w'代表写)('a'代表为在文件尾部追加内容而打开文件) |
input = open('data', 'r') | 生成输入文件('r'代表读) |
S = input.read() | 把整个文件读到一个字符串中 |
S = input.read(N) | 读N个字节(1个或多个) |
S = input.readline() | 读下一行(越过行结束标记) |
L = input.readlines() | 读取整个文件到一个行字符串的列表中 |
output.write(S) | 把字符串S写入文件 |
output.writelines(L) | 将列表L中所有的行字符串写到文件中 |
output.close() | 手工关闭(或者在垃圾收集时进行) |
在一个文件中seek函数复位当前位置。flush强制刷新缓存种终止输出便于写等等
>>> myfile = open('myfile','w')
>>> myfile.write('hello text file\n')
>>> myfile.close()
>>> myfile = open('myfile','r')
>>> myfile.readline()
'hello text file\012'
>>> myfile.readline() #空字符串:文件结尾
' '
基于描述文件的文件
— os模块提供了使用低级基于描述文件的接口
DBM键(keyed)文件
— anydbm提供了一个通过键访问文件的接口
持久文件
— shelve和pickle模块对保存整个对象提供支持(不只是简单的字符串)
管道
— os模块也提供了POSIX接口以便于处理管道
其他
— 还有些对数据库系统的可选接口,基于B树的文件,等等
class MySequence:
def __getitem__(self,index):
# [index], for x in self, x in self
def __getslice__(self,low,high):
# called on self[low:high]
def __add__(self,other):
# called on self + other
对象 | 值 |
"spam" | 真 |
" " | 假 |
[ ] | 假 |
{ } | 假 |
1 | 真 |
0.0 | 假 |
None | 假 |
数字 → 整数 → 整数、长整数 → 浮点数、复数
集合 → 序列 → 不可变的 → 字符串、元组 → 可变的 → 列表 → 映射 → 字典
可调用的 → 函数、类、方法 → 绑定 → 非绑定
其他 → 模块、实例、文件、空内部 → 类型、代码、框架、轨迹
1. 赋值生成引用而不是拷贝
>>> L = [1,2,3]
>>> M = ['X', L ,'Y'] #对L的嵌套引用
>>> M
['X', [1,2,3], 'Y']
>>> L[1] = 0
>>> M
['X', [1,0,3], 'Y']
解决方法: 这种影响通常只在大型程序中会很重要,而有的时候共享引用绝不是你真正想要的。如果不是这样,你可以通过拷贝他们以避免共享对象。在列表中,你总能生成使用一个空的有限分片生成的高级拷贝。
>>> L = [1,2,3]
>>> M = ['X', L[:] ,'Y'] #一个嵌入的L的拷贝
>>> L[1] = 0 #只改变L,不改变M
>>> M
['X', [1,2,3], 'Y']
2. 同层深度的重复加。当我们介绍序列重复的时候,我们说他有些像在序列后加上自身的某些倍数。这是正确的,但是当可变的对象嵌套的时候,效果可能不总向我们想的那样。
>>> L = [4,5,6]
>>> X = L * 4 # 类似[4,5,6]+[4,5,6]+...
>>> Y = [L] * 4 # [L]+[L]+...
>>> X
[4, 5, 6, 4, 5, 6, 4, 5, 6, 4, 5, 6]
>>> Y
[[4, 5, 6], [4, 5, 6], [4, 5, 6], [4, 5, 6]]
>>> L[1] = 0 # 影响Y但是不影响X
>>> X
[4, 5, 6, 4, 5, 6, 4, 5, 6, 4, 5, 6]
>>> Y
[[4, 0, 6], [4, 0, 6], [4, 0, 6], [4, 0, 6]]
解决办法:这的确是另一个触发共享可被对象引用的方法,这样,上面同样的方法可以应用在左边。并且如果你记得重复、合并、分片复制只是在操作对象的顶层的话,这一类的例子更加有用。
3.不可变类型在原位不可以被改变
>>> T = (1,2,3)
>>> T[2]=4
Traceback (most recent call last):
File "", line 1, in ?
TypeError: object does not support item assignment
>>> T = T[:2]+(4,)
>>> T
(1, 2, 4)
解决办法: 用分片、合并等等操作生成一个新的对象。但是如果需要的话向后赋值给原引用。这样看上去像额外的编码工作,但是这样做的优点就是,当使用元组和字符串这样的不可变对象的时候,不会发生先前的问题。因为他们在原位置可以被改变,不会产生类似列表中的副作用。