温故知新,高级复读机
序列类型
- 序列的每一个元素可以通过指定一个偏移量(切片)的方式得到
- 标准序列类型操作符:成员
[not] in
、重复*
、连接+
、下标访问[x]
- 用
+
连接字符串不如用join()
方法,后者更节约内存;连接列表用extend()
方法更省
- 在序列中可以用
None
作为索引值,显示所有
- 一旦一个Python的对象被建立,我们就不能更改其身份或类型(用操作符操作时实际是创建了浅拷贝)
- 浅拷贝:
copy.copy()
,创建了一个具有相同类型、相同值但内存地址(id()
)不同的新对象,若其值包含可变对象,这些对象和原始对象中的值是同一个引用(改变值时会对原始对象产生副作用)
- 深拷贝:
copy.deepcopy()
,不仅拷贝原始对象自身,也对其包含的值进行拷贝,它会递归的查找对象中包含的其他对象的引用,来完成更深层次拷贝;不过也不是完全递归查找所有对象,当包含的值中存在相同的可变对象时,这些相同的可变对象指向的是同一份拷贝
- 拷贝相关:
- 非容器类型没有被拷贝一说,浅拷贝是用完全切片来完成
- 如果元祖变量只包含原子类型对象,深拷贝无效(相当于普通拷贝)
- 把相同的词汇或句子, 在下文中调换位置或颠倒过来, 产生首尾回环的情趣, 叫做回文, 也叫回环
- 常见序列转换函数:
list() str() tuple()
basestring()
(抽象工厂函数,为str和unicode提供父类)
- 常见序列类型内建函数(BIF):
len() reversed() sum() enumerate() max()/min() sorted() sum() zip()
- 序列类型相关模块:
array
, copy
, operator
, re
, types
, 长字符串操作cStringIO
或StringIO
- 包装文本
textwrap
, 数据类型拓展collections
字符串
- 字符串之间进行比较时,是用ASCII值的大小来比较的
- 把重复操作作为参数放到循环里面进行是非常低效的 (比如
while x < len(objectx)
,每次循环都调用len
函数)
for
里的else
只在循环完整结束并没有碰到break
时执行
- python中允许在源码中把几个字符串连在一起写,以此来构建新字符串
- 字符串的格式化操作符
%
支持两种参数输入方式: 元祖 字典
- 字符串模板: 使用string库中的
Template
对象进行实例化,例如Template('Hello,${name}!')
,再在实例上调用safe_substitute/substitute(k-v型参数)
进行占位符替换
- 原始字符串操作符:
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:通用字符集(Universal Character Set)
UTF: (Unicode Transformation Format),Unicode或UCS的转换格式(Unicode采用多字节 UTF-8:1-4个字节)
- string模块已经不推荐使用,只保留了ASCII的支持, 在需要跟Unicode兼容的代码里都不要使用
Unicode字符串是UnicodeType类型
如果一个对象定义了__unicode__()
方法, 可以将该对象转换成相应的Unicode字符串
- ASCII字符的UTF-8编码和ASCII编码相同
- 每当你向一个文件写入字符串的时候,你必须定义一个编码用于把对应的Unicode内容转换成你定义的格式(
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()
和sort()
的不同之处:前者可以用作表达式,它们返回一个对象,原列表不变
sort()
方法默认的排序算法是 归并排序 的衍生算法(timsort),时间复杂度是:O(lg(n!))
- 堆栈是一个后进先出(LIFO)的数据结构,类似放餐盘,
push
指把一个对象添加到堆栈中
- 队列是一种先进先出(FIFO)的数据类型,类似银行排队
- 元祖常做字典的key,另外当处理一组对象(多对象)时,得到的结果默认是元祖类型
- 可以把列表作为元祖的元素, 可以实现元祖的”可变”
- 在使用
()
定义单个元祖的操作时元素尾部不加逗号会被当作分组操作,而不是元祖的分界符
- 元祖既可以被分解成为单独的变量, 也可以直接用单一变量对其进行引用