一、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)
使用列表推导式:
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 时,如果在队列作头部添加,尾部的元素会被移除。尾部同理