Python高级编程(29):set和frozenset
set是集合,frozenset则是不可变集合,集合的特点是无序和不重复,可以用于元素去重操作。
查看一下set的源码:
123456789def __init__(self, seq=()): # known special case of set.__init__ """ set() -> new empty set object set(iterable) -> new set object Build an unordered collection of unique elements. # (copied from class doc) """ pass
因此可以使用iterable对象作为参数,构建集合。
1234567891011121314151617181920212223242526s1 = set('abcd')s2 = set(['a', 'b', 'c', ...
Python高级编程(28):dict的子类
python中一切都可以被继承,dict自然不例外,但是我们并不建议大家去继承Python中的内置的像list,dict等数据结构,特别是用C语言写的数据结构,因为有些操作不会生效。1. 自定义一个字典时,不要直接继承自dict,因为有些操作会不生效
1234567891011121314class MyDict(dict): def __setitem__(self, key, value): # 重写父类的setitem方法,似乎并没有什么用 super(MyDict, self).__setitem__(key, value*5)# 首先明确下面两种方式其本质是一致的操作,都会调用__setitem__这个魔法函数mydict = MyDict(one=2)print(mydict)mydict['one'] =2print(mydict)# 运行结果:{'one': 2}{'one': 10}
也就是是说在某些情况下,用C语言写的Python内置 ...
Python高级编程(27):dict的常用方法
本篇我们来聊一下Python中dict的常用方法,这个还是挺重要的,所以可以多花点时间学习一下。
123456789101112131415161718192021222324252627282930313233343536a = { 'xiaoming': {'sex': 'male'}, 'xiaobai': {'sex': 'female'}}# clear()清空字典# a.clear()# print(a)# copy() 浅拷贝# new_copy_a = a.copy()# new_copy_a['xiaoming']['sex']= 'female'# print(new_copy_a)# print(a)# copy,浅拷贝,只拷贝了最外层的对象的引用,如果浅拷贝的# 时候有可变对象的应用,则如果修改了原来的值,则可变对 ...
Python高级编程(26):dict的abc继承关系
Python字典中的dict其实是一种Mapping类型,我们可以使用isinstance判断一下,发现是真的:
12345678910from _collections_abc import Mapping, MutableMappingprint(type(dict)) # type类型print(isinstance(dict, MutableMapping)) # False,因为isinsatance的第一个参数是object而不是一个类a ={}print(isinstance(a, MutableMapping)) # True,a 并不是继承MutableMapping,而是实现了MutableMapping中的方法
我们可以查看MutableMapping的源码,可以发现MutableMapping只是将dict注册进去而已
1MutableMapping.register(dict)
具体的点击这里
Python高级编程(25):列表推导式、生成器表达式、字典推导式
列表(生成)推导式我们有一个需求,输出10以内的所有奇数:
12345678910old_list = []for i in range(10): if i % 2 ==1: old_list.append(i)print(old_list)# 输出结果:[1, 3, 5, 7, 9]
现在我们对其进行修改,利用列表生成式来实现相同的功能:
12345a = [i for i in range(10) if i % 2 ==1]print(a)# 输出结果:[1, 3, 5, 7, 9]
是不是很简单,我们加一点困难,返回那些奇数的平方,同样也是使用列表生成式来完成:
123456789def sequreitem(item): return item*itema = [sequreitem(i) for i in range(10) if i % 2 ==1]b = [i**2 for i in range(10) if i % 2 == 1]print(a)print(b)
这样看起来也是很简单的,但是一旦有更多的逻辑,我们就不要用了,因为代码的可读性是非 ...
Python高级编程(24):什么时候我们不该使用列表?
尽管我们在大多情况之下喜欢使用列表,但是有的时候我们不该使用列表,而是转向使用更高级的Python内置的数据类型,这里主要说array和deque。
上面这个图片就是展示了Python中用C语言写的列表所具有的全部方法,我们从这就能知道所有的信息。前面说过列表是一种容器序列,可以存放不同数据类型的对象。这个数组array就只能存放指定类型的数据类型对象了。
123456789import array# array和list的一个重要区别, array只能存放指定的数据类型my_array = array.array("i") # 这里的i就表明这个数组就只能存放int类型的对象my_array.append(1) # 运行正常my_array.append("abc") # 运行报错# 报错内容: my_array.append("abc")TypeError: an integer is required (got type str)
参考文章:[ - ]:array文档
Python高级编程(22):实现可切片的对象
我们来看一段代码,注意一下这里的start和end指的都是索引号,不是值(如[3:6]就是指索引号为3/4/5的元素,索引号从0开始):
1234567891011121314151617181920212223242526# 模式[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]) # 返回包含原列表中所有元素的逆序列表prin ...
Python高级编程(23):bisect维护已排序序列
1234567891011121314151617181920import bisectfrom 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)# 输出结果:2deque([1, 2, 3, 5, 6])
我们只需要记住几点:1、bisect = bisect_right 和 insort = insort_right,而且insort 返回插入后的新列表,而bisect 则是返回在列表中的位置(索引号)。
具体的可以看这里:bisect——模块
Python高级编程(21):list中+、+=、extend的方法区别
我们知道在list中,有+、+=、和extend,但是它这3个的区别你知道么?
+:
1234567a = [1,2 ,3]c = a + [5,6,7]print(c)# 输出结果:[1, 2, 3, 5, 6, 7]
+=:
1234567a = [1,2 ,3]a += [5,6,7]print(a)# 输出结果:[1, 2, 3, 5, 6, 7]
你肯定会说这个没啥好说的,那么我们修改一下,将这个列表 [5,6,7]修改为元组(5,6,7),然后我们再分别使用+和+=试试:
1234567891011121314151617# 使用+操作a = [1,2 ,3]c = a + (5,6,7)print(a)# 输出结果:TypeError: can only concatenate list (not "tuple") to list# 使用+=操作a = [1,2 ,3]a += (5,6,7)print(a)# 输出结果:[1, 2, 3, 5, 6, 7]
所以看到没,我们这个+=可以连接不同类型的数据类型,知道为什么么,因为它里面包含了一个魔法 ...
Python高级编程(20):python中序列类型的abc继承关系
1from Lib import _collections_abc
我们所有关于序列类型的模块都在abc这个里面,前面也说过python是基于协议开发的语言,我们现在又要谈到我们的鸭子模型了。只要具有相应的魔法函数,它就具有了相应的功能:
如果我们要定制一个不可变的容器,如String,那么代码中就不能有修改容器数据的方法,如__setitem__(), __delitem__();
如果希望定制的容器支持reversed()这个内置函数,那么容器中需定义__reversed__()方法,从而提供对内置函数reversed()的支持;
在容器中,查询容器”容量”的方法是通过len()这个内置函数来实现,所以容器中需要定义__len__()方法;
如果希望容器支持读,写和删除功能,那么就要实现对应的方法:__getitem__(), __setitem__(), __delitem__();
