自定义序列类

序列是Python中非常重要的协议!是可迭代的!

序列的分类:

 

 

序列的协议是放在 from collections import abc的__all__里面的“Sequence”和“MutableSequence”

里面collection方法继承了 Sized, Iterable, Container

如果为MutableSequence的话,就声明了很多可以使用的方法 例如:  insert,append,clear,reverse,extend,pop,remove,__iadd__

下面很重要!!

a = [1,2]
a += (3,4)
#结果是
[1, 2, 3, 4]

改为 
a = [1,2]
c = a + (3,4)
TypeError: can only concatenate list (not "tuple") to list

上面不报错的原因可以参考可变序列的MutableSequence的__iadd_函数,它实际上是调用了该类的extend的方法,对该元祖进行了for循环,这样就再在循环中使用append方法可以一个一个得将元祖内值放入list中。而后者并没有调用该函数,所以报错!

append和extend的区别是:

a = [1,2]
a.append((1,2))
print(a)
a的结果是 [1, 2, (1, 2)]

由此可见append是将所有看成一个值放进去,不迭代

而extend
a.extend(range(3))
print(a)
[1, 2, 0, 1, 2]
是将能够可迭代对象实现迭代一个一个当进去

List的基本切片操作!!!

#模式[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]  # 切片元素不连续,隔一个删一个

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)

#bisect的默认是bisect_right
print(bisect.bisect_left(inter_list, 3))
#学习成绩
print(inter_list)

序列的另一种类型:数组 array。数组的存储是一种连续的空间,所以性能很快。

# array, deque
# 数组
import array
#array和list的一个重要区别, array只能存放指定的数据类型 i是指的int类型,其他类型可以百度
my_array = array.array("i")
my_array.append(1)
my_array.append("abc")就会报错 因为这个数组指明的只能接受int类型

列表生成式!! 性能是高于 列表操作的!逻辑过于复杂就不用!!

def handle_item(item):
    return item * item
odd_list= []
odd_list = [handle_item(i) for i in range(20) if i%2 ==0]
print(odd_list)

结果为:
[0, 4, 16, 36, 64, 100, 144, 196, 256, 324]

生成器表达式:

odd_gen = (i for i in range(20) if i%2 ==0)
print(odd_gen)
odd_list = list(odd_gen)
print(odd_list)


结果为
<generator object <genexpr> at 0x0000023A7F2B1728>
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

字典推导式:

#字典推导式
my_dict = {
    "key1":"bobby1",
    "key2":"bobby2"
}
reverse_dict = {value:key for key,value in my_dict.items()}
print(reverse_dict)


结果是:
{'bobby1': 'key1', 'bobby2': 'key2'}

集合推导式:和列表推导式是一样的,只是用的是大括号。推导出来的是集合!

#集合推导式
my_set = {key for key,value in my_dict.items()}
print(type(my_set))
print(my_set)

结果为
<class 'set'>
{'key2', 'key1'}

 

posted @ 2019-04-20 23:46  魔法少女希维尔  阅读(191)  评论(0编辑  收藏  举报