Fluent Python读书笔记(三)

来源:互联网 发布:萧涵seo 编辑:程序博客网 时间:2024/06/06 16:27

内置序列类型

容器序列
list、tuple和collections.deque这些序列可以存放不同类型的数据。存放的是它们所包含的任意类型的对象的引用。
扁平序列
str、bytes、bytearray、memoryview和array.array,这类序列只能容纳一种类型。存放的是值而不是引用,扁平序列其实是一段连续的内存空间,所以它更加紧凑,但它里面只能存放诸如字符、字节和数值这种基础类型。

可变序列
list、bytearray、array.array、collections.deque和memoryview。
不可变序列
tuple、str和bytes

collections.abc中的几个类
MutableSequence是可变序列,Sequence是不可变序列,从图中可以看出两者的差异,也能看到可变序列从不可变序列那里继承了一些方法。

列表推导和生成器表达式

列表推导:构建列表的快捷方式
生成器表达式:可以用来创建其他任何类型的序列

列表推导
原则是只用列表推导来创建新的列表,并且尽量保持简短

symbols = '!@#$%^'codes=[ord(symbol) for symbol in symbols]print codes[33, 64, 35, 36, 37, 94]

笛卡尔积
一个列表,3种不同尺寸的T恤衫,每个尺寸有2个颜色

colors=['black','white']sizes=['S','M','L']tshirts=[(color,size) for color in colors for size in sizes]print tshirts[('black', 'S'), ('black', 'M'), ('black', 'L'), ('white', 'S'), ('white', 'M'), ('white', 'L')]
  1. 得到的结果先以颜色排列,再以尺码排列
  2. 循环嵌套关系先color在size外层

生成器表达式
使用生成器表达式建立元组和数组

symbols = '!@#$%^'tucodes=tuple(ord(symbol) for symbol in symbols)print tucodes(33, 64, 35, 36, 37, 94)import arrayarcodes=array.array('I',(ord(symbol) for symbol in symbols))print arcodesarray('I', [33L, 64L, 35L, 36L, 37L, 94L])
  1. 如果生成器表达式是一个函数调用过程中的唯一参数,那么不需要额外再用括号把它围起来
  2. array的构造方法需要两个参数,因此括号是必须的。第一参数’I’指定了数组中数字的存储方式

使用生成器表达式计算笛卡尔积

for tshirt in ('%s %s' % (c,s) for c in colors for s in sizes):    print tshirtblack Sblack Mblack Lwhite Swhite Mwhite L

内存中不会留下一个有6个组合的列表,生成器表达式会在每次for循环运行时才生成一个组合。

原创粉丝点击