python中的内置序列 ,fluent python读书笔记2

一、python内置的序列:

(1)容器序列:

list、tuple、和collections.deque。这些序列中存放的是他们所包含的对象的引用,可以存放不同类型的数据。

(2)扁平序列:

str、bytes、bytearray、memory view和array.array。这些序列存放的是值而不是引用,只能容纳一种类型


二、列表推导式与生成器表达式:

(1)列表推导式:

使得自身代码更加明了,例如我们想将一个字符串变为其Unicode码位的列表:

不使用列表推导式:

symbols = "$%^&^&%^"
codes = []
for i in symbols:
    codes.append(ord(i))
print(codes)

使用列表推导式:

扫描二维码关注公众号,回复: 2321420 查看本文章
symbols = "$%^&^&%^"
codes = [ord(i) for i in symbols]
print(codes)

并且在python中,会忽略[ ], { }, ( )中的换行,因此可以省略续行符“\”使得代码更漂亮。并且在python3中修复了python2中列表推导可能出现的变量泄露问题。

(2)生成器表达式:

生成器遵循迭代器的协议,它可以逐个产出元素,而不是先建立一个包含所有元素的完整列表,这种方式可以节省内存,并且生成器的语法与列表推导式差不多,只需要将[ ],换成( )例如:

colors = ["black", "white"]
sizes = ["S", "M", "L"]
for tshirt in ('%s %s'%(c, s) for c in colors for s in sizes)
    print(tshirt)

这样写节省了创建color,size的列表空间。


三、元祖的记录功能与拆包:

(1)元祖的记录功能:

    元祖除了是不可变的列表以外,它还是对数据的记录:元祖中每一个元素都放置了记录中一个字段的数据,外加这个字段的位置。例如我们可以用元祖储存某类事物的信息:

city, year, pop, chg, area = ('Tokyo', 2003, 32450, 0.66, 8014)

这个元祖就储存了城市,年份等信息。而这种赋值运算就叫做拆包。我们可以用*来忽略不需要的元素,或者用*将一个可迭代对象拆开。例如:

>>> divmod(20, 8)
(2, 4)
>>> t = (20, 8)
>>> divmod(*t)
(2, 4)

(2)一个谜题:

我们执行如下代码:

t = (1, 2, [30, 40])
t[2] += [50, 60]

那么会发生什么呢?

A、t变成(1,2,[30, 40])

B、抛出异常,set不允许被赋值

C、均不对

D、A和B均对

执行一下发现D是对的,这在于+=不是一个原子操作,我们对列表[30, 40]操作了(正确),再将其赋值给t[2](报错)


四、双向队列:

    虽然利用pop,extend方法让我们可以将列表当作栈或队列,但是对列表的第一个操纵是很费时的,因为这些操作会牵扯到后面的所有元素。当我们需要这样使用这样一种数据结构的时候,可以使用collections.deque类,下面给出例子:

>>> from collections import deque
>>> dq = deque(range(10), maxlen = 10)
>>> dq
deque([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], maxlen = 10)
>>> dq.appendleft(-1)
>>> dq
deque([-1, 1, 2, 3, 4, 5, 6, 7, 8, 9], maxlen = 10)

(1)maxlen是一个可选参数,代表队列容纳元素数量,设定后不可修改。

(2)当len(dq) == d.maxlen 时,如果在队列作头部添加,尾部的元素会被移除。尾部同理

猜你喜欢

转载自blog.csdn.net/shaft_/article/details/79764781