第二章主要讲的是序列构成的数组。
先讲python的标准库,python的标准库用C实现了丰富的序列类型,分为容器序列和扁平序列。
容器序列
list,tuple和collections.deque 这些序列可以存放不同类型的数据。
扁平序列
str,bytes,bytearray,memoryview和array.array,这些序列只能存放同种数据类型。
如果继续划分的话还可以划分成可变序列和不可变序列。
可变序列
list, bytearray, array.array, collections.deque和memoryview
不可变序列
tuple, str, bytes
上面就是给这一章开个头。下面开始正式的说明
关于列表推导和生成器表达式。
我想学过一点python的应该都会知道列表生成式这个东西,就是[x for x in range(10)]这样的用方括号括起来的,它就叫列表生成式,那么列表推导其实就是列表生成式,只是换了一个名字而已。
先说列表推导。
列表推导的作用就是用来生成列表的,也就是说使用列表推导会生成一个新的列表对象。
使用列表推导还可以生成二维数组,十分方便,而且可读性也不错。
tshirts = [(color,size) for size in sizes
for color in colors]
再说生成器表达式。
我觉得书上有一段话写的非常的好(可能是我是个菜鸡吧)
#虽然也可以用列表推导来初始化元组、数组或其他序列类型,但是生成器表达式是更好的选择。这是因为生成器
#表达式背后遵守了迭代器协议,可以逐个地产出元素,而不是先建立一个完整的列表,然后再把这个列表传递到
#某个构造函数里面。前面那种方法显然能够节省内存。
也就是说当我们使用列表推导的时候,是先建立一个完整的列表再把元素传入进去的,而生成器表达式是一个一个的。
生成器表达式和列表推导的区别在于生成器是用()圆括号的。而且生成器表达式可以生成列表以外的序列类型,下面看一个例子。
colors = ['black','white']
sizes = ['S','M','L']
for tshirt in ('%s %s' %(c,s) for c in colors for s in sizes):
print(tshirt)
显然,这里并没有生成一个含有六个元素的列表,而是逐个地产出。
然后是元组。
一直以来我对元组的印象仅仅停留在元组是不可变的,实际上元组还可以用来记录。
主要说一下具名元组这个概念。
在标准库里面有一个collections库,里面的namedtuple就是具名元组
举个例子
from collections import namedtuple
City = namedtuple('City','name country population coordinates')
tokyo = City('Tokyo','JP','36.933',(35.689722,139.691667))
#tokyo_data = ('Tokyo','JP','36.933',(35.689722,139.691667))
#tokyo = City._make(tokyo_data)
第二行代码我们使用具名元组构建了一个类,第一个参数是类名,第二个参数是字段。
字段可以有两种形式,一种是使用由数个字符串组成的可迭代对象,一种是像上面一样用由空格分隔开的字段名组成的字符串。
这样我们就构建了一个City类,然后第三行代码就创建了一个City实例,我们打印看一下结果。
打印的结果是一个City实例。
具名元组除了从普通元组那里继承来的属性之外,还有一些自己专有的属性,其中最有用的三个分别是。
类属性_fields,类方法_make(iterable),实例方法_asdict()
_fields属性是一个包含这个类所有字段名称的元组
用_make()可以通过接受一个可迭代对象来生成这个类的一个实例,它的作用和City(*tokyo_data)的效果是一样的。
_asdict()把具名元组以collections.OrderedDict的形式返回,我们可以利用它来把元组里的信息友好的呈现出来。