流畅的python--学习笔记(二)

第二章主要讲的是序列构成的数组

先讲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的形式返回,我们可以利用它来把元组里的信息友好的呈现出来。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值