序列类型

  1. 序列的每一个元素可以通过指定一个偏移量(切片)的方式得到
  2. 标准序列类型操作符:成员[not] in、重复*、连接+、下标访问[x]
  3. +连接字符串不如用join()方法,后者更节约内存;连接列表用extend()方法更省
  4. 在序列中可以用None作为索引值,显示所有
  5. 一旦一个Python的对象被建立,我们就不能更改其身份或类型(用操作符操作时实际是创建了浅拷贝)
  6. 浅拷贝:copy.copy(),创建了一个具有相同类型、相同值但内存地址(id())不同的新对象,若其值包含可变对象,这些对象和原始对象中的值是同一个引用(改变值时会对原始对象产生副作用)
  7. 深拷贝:copy.deepcopy(),不仅拷贝原始对象自身,也对其包含的值进行拷贝,它会递归的查找对象中包含的其他对象的引用,来完成更深层次拷贝;不过也不是完全递归查找所有对象,当包含的值中存在相同的可变对象时,这些相同的可变对象指向的是同一份拷贝
  8. 拷贝相关:
    • 非容器类型没有被拷贝一说,浅拷贝是用完全切片来完成
    • 如果元祖变量只包含原子类型对象,深拷贝无效(相当于普通拷贝)
  9. 把相同的词汇或句子, 在下文中调换位置或颠倒过来, 产生首尾回环的情趣, 叫做回文, 也叫回环
  10. 常见序列转换函数: list() str() tuple() basestring()(抽象工厂函数,为str和unicode提供父类)
  11. 常见序列类型内建函数(BIF):len() reversed() sum() enumerate() max()/min() sorted() sum() zip()
  12. 序列类型相关模块:
    • array, copy, operator, re, types, 长字符串操作cStringIOStringIO
    • 包装文本textwrap, 数据类型拓展collections

字符串

  1. 字符串之间进行比较时,是用ASCII值的大小来比较的
  2. 重复操作作为参数放到循环里面进行是非常低效的 (比如 while x < len(objectx),每次循环都调用len函数)
  3. for里的else只在循环完整结束并没有碰到break时执行
  4. python中允许在源码中把几个字符串连在一起写,以此来构建新字符串
  5. 字符串的格式化操作符%支持两种参数输入方式: 元祖 字典
  6. 字符串模板: 使用string库中的Template对象进行实例化,例如Template('Hello,${name}!'),再在实例上调用safe_substitute/substitute(k-v型参数)进行占位符替换
  7. 原始字符串操作符:r/R,靠在第一个引号前,使字符不转义
  8. 常用字符串方法:
    • 解码字符串:string.decode() 编码字符串:string.encode()
    • 计数:string.count() 查找:string.find()/index()
    • 合并:string.join() 替换:string.replace()
    • 去空格:string.strip() 分割切片:string.split()
    • 反大小写:string.swapcase() 检查开头结尾:string.startswith()/endswith()
  9. 转义字符常见: \t \n \" \' \\ 响\a 退\b 纵\v 换\f 回\r 转\e
  10. UCS:通用字符集(Universal Character Set)
    UTF: (Unicode Transformation Format),Unicode或UCS的转换格式(Unicode采用多字节 UTF-8:1-4个字节)
  11. string模块已经不推荐使用,只保留了ASCII的支持, 在需要跟Unicode兼容的代码里都不要使用
    Unicode字符串是UnicodeType类型
  12. 如果一个对象定义了__unicode__()方法, 可以将该对象转换成相应的Unicode字符串
  13. ASCII字符的UTF-8编码和ASCII编码相同
  14. 每当你向一个文件写入字符串的时候,你必须定义一个编码用于把对应的Unicode内容转换成你定义的格式(encode())
  15. codec 是处理编码的相关库,名字是COder/DECoder的首字母组合,提供编码转换相关的一些方法
  16. 处理Unicode规则:字符串加前缀u、不用str()unicode()、不用string模块、不随便使用encode()/decode()

列表和元祖

  1. 列表是能保留任意数目对象的灵活容器
    常用BIF: append() remove() pop() extend() count() index() insert() reverse() sort(func, key, reverse)
    常用操作符(其中大部分元祖也适用): 切片 成员关系 连接
  2. extend()方法连接实际上是把新列表添加到原有的列表里面,而连接操作符(+)则是新建一个列表 该方法也常用于复合赋值运算(+=),支持任何可迭代对象
  3. 列表可以使用大部分的对象和序列类型的操作符,列表有个特性是 列表解析(结合了方括号和for循环)
  4. cmp()的关键点: 同类型:比较值;不同类型:若都是数、若一方是数、按类型名的字母顺序比;len长度长则大
  5. 可以用max/min()对只包含数字和字符串对象的列表进行取特定值操作
  6. 注意字符串排序使用的是字典序,而不是字母序(例如”T”的ASCII码值要比字母’a’的还要靠前)
  7. sum(seq, init=0)效果等于reduce(operator.add, seq, init)
  8. tuple()list()转换时,得出的结果虽然和原对象有着相同的数据集合, 但变量指向的不是同一个对象
  9. 使用index()时如果元素不存在于列表或元祖中,则会报错,因此在之前应有检查(比如in)
  10. 改变对象值的一些方法没有返回值(如sort, extend, reverse),字符串有返回值(因为不可变,所以必须返回一个新的对象)
  11. sorted()sort()的不同之处:前者可以用作表达式,它们返回一个对象,原列表不变
  12. sort()方法默认的排序算法是 归并排序 的衍生算法(timsort),时间复杂度是:O(lg(n!))
  13. 堆栈是一个后进先出(LIFO)的数据结构,类似放餐盘,push指把一个对象添加到堆栈中
  14. 队列是一种先进先出(FIFO)的数据类型,类似银行排队
  15. 元祖常做字典的key,另外当处理一组对象(多对象)时,得到的结果默认是元祖类型
  16. 可以把列表作为元祖的元素, 可以实现元祖的”可变”
  17. 在使用()定义单个元祖的操作时元素尾部不加逗号会被当作分组操作,而不是元祖的分界符
  18. 元祖既可以被分解成为单独的变量, 也可以直接用单一变量对其进行引用