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__();
Python高级编程(19):python中的序列分类
python中的序列其实就是一种协议,Python是基于协议而开发的。我们依据两个维度来将序列进行分类,一个是按照是否必须存储同一类型分为容器序列和扁平序列;另一个则是序列是否可变,分为:可变序列和不可变序列。
容器序列:list、tuple、deque;扁平序列:str、bytes、bytearray、array.array。
容器序列就是可以存储不同类型数据结构的对象,只是一个容器而已:
12345678a_list = []a_list.append(123)a_list.append("nihao")print(a_list)# 输出结果:[123, 'nihao']
而扁平序列就是只能存储同一数据类型的对象。
可变序列:list, deque,bytearray、array
不可变序列:str、tuple、bytes可变序列就是允许你往里面添加数据,不可变序列就是不允许你修改里面的内容。
Python高级编程(18):contextlib简化上下文管理器
本来我们这个应该是和前面的with语句放在一块的,但是我想多写一篇,目的就是为了突出使用contextlib这个模块以后,我们的上下文管理器简化了很多。
我们还是先来看一段代码:
1234567891011121314151617import contextlib@contextlib.contextmanagerdef file_open(file_name): print("file open") # 此处代码就相当于之前的enter魔法函数实现的代码 yield {} # 必须是yield一个生成器,可以没有{},但是yield关键词必须有 print("file end") # 此处代码就相当于之前的exit魔法函数实现的代码with file_open("envse.txt")as file_read: print("file is reading")# 输出结果:file openfile is readingfile en ...