数据类型

动态类型 & 强类型

python 是动态类型的, 它自动跟中你的类型而不是要求声明代码; 在编译的时候, Python不会检查对象是否拥有被调用的方法或者属性, 而是直至运行时,才做出检查.

python 也是强类型语言, 对象和操作集合绑定, 你只能对一个对象进行有效的操作.

number

从列表中随机选择: import random random.choice([1,2,3,4])

/ 和 //

/ 传统除法. 在 Python2.5 或之前, 对整数会省去小数部分, 对浮点数会保持小数部分. 在 3.0 版本中将变成真除法, 无论任何类型都会保持小数部分. // Floor 除法. 不考虑操作对象的类型, 总会省略掉结果的小数部分.

string

分片: 取出从偏移1开始, 直到但不包括3的内容 s[1:3] s[1:] s[:3] s[:-1] 负索引 倒数第2个元素 s[-2] = S[len(s)-2]

字符串查找 s.find(‘seg’) 搜索和替换 s.replace(‘from’,’to’) 内容检查 s.isalpha() s.isdigit() 移除右侧空字符 s.rstrip() raw字符串, 忽略反斜线的转义机制 r’sadfdands’ 测试成员关系 ‘k’ in s 开头匹配 s.startswith(‘asd’)

合并操作和 replace 方法, 每次运行会产生新的字符串对象, 利用它们去修改字符串存在一个潜在的性能缺陷. 如果要对一个超长字符串做许多的修改, 可能需要将字符串转换为一个支持原地修改的对象.

Tip: 可作用于多种类型的通用型操作都是以内置函数表达式的形式出现的, 如 len(l), l[0]; 但特定类型的操作是以方法调用的形式出现的 - -!

Tip: 帮助查询 help(s.index) Tip: PyDoc 从对象中提取文档的工具, 能将结果转换成 HTML 格式.

步进 扩展分片 X[I:J:K] 从偏移 I 到偏移J-1, 每隔 K 个元素索引一次. 允许负的步进. 通过一个负数步进, 两个边界的意义实际进行了转, 如 “hello”[::-1] 将序列反转为 “olleh”.

Tip: Python 设计的座右铭之一就是拒绝猜的诱惑. 如, 在 Python 中不能让数字和字符串相加.

ord 函数把单个字符转换成 ASCII 码. chr 函数执行相反的操作.

字符串格式化 %[(name)][flags][width][.precision]code 在 % 和字符码之间, 可以: 放置一个字典的键name; 罗列出左对齐[-]正负号[+]和补零的标志位; 给出数字的整体长度和小数点后的位数等. 如 “integers:…%d…%-6d…%06d” % (1234,1234,1234) 默认格式化,6位左对齐格式化,6位补零格式化 “%(n)d %(x)s” % {“n”:1, “x”:”spam”}

Tip: var() 函数返回的字典,包含了所有在本函数调用时存在的变量

list

从列表中移除元素 l.pop(2) 或 del l(2) 排序 l.sort() 反转 l.reverse()

列表解析: 通过在一个序列中运行一个表达式创建一个新列表. [row[i] for row in M] [row[i] for row in M if row[i] % 2 == 0] 列表解析通常比等效的 for 循环更快, 也许快2倍.

Tip: python 垃圾收集的特性. 一旦一个对象的最后一个引用被移除(如, 将这个变量用其他的值进行赋值), 空间将会被立即回收.

列表拷贝 1 通过从头到尾的分片实现 >>> l = [1,2,3] >>> l2 = l[:] >>> l is l2 False 2 标准库中的 copy 模块, 有一个通用的拷贝任意对象类型的调用, 夜又一个拷贝嵌套对象结构的调用. import copy X = copy.copy(Y) X = copy.deepcopy(Y)

tuple

元组的不可变性只适用于元组本身顶层而非其内容. 如, 元组内部的列表是可以像往常那样修改的.

dictionary

字典按排序好的键的顺序输出 for key in sorted(D) Tip: 这里没有必要用 keys 方法得到一个序列, 因为字典本身就是一个迭代对象. for 和 sorted 能工作在遵循接待协议的任意对象上.

成员和列表存储的都是对象引用.

Tip: python 中的一个原则是, 首先为了简单和可读性去编写代码, 在程序运行后, 如果证实有必要考虑性能, 再去考虑性能问题.

查询键是否存在 D.has_key(‘akey’) ‘akey’ in D 避免获取不存在的3种方法 | 用 if 语句预先对键测试 | 用 try…catch 明确捕获异常 | 用 get 方法为不存在的键提供默认值 键列表&值列表 D2.keys() D2.values() 合并 D2.update(D1) 盲目覆盖相同键的值

删除 D2.pop(‘akey’) 删除一个键并返回它的值 D2.pop(‘akey’,False) 不存在键 ‘akey’ 时返回 False, 可以用来做参数处理.

遍历 下面两种方法是等价的 for key in D: for key in D.keys():

字典用于稀疏数据结构 如, 多维数组: Matrix = {} Matrix[(2,3,4)] = 88

从键列表构造字典: d = dict.fromkeys(keys,0

dict() 构造函数, 参数可以是: | 空, 返回空字典 | 关键字参数, 字典键为关键字, 值为关键字值 | 迭代对象, 每个迭代值是一组键值映射. dict(one=1, two=2) dict({‘one’: 1, ‘two’: 2}) dict(zip((‘one’, ‘two’), (1, 2))) dict([[‘two’, 2], [‘one’, 1]])

D.setdefault(key[, default]) 如果 key 在字典中, 返回它的值. 如果没有插入 key 值为 default, default 默认为 None.

set

集合是将一个序列或其他的迭代对象传递给 set 函数, 创建的一个对象集合. >>> x = set(‘abcde’) >>> x set([‘a’, ‘c’, ‘b’, ‘e’, ‘d’])

集合支持一般的数学集合操作. 交 X & Y 并 X | Y 差 X - Y 元素 ‘a’ in x

None

None 占位符

Tip: 多态是使用好 python 的关键思想之一. 不要把代码限制在特定的类型上, 使代码自动地适应于多种类型.

File

读取之后的N个字节到一个字符串: astring = afile.read(N) 写入字符串到文件: afile.write(astring) afile.writelines(alist) 把输出缓冲区刷到硬盘中, 但不关闭文件: afile.flush() 修改文件位置到偏移量N处, 以便进行下一个操作: afile.seek(N)

文件数据在脚本中一定是字符串, 但把数据写入文件时, python 不会自动转换对象为字符串 - 必须传递一个已经格式化的字符串.

引用 & 拷贝

赋值对象总是存储对象的引用, 如果需要对象的拷贝, 可以明确要求: | 没有限制条件的分片表达式能够复制序列 L[:] | 字典 copy 方法 D.copy() 能够复制字典 | 有些内置函数能生成拷贝 list(L) | copy 标准库模块能够生成完整拷贝

注意无条件的分片, 以及字典 copy 方法只能做顶层复制, 不能复制嵌套的数据结构. 如果需要一个深层嵌套数据结构完全独立的拷贝: import copy x = copy.deepcopy(Y)

因为赋值对象总是存储对象的引用, 所以在需要对长变量名进行一些列访问时, 可以先将对象赋值给短变量名. 下面是django中的一个例子:
def setup_environ(self):
# Set up base environment env = self.base_environ = {} env[‘SERVER_NAME’] = self.server_name env[‘GATEWAY_INTERFACE’] = ‘CGI/1.1’ env[‘SERVER_PORT’] = str(self.server_port) env[‘REMOTE_HOST’]=” env[‘CONTENT_LENGTH’]=” env[‘SCRIPT_NAME’] = ”

类型测试

需要进行类型测试时, 一般建议使用 isinstance isinstance([1],list)