序列类型
- 序列的每一个元素可以通过指定一个偏移量(切片)的方式得到
- 标准序列类型操作符:成员
[not]in
、重复*
、连接+
、下标访问[x]
- 用
+
连接字符串不如用join()
方法,后者更节约内存;连接列表用extend()
方法更省 - 在序列中可以用
None
作为索引值,显示所有 - 一旦一个Python的对象被建立,我们就不能更改其身份或类型(用操作符操作时创建浅拷贝)
- 浅拷贝:简单说就是只拷贝了对对象的索引
- 常见序列转换函数:
list() str() unicode() tuple() basestring()
(抽象工厂函数,为str和unicode提供父类) - 常见序列类型内建函数(BIF):
len() reversed() sum() enumerate() max()/min() sorted() sum() zip()
字符串
- 字符串之间进行比较时,是用ASCII值的大小来比较的
- 把重复操作作为参数放到循环里面进行是非常低效的
for
里的else
只在循环完整结束并没有碰到break
时执行- python中允许在源码中把几个字符串连在一起写,以此来构建新字符串
- 字符串的格式化操作符
%
支持两种参数输入方式: 元祖 字典 - 字符串模板: 使用
${name}
占位生成Template对象,再用Template对象的substitute(name='xxx')/safe_substitute()
方法 - 原始字符串操作符:
r/R
,靠在第一个引号前,使字符不转义 - 常用字符串方法:
解码字符串:string.decode()
编码字符串:string.encode()
计数:string.count()
查找:string.find()/index()
合并:string.join()
替换:string.replace()
去空格:string.strip()
分割切片:string.split()
反大小写:string.swapcase()
检查开头结尾:string.startswith()/endswith()
- 转义字符常见:
\t \n \" \' \\ 响\a 退\b 纵\v 换\f 回\r 转\e
- UCS:通用字符集
UTF: Unicode或UCS的转换格式(Unicode采用多字节 UTF-8:1-4个字节) - string模块已经不推荐使用,只保留了ASCII的支持, 在需要跟Unicode兼容的代码里都不要使用;
Unicode字符串是UnicodeType类型 - 如果一个对象定义了
__unicode__()
方法, 可以将该对象转换成相应的Unicode字符串 - ASCII字符的UTF-8编码和ASCII编码相同
- 每当你向一个文件写入字符串的时候,你必须定义一个编码用于把对应的Unicode内容转换成你定义的格式(python中用
encode()
) - codec是COder/DECoder的首字母组合,定义了文本跟二进制的转换方式
- 处理Unicode规则:
字符串加前缀u
;
不用str()
用unicode()
;
不用string
模块;
不随便使用encode()/decode()
列表和元祖
- 列表是能保留任意数目对象的灵活容器
列表BIF:append() remove() pop() extend() count() index() insert() reverse() sort(func, key, reverse)
列表(大部分元祖也适用)常用操作符: 切片 成员关系 连接 用extend()
方法连接实际上是把新列表添加到原有的列表里面,而连接操作符(+
)则是新建一个列表;
该方法也常用于复合赋值运算(+=),支持任何可迭代对象- 列表可以使用大部分的对象和序列类型的操作符,列表有个特性是 列表解析(结合了列表的方括号和for循环)
cmp()
的关键点: 同类型:比较值;不同类型:若都是数、若一方是数、不然按类型名的字母顺序比;len长则大- 可以用
max/min()
对只包含数字和字符串对象的列表进行取特定值操作 - 注意字符串排序使用的是字典序,而不是字母序(例如”T”的ASCII码值要比字母’a’的还要靠前)
sum(seq, init=0)
效果等于reduce(operator.add, seq, init)
- 用
tuple()/list()
转换时,得出的结果虽然和原对象有着相同的数据集合, 但是变量指向的却不是同一个对象 - 如果
index()
的元素不存在于列表中,则会报错,因此在之前应有检查(比如in
) - 改变对象值的可变方法是没有返回值的(如sort, extend, reverse),字符串有(因为不可变,所以必须返回一个新的对象)
sorted()
和reversed()
与没d的不同之处:可以用作表达式,它们返回一个对象,原列表不变sort()
方法默认的排序算法是 归并排序(timsort)的衍生算法,时间复杂度是:O(lg(n!))- 堆栈是一个后进先出(LIFO)的数据结构,类似放餐盘,术语push指把一个对象添加到堆栈中(pop)
- 队列是一种先进先出(FIFO)的数据类型,类似银行排队
- 元祖常做字典的key,另外当处理一组对象(多对象)时,得到的结果默认是元祖类型
- 可以把列表作为元祖的元素, 可以实现元祖的”可变”
- 在定义单个元祖的操作时如果不加逗号会被当作分组操作,而不是元祖的分界符
- 序列类型相关模块:
array, copy, operator, re, types, 长字符串操作cStringIO/StringIO,
包装文本textwrap, 高性能容器数据类型collections - 浅拷贝:创建了一个类型跟原对象一样,内容是原对象元素的引用(即对象本身是新的,内容不是)
实行方法:完全切片方法、工厂函数、copy.copy()
函数 - 深拷贝:即创建一个新的容器对象,
copy.deepcopy()
- 拷贝注意:
a)非容器类型没有被拷贝一说,浅拷贝是用完全切片来完成
b)如果元祖变量只包含原子类型对象,深拷贝无效 - 把相同的词汇或句子, 在下文中调换位置或颠倒过来, 产生首尾回环的情趣, 叫做回文, 也叫回环
- 元祖既可以被分解成为单独的变量, 也可以直接用单一变量对其进行引用