序列类型
容器序列
list
、tuple
、collections.deque
等序列可以存放不同类型的数据。
扁平序列
str
、bytes
、bytearray
、memoryview
、array.array
等序列只能容纳一种类型。
可变序列
list
、bytearray
、memoryview
、array.array
、collections.deque
不可变序列
tuple
、str
列表
列表推导
列表推导(真的好用)是构建list
的快捷方式,但劲酒虽好,不要贪杯哦!列表推导虽然好用,但是不要过度的使用,保持代码的简短,超过两行可以考虑使用for
循环。
1 | colors = ['black', 'white'] |
生成器表达式
相较于列表推导,生成器表达式背后遵守了迭代器协议,可以逐个地产出元素,而不是先建立一个完整的列表,然后再把这个列表传递到某个构造函数里,如果我们需要的列表很大时,用列表推导的方式不仅耗费时间还耗费内存,而生成器表达式则避免了这个问题。
1 | import sys |
切片
格式:swq[start:stop:step]
内部调用__getitem__(slice(start:stop:step))
方法。
切片是个好东西,但是突然发现没的说………..
序列的+
与*
这东西好用,但是有坑,据我所知GGH夏令营就被这个坑过,所以如果不熟悉慎用之。因为*
有时并没有创建新的元素,而是增加了已有元素的引用。
1 | board = [['-'] * 3 for i in range(3)] |
另外也可以使用sys.getsizeof(obj)
来查看内存的占用,这里边有一个很有意思的事情。多改变几次数值,观察下内存的变化,你会发现一件很有意思的事情,可以猜想下为什么会有这种变化。
1 | mylist = [1, 2, 3, 4, 5] |
排序
list.sort
就地排序,改变原序列的值并且返回None
sorted
不改变原序列的值,生成一个新的列表,可以接受任何形式的可迭代对象作为参数。
共同点:
两个可选关键字参数
reverse
:默认值为False
,如果设置为True
,则被排序的序列会以降序输出。key
:只有一个参数的函数。这样的方式体现了一种编写API的思想,将API的功能交给调用方来确定,使得相应的API更加灵活。
查找与插入
bisect
模块主要包含两个主要函数,bisect
和insort
,两个函数都利用二分查找算法在有序序列中查找或插入元素
1 | bisect.bisect_left(t,x) #在T列表中查找x,若存在,返回x左侧位置 |
元组
元组常被称为不可变的列表,但初此之外元组还可以用于没有字段名的记录。
元组拆包
- 元组拆包可以应用到任何可迭代对象上,唯一的硬性要求是被可迭代对象中元素的数量必须要跟接受这些元素的元组的空档数一致,另外可以用
*
来忽略多余的元素,也可以使用_
占位符,来忽略某几个元素。 - 接受表达式的元组可以是嵌套式的,但接受元组的嵌套结构必须符合表达式本身的嵌套结构。
与列表的不同
除了跟增减元素相关的方法之外,元组支持列表的其他所有方法。例外是元组没有__reversed__
方法,但是仍然可以使用reversed(tuple)
。