自定义序列类

序列是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‘}

原文地址:https://www.cnblogs.com/shrimpPython/p/10743409.html

时间: 2024-11-01 23:51:01

自定义序列类的相关文章

第五章自定义序列类

1.序列类型的分类 容器序列(元素类型可以不同):list.tuple.deque 扁平序列(元素类型必须相同):str.bytes.bytearray.array.array 可变序列(序列内容可以修改):list.deque.bytearray.array 不可变(序列内容不可以修改):str.tuple.bytes 2.序列的abc继承关系 Sequence就是不可变序列的方法集合的抽象基类 MutableSequence是集合了可变序列的方法和协议的抽象基类. 3.序列的+.+=和ext

python魔法方法-自定义序列

自定义序列的相关魔法方法允许我们自己创建的类拥有序列的特性,让其使用起来就像 python 的内置序列(dict,tuple,list,string等). 如果要实现这个功能,就要遵循 python 的相关的协议.所谓的协议就是一些约定内容.例如,如果要将一个类要实现迭代,就必须实现两个魔法方法:__iter__.next(python3.x中为__new__).__iter__应该返回一个对象,这个对象必须实现 next 方法,通常返回的是 self 本身.而 next 方法必须在每次调用的时

魔法方法之自定义序列

自定义序列 自定义序列的相关魔法方法允许我们自己创建的类拥有序列的特性,让其使用起来就像 python 的内置序列(dict,tuple,list,string等). 因为如果要定制容器类型的话需要用到这些协议.首先,实现不变容器的话有一个协议:实现不可变容器,你只能定义__len__ 和 __getitem__ (一会会讲更多).可变容器协议则需要所有不可变容器的所有另外还需要 __setitem__ 和 __delitem__ .最终,如果你希望你的对象是可迭代的话,你需要定义 __iter

自定义实体类在三层架构之间传递数据

自定义实体类是专门承载业务实体数据的类,一般将方法分离出来,只包含属性和字段的定义.每个实体类对应数据库中的一个表,每个属性对应表中的一个相应的字段.使用实体类属于面向对象编程的思想,将每个表封装成对应的类. 1. 为什么使用自定义实体类 (1)使程序更加灵活.如果数据库发生了更改,只需要修改数据实体类的代码,其他层的代码修改量很小. (2)使用面向对象思想将数据库中的表抽象为类,消除了关系数据与类的差别,使程序维护和扩展更方便. (3)更有利于分层架构设计. 2. 使用自定义实体类作为三层架构

Excel中拖放填充与自定义序列

记得刚用excel的时候,对填充功能还不甚了解,以至于做过对相邻挨个单元格粘贴相同公式,然后再更改单元格引用的傻事.自从知道了填充后,往下一拖相应的公式和单元格引用就都做好了.运用填充和序列,虽然不是什么受人顶礼膜拜的技能,但熟练掌握确实可以提高工作效率. 注意数值型需要提供前两个数据,其他类型只要提供前一个数据即可,而且并不需要从序列的第一个数据开始输入.另外除了拖动填充柄还可以双击填充柄进行填充. 当你在一个单元格输不同类型的数据,然后进行拖放,excel会产生不同的效果,比如你在A1输入一

C#学习笔记(14)——C# 使用IComparer自定义List类的排序方案

说明(2017-7-17 21:34:59): 原文:https://my.oschina.net/Tsybius2014/blog/298702?p=1 摘要: C# 使用IComparer自定义List类的排序方案 List类中不带参数的Sort函数可以用来为List类中的元素排序,但如果List类中的元素类型本身不能直接进行比较(如自定义的struct和很多class),或是希望采用更加灵活的自定义比较方式,可以通过继承了IComparer接口的函数来解决. 代码示例如下: 1)声明一个类

修改tt模板让ADO.NET C# POCO Entity Generator With WCF Support 生成的实体类继承自定义基类

折腾几天记载一下,由于项目实际需要,从edmx生成的实体类能自动继承自定义的基类,这个基类不是从edmx文件中添加的Entityobject. 利用ADO.NET C# POCO Entity Generator With WCF Support生成的tt文件(比如model.tt)中找到 partial class partial class 修改tt模板让ADO.NET C# POCO Entity Generator With WCF Support 生成的实体类继承自定义基类

C++ 运算符重载四(自定义数组类)

//自定义数组类 #include<iostream> using namespace std; //分析:能获取数组长度,添加元素,删除元素,修改元素 //要求重载[],=,==,!=运算符 class MyArray { private: int mLength; int* mSpace; public: MyArray(int length){ cout << "有参构造函数被调用了1" << endl; mLength = length; m

Lua调用自定义C++类

弄了一天终于会Lua调用自定义C++类.不容易啊. 我的电脑是64位的,装了64的Python不行,装了32位的就可以了,靠!下面是报错信息 python pyyaml Cheetah全都是装32位的,其中python版本是用2.7.8,是可以的. Cocos2d-x v3.2 Cocos Code IDE 1.2.0 NDK r9d dos2unix,windows下可能在执行脚本时有这个错误.是创建项目时没有了这个文件,可以去cocos2dx里面复制一个,如 E:\cocos2d-x-3.2