Python的序列类型非常丰富,包括了列表(list),元组(tuple),字符串(str), 字节数组(bytes),队列(deque),今天我们就着重了解下python中的这些内置序列类型。
序列类型的分类
容器序列
list
tuple
deque
能存放不同类型的数据
扁平序列
str
bytes
bytearray
array.array
memoryview(内存视图)
存放的是相同类型的数据
容器序列和扁平序列有什么不同呢?
容器序列存放的实际上是对象的引用,因此可以存放不同类型的数据;扁平序列存放的是对象的值,是一段连续的内存空间,因此要求对象必须是相同类型的数据才行,如字符、数字、字节。
可变序列
list
deque
bytearray
array
顾名思义 可修改
不可变序列
str
tuple
bytes
与上面相反不可修改
序列的abc继承关系
在collections.abc 中有所有序列类型的抽象基类(父类),那么每个序列类型要想去实现实例化就得重写抽象基类中的所有方法,这样就能够控制以上序列类型的功能。那么我们自己想实现一个序列类型那么我们就要遵循抽象基类的接口重写接口功能即可。
序列的+、+=和extend的区别
python
a =[1,2]
b= a+[3,4]
print(b)
>>>[1,2,3,4]
产生了一个新的list
+符号的两边需要为同一序列类型
python
a =[1,2]
a +=[3,4]
print(a)
>>>[1,2,3,4]
并没有创建新的序列,而且两边的序列类型随意即可
python
a =[1,2]
a.extend(rang(3))
>>>[1,2,0,1,2]
python
a =[1,2]
a.apend([3,4])
print(a)
>>>[1,2,[3,4]]
不进行遍历直接拼接
实现可切片对象
首先了解下什么是切片
模式[start:end:step]
"""
其中,第一个数字start表示切片开始位置,默认为0;
第二个数字end表示切片截止(但不包含)位置(默认为列表长度);
第三个数字step表示切片的步长(默认为1)。
当start为0时可以省略,当end为列表长度时可以省略,
当step为1时可以省略,并且省略步长时可以同时省略最后一个冒号。
另外,当step为负整数时,表示反向切片,这时start应该比end的值要大才行。
"""
aList = [3, 4, 5, 6, 7, 9, 11, 13, 15, 17]
print (aList[::]) # 返回包含原列表中所有元素的新列表
print (aList[::-1]) # 返回包含原列表中所有元素的逆序列表
print (aList[::2]) # 隔一个取一个,获取偶数位置的元素
print (aList[1::2]) # 隔一个取一个,获取奇数位置的元素
print (aList[3:6]) # 指定切片的开始和结束位置
aList[0:100] # 切片结束位置大于列表长度时,从列表尾部截断
aList[100:] # 切片开始位置大于列表长度时,返回空列表
aList[len(aList):] = [9] # 在列表尾部增加元素
aList[:0] = [1, 2] # 在列表头部插入元素
aList[3:3] = [4] # 在列表中间位置插入元素
aList[:3] = [1, 2] # 替换列表元素,等号两边的列表长度相等
aList[3:] = [4, 5, 6] # 等号两边的列表长度也可以不相等
aList[::2] = [0] * 3 # 隔一个修改一个
print (aList)
aList[::2] = ['a', 'b', 'c'] # 隔一个修改一个
aList[::2] = [1,2] # 左侧切片不连续,等号两边列表长度必须相等
aList[:3] = [] # 删除列表中前3个元素
del aList[:3] # 切片元素连续
del aList[::2] # 切片元素不连续,隔一个删一个
实现可切片的对象那么我们就要实现序列类型中的接口代码如下
import numbers
class Group:
#支持切片操作
def __init__(self, group_name, company_name, staffs):
self.group_name = group_name
self.company_name = company_name
self.staffs = staffs
def __reversed__(self):
self.staffs.reverse()
def __getitem__(self, item):
cls = type(self)
if isinstance(item, slice):
return cls(group_name=self.group_name, company_name=self.company_name, staffs=self.staffs[item])
elif isinstance(item, numbers.Integral):
return cls(group_name=self.group_name, company_name=self.company_name, staffs=[self.staffs[item]])
def __len__(self):
return len(self.staffs)
def __iter__(self):
return iter(self.staffs)
def __contains__(self, item):
if item in self.staffs:
return True
else:
return False
staffs = ["bobby1", "imooc", "bobby2", "bobby3"]
group = Group(company_name="imooc", group_name="user", staffs=staffs)
reversed(group)
for user in group:
print(user)
bisect管理可排序序列
作用:用来处理已排序的序列,升序。
代码:
import bisect
from collections import deque
#用来处理已排序的序列,用来维持已排序的序列, 升序
#二分查找
inter_list = deque()
bisect.insort(inter_list, 3)
bisect.insort(inter_list, 2)
bisect.insort(inter_list, 5)
bisect.insort(inter_list, 1)
bisect.insort(inter_list, 6)
print(bisect.bisect_left(inter_list, 3))
#学习成绩
print(inter_list)
列表推导式、生成器表达式、字典推导式
不多逼逼直接看代码:
#用简介的方式去遍历可迭代对象生成需要格式的列表
int_list = [1,2,3,4,5]
qu_list = [item * item for item in int_list]
print (type(qu_list))
int_list = [1,2,-3,4,5]
qu_list = [item if item > 0 else abs(item) for item in int_list]
#笛卡尔积
int_list1 = [1,2]
int_list2 = [3,4]
qu_list = [(first, second) for first in int_list1 for second in int_list2]
my_dict = {
"key1":"bobby1",
"key2":"bobby2"
}
# qu_list = [(key, value) for key, value in my_dict.items()]
#
# qu_list2 = list(((key, value) for key, value in my_dict.items()))
#
# for item in qu_list2:
# print (item)
int_list = [1,2,3,4,5]
def process_item(item):
return str(item)
int_dict = {process_item(item):item for item in int_list}
#列表生成式,第一:能用尽量用, 因为效率高
print (int_dict)
写在最后
今天晚上又学了一章,还是比较充实的,👋。