前言

学习是一个循序渐进的过程,不在于你学了多少,而在于你学会了多少。(装个b好吧,hhhh)

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

知识总结

之前一直想在网上找一个总结好的笔记,但是一直都没有找到,因此下定决心要总结一下,里面的都是在学习的过程中学到的一些最基础的一些概念啊,类型啊,方法啊之类的额,真的是花费了不少的时间,当然大佬请绕过好吧。。

python基础知识你学会了多少 Python 第1张
  1 概念
  2     1. 编程
  3         语言是一个事物与另外一个事物沟通的介质,编程语言是程序员与计算机沟通的一个介质。
  4         编程就是程序员用计算机能够理解的表达方式(编程语言)来讲自己的思维逻辑写下来的一个过程。
  5         编程的结果就是产生了一堆的文件,我们把这些文件称之为软件或者程序。
  6     2. cpu, 内存,硬盘
  7         cpu,内存,硬盘统称为计算机的三大核心硬件。cpu主要主要用来计算,内存和硬盘用来存储。出现两种存储硬件的格式主要是因为cpu的计算速度很快,而硬盘的
  8         读写速度很慢,为了更加高效的利用cpu的资源就出现了一种中间的存储也就是内存。但是内存不能持久化存储,断电易丢失。因此,在读取数据的时候就出现了
  9         这样一种现象,数据从硬盘读取到内存,然后通过cpu操作内存来实现一系列的操作。
 10     3. 运行程序,硬件的工作过程
 11         1. 程序保存在硬盘中
 12         2. 程序要运行必须先加载到内存
 13         3. cpu从内存中读取指令,然后翻译执行
 14     4. 进制之间的转换
 15         名词:bit,Bytes, KBytes, MBytes, GBytes, TBytes
 16         1Bytes = 8bit
 17         1KBytes = 1024Bytes
 18         1MBytes = 1024KBytes ...依次类推
 19     5. 操作系统
 20         操作系统是一个协调\管理\控制计算机硬件资源与软件资源的一个控制程序。可以把复杂的硬件操作封装成简单的功能接口用来给用户或者应用程序使用,
 21         以及合理的管理应用程序之间的资源分配。
 22     6. 编程语言的分类
 23         机器语言: 直接使用二进制指令编写的程序,运行效率非常高,但是开发效率非常低。
 24         汇编语言: 使用一些英文的标签来代替二进制指令去编写的程序,比机器语言的开发效率高,但是开发效率比起高级语言要低很多。
 25         高级语言: 直接使用人能够理解的表达方式去编写程序,开发效率比机器语言和汇编语言都要搞,但是执行效率很低。
 26             编译型语言: 执行效率高于解释型语言,开发效率低于解释型语言。
 27             解释性语言: 执行效率低于编译型语言,开发效率高于编译型语言。
 28         总结:
 29             执行效率: 机器语言>汇编语言>编译型语言>解释型语言
 30             开发效率: 机器语言<汇编语言<编译型语言<解释型语言
 31     7. 执行python程序的两种方式
 32         (1).交互式环境: 输入代码立即执行,但是不能保存文件
 33         (2).写入文件: 可以保存文件
 34     8. 变量: 是用来记录当前事物的某种状态,之后状态可以进行变化。
 35         变量的命名规范
 36             (1).字母数字下划线
 37             (2).不能以数字开头
 38             (3).对变量值有一定的描述性功能
 39             (4).不能是python中的关键字
 40         变量名的命名风格
 41             (1).驼峰体
 42             (2).下划线纯小写
 43         变量的三个特征
 44             (1).id  内存地址
 45             (2).type 变量的类型
 46             (3).value 变量的值
 47         常量
 48             常量的命名规范: python中默认是没有常量的,只是约定俗成的全大写的就是变量,我们不应该对其进行修改。
 49     9.  引用计数
 50         是python垃圾回收机制引入的一个名词,主要是用来显示当前变量值被关联的次数,如果为0,就会被python自动进行回收。
 51     10. 数据类型
 52         数据指的是变量的值,数据类型指的是变量值的类型。在日常生活中事物有多种形态,对应于程序中也应该有多种形态,也就是多种类型。
 53     11. python2和python3的区别
 54         (1).input和raw_input,python2中的input必须要输入明确的数据类型,输入的是什么输出就是什么
 55         (2).编码python2:ascci, python3:utf-8
 56         (3).print()和print
 57     12. 运算
 58         算数运算:+-*/ // % **
 59         比较运算: 只能在同类型之间进行比较,int和float都属于数字类型
 60         赋值运算
 61             增量赋值:类似于a += 1这种形式
 62             链式赋值:类似于a = b = 1这种形式
 63             交叉赋值:类似于x, y = y, x这种形式
 64             解压赋值:类似于a, b, c, d = [1, 2, 3, 4], 多了少了都不行
 65         逻辑运算:判断顺序: 比较运算>not>and>or
 66         身份运算:is比较的是两个变量值的地址,==比较的是两个变量值的值
 67     13. 运行python程序的三个步骤
 68         (1).打开python解释器
 69         (2).将硬盘中的python程序加载到内存中(前两不就和正常的读取文件一样)
 70         (3).检测python语言并执行(这一步才开始正式的读取python的语法)
 71     14. 小整数池
 72         小整数池是python中为了节省内存空间而创建的一种机制,也就是说在一定的数据范围内,无论创建了多少分,使用的都是这一个地址。
 73     15. if判断的四种语法
 74         (1). if 条件:
 75                 code
 76         (2). if 条件:
 77                 code
 78              else:
 79                 code
 80         (3). if 条件:
 81                 code
 82              elif 条件:
 83                 code
 84         (4). if 条件:
 85                 if 条件:
 86                     code
 87     16. 结束while循环的两种方式
 88         (1): 通过条件的更改最终使得进入while循环的条件不满足
 89         (2): 通过break关键字跳出循环
 90     17. while else的用法
 91         格式:
 92             while 条件:
 93                 code1
 94             else:
 95                 code2
 96         当while循环因为条件不满足而正常退出的时候,会执行code2的代码
 97     18. for循环主要用来做什么
 98         python语言中真正的循环只有while一个,也就是说所有的事物都是可以通过while循环去获得值得,for循环主要是用来做循环取值的。
 99     19. 可变类型与不可变类型是按照什么标准划分的
100         通过改变变量的值来看内存地址是否发生改变来划分的。
101         不可变类型: int,float,str,tuple 值变内存地址也变
102         可变类型: list,dict,set 值变内存地址不会发生改变
103     20. 计算机系统分为哪三层
104         (1).应用程序层
105         (2).操作系统层
106         (3).计算机硬件层
107     21. 字符编码
108         人类与计算机打交道用到的都是人类的字符,而计算机只能识别二进制,因此我们需要将人类的字符编码成计算机能够识别的语言,
109         从而实现人机的交互。而字符编码表就是将人类的字符与计算机二进制进行一一对应的关系表。
110         编码和解码
111             我们通过字符编码表将人类的字符转换成计算机能够识别的字符的过程就叫做编码
112             我们通过字符编码表将计算机的二进制代码转换成我们的能够识别的字符的过程叫做解码。
113         存在的一些字符编码表
114             ascii          只能识别英文
115             gbk     1Bytes代表英文, 2Bytes代表中文
116             unicode    全部都是2Bytes
117                 (1).能够兼容万国编码
118                 (3).与各个国家的字符编码都有一一映射关系
119             utf-8     1Bytes代表英文,3Bytes代表中文
120                 它只是unicode的一种转换格式,并不能与各个国家的语言进行一一的映射
121         解决乱码的核心法则
122             用什么编码方式编码的就用什么编码方式进行解码
123         python2默认的编码方式:ascii
124         python3默认的编码方式:utf-8
125         #coding:文件头的两个作用
126             (1):告诉程序员当前程序应该以什么样的编码方式进行存储
127             (2):告诉python解释器在加载当前程序的时候应该以什么样的编码方式进行解码。
128     22. 字符编码的操作核心法则(3条)
129         (1).python2中如果出现中文前面加上u。 eg: a = u'中国'
130         (2).在文件开头要写上 #coding:utf-8
131         (3).python3通过encode编码之后可以得到bytes类型
132     23. 文件
133         文件是操作系统帮我们虚拟出来的一个可以操作计算机硬盘的一个接口。我们可以通过操作系统将对文件的操作转换成对硬盘的操作,
134         从而将应用程序持久化存储起来。
135     24. 文件处理的三个步骤
136         (1).通过关键字open打开系统调用得到一个文件句柄(应用程序的内存资源===>操作系统的内存资源)
137         (2).操作文件(读和写)
138         (3).通过close关闭一个文件句柄,也就是回收操作系统的资源。
139     25. 上下文管理的方式
140         通过with open关键字打开一个文件,从而得到一个文件句柄,我们不再需要去关注什么时候应该关闭掉文件,因为
141         上下文管理会自动帮我们关闭文件,从而回收操作系统资源。
142     26. 操作文件内容的三种纯净模式
143         r: (默认的)只读模式,文件不存在则报错。
144         w:只写模式,文件不存在则创建,存在则清空写入
145         a:只写模式,文件不存在则创建,存在则追加写入
146     27. 控制文件内容格式的两种模式
147         t文本模式:
148             (1).只能针对文本文件
149             (2).读写文件都是以字符串为单位的
150             (3).必须指定encoding
151         b:二进制模式
152             (1).针对所有文件
153             (2).读写文件都是以字节为单位的
154             (3).不能指定encoding
155     28. 文件指针移动的单位是字节还是字符
156         只有在rt模式下移动的是字符,其余的都是字节模式
157     29. 文件是否可以修改?
158         文件准确来说是磁盘的映射,磁盘不能改,文件当然也就不能进行修改。但是我们可以通过以下的方式进行间接的修改
159         方式一: 将磁盘的文件一次性的读入内存中,在内存中修改完成之后再覆盖写入到硬盘空间。
160             优点: 同一时间内硬盘中不会存在两个文件。
161             缺点: 文件太大的时候会占用更多的内存空间。
162         方式二: 以读的方式一行一行的读入到内存中,然后一行行修改重新写入到一个临时文件中,最后将源文件删除,临时文件的名称改成源文件的名称
163             优点: 占用系统内存较少
164             缺点: 同一时间硬盘空间中数据会存在两份。
165     30. 函数
166         函数就是实现某一功能的代码块。通过函数我们可以解决代码冗余的问题,从而提高程序的可扩展性以及可读性。
167     31. 函数的分类(2类)
168         (1).内置函数: Python解释器帮我们编写好的为了实现某种功能的函数,可以不用定义直接进行使用。
169         (2).自定义函数: 自己自定的为了实现某一个功能的函数。
170     32. 使用函数的原则
171         先定义后调用
172     33. 函数的两个明确阶段
173         (1).函数定义阶段
174         (2).函数调用阶段
175     34. 函数定义的三种形式
176         (1).有参函数
177         (2).无参函数
178         (3).空函数
179     35. 函数调用的三种形式
180         (1).语句的形式 func()
181         (2).表达式的形式  res = func() * 12
182         (3).当做参数传递的形式 res = max(max(1, 2), 3)
183     36. return的特点
184         return返回值:
185             (1).没有类型的限制
186             (2).没有个数的限制
187                 <1>返回0个或者没有返回 都是None
188                 <2>返回1个  就是值本身
189                 <3>返回多个 是个元组
190         return结束函数的功能,可以有多个return,但是只会执行一次
191     37. 函数参数的两大类
192         形参(形参又分为哪四类): 在函数定义阶段,括号内定义的参数
193             位置形参: 按照从左到右的顺序依次定义的形参
194                 <1>: 必须传值,不能多不能少
195             默认形参: 按照key=value的形式定义的形参
196                 <1>: 可以传值,也可以不传值
197                 <2>: 默认形参必须在位置形参后面
198                 <3>: 默认形参的值在函数定义阶段就已经固定死了,定义阶段后的改动不会影响该值
199                 <4>: 默认形参的值通常应该是不可变类型
200             可变长形参:
201                 *argv:*会将溢出的位置实参存成元组的形式,然后赋值给*后的argv
202                 **kwargvs: **会将溢出的关键字实存成字典的形式,然后赋值给**后面kwargs
203             命名关键字形参
204         实参(实参又分为哪三类): 在函数调用阶段,括号内定义的参数
205             位置实参
206                 与位置形参一一对应
207             关键字实参
208                 <1>: 关键字实参必须放在位置实参的后面
209                 <2>: 不能重复传值
210             可变实参: 指的是在调用阶段,实参值个数是不固定的,
211     38. 为什么说函数是第一类对象?
212         函数的内存地址可以像一个变量值一样去使用。
213     39. 函数与变量的四种使用方式
214         <1>.赋值
215         <2>.当做参数进行传递
216         <3>.作为返回值返回
217         <4>.可以当做容器类型的参数 应用: 功能字典
218     40. 函数的嵌套定义以及其应用场景
219         函数的嵌套定义: 指的是在一个函数内重新定义多个函数,但是不会进行调用。
220         应用场景: 可以将一系列相关的功能封装到一块提供给用户进行使用。例如: 对于园的一些操作求周长面积等封装到一个函数里面。
221     41. 函数的嵌套调用以及其应用场景
222         函数的嵌套调用: 指的是在一个函数内调用了其他的函数。
223         应用场景: 主要是用来将一个复杂的过程分成好几个函数同时来完成,最后通过一个函数进行封装。
224     42. 什么是名称空间
225         名称空间指的是存放变量名与内存地址绑定关系的地方。
226     43. 名称空间的分类(三类)
227         <1>.内置名称空间
228             解释器启动的时候就会产生,解释器关闭的时候就会销毁
229         <2>.全局名称空间
230             python程序执行的时候产生,Python程序执行完毕之后销毁
231         <3>.局部名称空间
232             函数调用时临时产生,函数调用完毕之后则销毁
233     44. 名称空间的产生顺序
234         内置名称空间---> 全局名称空间_---> 局部名称空间
235     45. 名称空间的销毁顺序
236         局部名称空间---> 全局名称空间_---> 内置名称空间
237     46. 什么是作用域
238         作用域指的是变量名的作用范围
239     47. 作用域的分类(两种)
240         全局作用域: 包含了全局和内置名称空间的名字
241             全局存活,全局有效
242         局部作用域: 包含了局部命名空间的名字
243             临时存活,局部有效
244     48. 作用域关系的核心要义(一句话)
245         作用域关系在函数定义阶段已经定义死了,与函数调用无关。
246     49. 什么是闭包函数
247         在函数内部定义了一个函数,该函数又包含了对外层函数名字的引用。
248     50. 为函数体传值的两种方式(分别的特点)
249         (1). 通过参数进行传值    每次调用都要进行传值
250         (2). 通过闭包函数进行传值   可以传一次得到一个返回值,之后直接调用返回值就可以,在某些方面可以简化用户的操作
251     51. 什么是装饰器
252         为原函数增加新的功能的工具就是装饰器。我们可以通过装饰器在不修改功能源代码以及其调用方式的情况下为原函数增加新的功能。
253         加载装饰器就是将原函数名偷梁换柱成了装饰器最内层那个wrapper函数
254         # 在加载完毕后,调用原函数其实就是在调用wrapper函数
255     52. 装饰器的分类(两大类)
256         <1>有参装饰器
257         <2>无参装饰器
258     53. 什么是语法糖
259         语法糖(syntactic sugar)是指编程语言中可以更容易的表达一个操作的语法,它可以使程序员更加容易去使用这门语言:
260         操作可以变得更加清晰、方便,或者更加符合程序员的编程习惯
261     54. 装饰器的语法糖
262         @装饰器的名字:要在被装饰对象正上方单独一行写上
263     55. 有参装饰器的模板
264         def outter2(x,y,z):
265             def outter(func):
266                 def wrapper(*args,**kwargs):
267                     res=func(*args,**kwargs)
268                     return res
269                 return wrapper
270             return outter
271     56. 无参装饰器的模板
272         def outter(func):
273             def wrapper(*args,**kwargs):
274                 res=func(*args,**kwargs)
275                 return res
276             return wrapper
277     57. 叠加装饰器的加载顺序
278         自下而上
279     58. 叠加装饰器的执行顺序
280         自上而下
281     59. 什么是迭代器
282         迭代器就是一个迭代取值的工具,该工具的特点就是可以不依赖索引取值。
283     60. 迭代器的两个优点
284         <1>.提供了一种通用的不依赖索引的迭代取值方式
285         <2>.同一时刻在内存中只有一个值,更加节省内存
286     61. 迭代器的两个缺点
287         <1>.没有索引取值灵活,并且迭代器是一次性的
288         <2>.无法预知迭代器数据的个数
289     62. 什么是可迭代对象
290         但凡是有__iter__方法的都是可迭代对象,调用可迭代对象的__iter__方法可以得到一个迭代器对象。
291     63. 什么是迭代器对象
292         有__iter__和__next__方法的都是迭代器对象,调用迭代器对象的__iter__方法会得到它本身
293     64. python中的可迭代对象有哪些(6个)
294         list, tuple, dict, set, 文件对象, str
295     65. python中的迭代器对象有哪些(1个)
296         文件对象
297     66. for循环本质上是个迭代器循环,原理是什么(3步)
298         <1>.会调用对象__iter__将迭代器对象或者可迭代对象转换成迭代器对象
299         <2>.调用迭代器对象的__next__方法取值并且赋值给变量,运行循环体代码
300         <3>.循环往复,直到迭代器取值完毕之后抛出异常然后捕捉异常自动结束循环
301     67. 什么是生成器
302         生成器本质上就是一种迭代器,不过它是程序员自己通过yield关键字创建出来的一种迭代器对象。
303     68. python中提供生成器的关键字
304         yield,一旦函数中包含yield关键字,当我们去执行此函数的时候,就不会立刻的运行函数体代码了,会得到一个返回值,
305         该返回值就是一个生成器对象。
306     69. 三元表达式
307         a = x if x > y else y
308     70. 列表生成式
309         l = [i ** 2 for i in range(9) if i > 5]
310     71. 生成器表达式
311         c = (i**2 for i in range(3))
312     72. 字典生成式
313         d = {k:v for k,v in dd if k != 'sex'}
314     73. 什么是匿名函数
315         顾名思义: 没有名字的函数就是匿名函数。有些功能我们使用一次就不在使用了,所以我们需要匿名函数。
316     74. 匿名函数的应用场景(2个)
317         <1>.用在一些内置函数中当做参数, 例如: max,min,sorted,filter,reduce,map
318         <2>.
319     75. 什么是函数递归
320         函数的递归就是函数嵌套调用的一种特殊用法,特殊在调用一个函数的过程中又直接或者间接地调用了该函数本身。我们可以通过
321         在某些条件下使用递归要比使用while循环更加的简单。
322     76. 递归要满足的两个原则
323         <1>.每进入下一层递归,函数的规模都应该有所减少
324         <2>.递归必须有一个明确的结束条件或者说有一个明确的进入下一层递归的条件
325     77. 递归的两个明确的阶段
326         <1>.回溯:一层一层地递归调用下去
327         <2>.递推:在某一层结束掉递归,然后一层一层返回。
328     78. 什么是面向过程编程
329         面向过程的核心在过程二字,基于该思想写程序脑子里应该始终思考过程二字,就好比设计一个流水线,是一种机械式的思维方式
330     79. 面向过程编程的优点和缺点
331         优点: 将复杂的问题流程化,进而简单化
332         缺点: 扩展性差
333     80. 什么是面向对象编程
334         面向对象的核心在对象二字,基于该思想写程序就像是在创造一个世界,世界里的一切都是对象,是一种上帝式的思维方式。
335     81. 面向对象编程的优点和缺点
336         优点:扩展性强
337         缺点: 编程较为复杂
338     82. 什么是模块
339         模块就是一组功能的集合,本质上就是一个py文件。
340     83. 模块的作用
341         让我们可以从文件级别去管理我们的代码。可以提高我们程序的可维护性与可读性。
342     84. 模块的分类(4类)
343         <1>.内置模块
344         <2>.自定义模块
345         <3>.包
346         <4>编译为DLL的c或者C++
347     85. 模块导入的两种方式,区别是什么
348         <1>.import导入
349         <2>.from ... import导入
350     86. import导入模块的三个步骤
351         <1>.在当前模块中创建一个名称空间
352         <2>.执行模块中的代码,将名称和地址的对应关系存储到名称空间中
353         <3>.在执行文件中产生一个新的名称指向被导入的名称空间
354     87. import导入的三种语法
355         <1>. import 模块名
356         <2>. import 模块名1, 模块名2
357         <2>. import 模块名 as mmm
358     88. from导入模块的三个步骤
359         <1>.在当前模块中创建一个名称空间
360         <2>.执行模块中的代码,将名称和地址的对应关系存储到名称空间中
361         <3>.复制被导入模块中的名称到当前名称空间中,之后可以直接进行使用
362     89. from导入模块的三种语法
363         <1> from 模块 import 变量
364         <2> from 模块 import 变量1, 变量2
365         <3> from 模块 import 变量1 as mmm
366         <4> from 模块 import *
367     90. 模块的搜索顺序
368         内置模块--->内存中已经加载的模块--->sys.path中已经存在的模块
369     91. 什么是包
370         包是一堆模块的集合。
371     92. __init__文件是干什么用的
372         导入该包内的所有模块,用户使用起来较为简单,无需关系包内的东西,只需要导入__init__就可以使用包内的所有模块。
373     93. __init__文件应该包含哪些内容
374         仅仅只是用于导入包内的模块,不应该包含任何的业务逻辑。
375     94. 包的作用
376         我们可以从文件夹的级别去管理我们的代码。提高可读性与维护性。
377     95. 相对导入和绝对导入
378         相对导入:相对于被导入模块的路径, .表示当前目录   ..当前往上一级目录
379         绝对导入:从sys.path开始的完整路径称之为绝对导入
380     96. 相对路径和绝对路径
381     97. 文件的两种执行方式,区别是什么?
382         <1>.直接通过python解释器调用执行, __name__的值为__main__
383         <2>.通过模块的导入执行的, __name__的值为模块名
384         区别在于__name__的值不一样
385     98. 什么是对象
386         对象是特征与技能的结合体。
387     99. 什么是类,面向对象编程为什么要有类
388         类是一系列对象的相同特征与技能的结合体。在现实世界中是先有对象才有类的,但是在程序中,是先有类,才有对象的。
389     100. 什么叫做面向对象是更高程度的一种封装
390         将一系列的特征与技能封装到一个对象上面,只需要将对象给你,你就可以得到对象的特征和技能。
391     101. 类的两种用途
392         <1>.类本质上就是一个名称空间,我们可以通过类对名称空间进行增删改查
393         <2>.用来创建对象,
394             (1).创建一个空对象
395             (2).创建对象的过程会自动的调用__init__方法,然后将对象本身作为第一个参数传递进去。
396     102. __init__方法在什么时候会被触发
397         在创建对象的时候会被自动的触发,并把空对象作为第一个参数传递给类。
398     103. python3中类与类型是一个概念吗
399         python3中统一了类与类型的概念
400     104. 什么是继承
401         子类可以重用父类的属性就叫做继承,它描述的是一种遗传的关系。我们可以通过继承来减少代码之间的冗余。
402     105. 什么是组合
403         一个对象的属性来自于另外一个对象的现象就称之为组合,也是为了减少类与类之间代码的冗余。
404     106. 什么是多态
405         描述的是一种事物的多种形态,在代码中主要为了统一标准。我们可以在不考虑对象的类型的情况下直接去使用对象下的方法。
406     107. 什么是封装
407         将类的数据属性进行隐藏的一种过程,这种隐藏并不是单纯的隐藏,是对内不对外的。
408     108. 继承分为哪两类, 区别是什么
409         <1>.单继承
410         <2>.多继承
411     109. 类分为哪两类, 区别是什么
412         <1>.新式类: 继承了object类的子类,以及子类的子类...都称为新式类。
413         <2>.经典类: 没有继承object类的子类,以及子类的子类...都称之为经典类。
414         在python2中才会区分新式类和经典类,python3中默认都是继承object类的新式类
415 
416     110. 重用父类功能的两种方式, 分别有什么特点
417         <1>.指名道姓的访问某个类中的问题,与继承无关。
418         <2>.通过super(父类,self)方法去调用父类中的__init__方法,严格依照继承的关系
419             调用super方法会得到一个特殊的对象,该对象是专门用来访问父类中的属性的,super会严格按照mro列表进行查找。
420     111. 单继承背景下属性的查找顺序
421         对象--->子类---->父类--->object类
422     112. 多继承背景下属性的查找顺序(两类)
423         菱形继承
424             新式类:会从左到右,当左右的分支都查找不到的时候才会去查找聚合点
425             经典类:会从左到右,但是在第一个分支的时候就会把聚合点给查找
426         非菱形继承
427             从左到右依次查找,一个分支查找完成之后才会查找另一个分支
428     113. 封装的特点是什么?
429         封装不是单纯意义上的隐藏,对外不对内的。
430     114. 封装数据属性的目的
431         将数据属性封装起来,类外部的使用就无法直接操作该数据属性了
432         需要类内部开一个接口给使用者,类的设计者可以在接口之上附加任意逻辑,从而严格
433         控制使用者对属性的操作
434     115. 封装函数属性的目的
435         隔离复杂度
436     116. 隐藏的__开头的属性有哪些特点(4个)
437         (1). 只是一种语法意义上的变形,即__开头的属性会在检测语法时发生变形_类名__属性名
438         (2). 这种隐藏式对外不对内的,因为在类内部检测语法时所有的代码统一都发生的变形
439         (3). 这种变形只在检测语法时发生一次,在类定义之后新增的__开头的属性并不会发生变形
440         (4). 如果父类不想让子类覆盖自己的属性,可以在属性前加__开头
441     117. property装饰器主要是用来解决什么问题的
442         有一些属性会跟随数据属性变化而变化,因此我们要把它设计成方法属性,为了让用户使用的时候像使用数据属性一样的,我们就需要在
443         方法上面加上@property
444     118. 什么是绑定方法与非绑定方法
445         绑定方法:
446             绑定对象的方法
447             绑定类的方法
448         非绑定方法: 就像正常的函数一样
449     119. classmethod装饰器是用来绑定什么的
450         绑定类的
451     120. staticmethod装饰器是用来绑定什么的
452         绑定对象的
453     121. 什么是反射?
454         反射就是想通过字符串的形式来对对象的属性进行增删查改
455     122. 反射的四个方法(增删改查)
456         hashattr(obj, 'name')
457         setattr(obj, 'name', 'egon')
458         delattr(obj, 'name')
459         getattr(obj, 'name')
460 
461 组件
462     is              比较的是两个地址
463     ==              比较的两个变量的值
464     id              打印出来的是变量的内存地址信息
465     input           python中交互关键字
466     global          全局变量
467     nonlocal
468     __all__         在模块的导入过程中,我们可以通过__all__来控制外部可以使用此模块的哪些内容
469     __name__        执行文件的两种方式会导致__name__的值不一样, 直接执行__name__==__main__,导入模块执行会__name__等于模块名
470     sys.modules     当前内存中加载的模块名称mdcmd,是字典的形式
471     sys.path        当前的系统路径,不是内置模块,内存中也不存在此模块的时候,就会按照顺序到sys.path这个列表中去查询
472     __init__方法     在类中出现的,当创建对象的时候会自动的调用此方法,并把创建的空对象当做第一个参数传递进去
473     __init__文件     在包中出现的,用来导入包内的其他模块。在导入包的时候其实执行的__init__模块
474     __dict__        对象或者类去查看名称空间用的,是一个字典
475     __file__        当前文件的绝对路径,(win中也就是从盘符开始的路径)
476     super函数        目前学到的只是继承父类的属性的时候用到的,super(父类名,self).方法名, 会给我们返回一个特殊的对象,按照mro列表中的顺序进行属性查找的。
477     __str__         在类中创建一个__str__方法, 一定要有返回值,否则会报错,这样直接print(对象)的时候会给我们打印返回的值
478     __del__         在类中创建一个__del__方法,在方法中删除系统资源,代表在对象被删除的时候会给我们自动的删除没有被回收的系统资源
479     continue:       不执行当前continue之后的代码, 直接进入下一次循环, 不应该将continue作为最后一步执行的代码
480     break           跳出当前循环
481     while...else    不是因为break而跳出循环的时候就会执行else的代码
482     a, b, *_ = [1, 2, 3, 4]      在解压赋值的时候,如果我们不想要后面的一些值就需要以这样的方式来书写
483     __iter__        在迭代器和可迭代对象的时候学习的,使用此方法之后会把可迭代对象转换成迭代器对象
484     __next__        具有此方法的对象都是迭代器对象,我们可以通过这个方法获得迭代器对象的值
485     lambda          匿名函数   lambda  参数一, 参数二: 表达式   返回值就是表达式的值
486 
487 
488 数据类型
489     进制之间的转换问题:
490         hex(256)    十进制转成十六进制      将十六进制转成十进制int('0x100', 16)
491         oct(256)    十进制转成八进制        将八进制转成十进制int('0o400', 8)
492         bin(256)    十进制转成二进制        将二进制转成十进制int('0b100', 2)
493     int
494         int()       没有参数就返回0
495         int(0.7)    是浮点就省略后面的值
496         int('1')    字符串转换只能是里面只能是整形
497     float
498         float()     没有参数返回0.0
499         float('1')
500         float('1.1')    字符串可以带有小数点
501     str 任何类型都是可以转换成字符串类型的
502         strip()             去除两边的特定字符,可以去除多个字符'abcdefabc'.strip('abc')===》'def'
503         split()             以特定的字符分割字符串s.split('*', 2)  # 从左往右以*为分割点分割两次
504         join()              将列表,元祖,字典转换成str的方法,拼接的值里面必须是字符串类型的,否则会报错
505         endswith        以什么结尾
506         startswith      以什么开始
507         upper           全部变成大写
508         lower           全部变成小写
509         replace         参数一为旧值,参数二为新值,参数三为替换的次数,默认是全部
510         find, index     找对应的索引,index找不到报错,find找不到返回-1,找到的时候返回索引的位置
511         rfind, rindex   其实就是找最后一个的索引位置
512 
513         不常用的方法:
514             captilize   第一个字符大写  '*ab'.capitalize()===》'Ab'
515             title       每个单词首字母大写  'abc*ab'.title()===》'Abc*Ab'
516             swapcase    大小写反转
517 
518             center()    第一个参数是个数,第二个参数是字符
519             ljust       s.ljust(10, '*')====>hello*****
520             rjust       s.rjust(10, '*')====>*****hello
521             zfill       在字符串左边 填充0
522     list 任何可迭代类型的数据都可以被转换成列表
523         修改的方法
524             增: append,insert, extend
525                 append 把一个整体添加到列表的最后面
526                 insert 把一个数据整体的添加到索引的位置上面,第一个参数是索引,第二个参数是数据
527                 extend 把可迭代类型的数据一个一个的添加到列表的最后面
528             删: pop, remove
529                 pop    根据索引删除值并且将删除的值返回回去
530                 remove  根据列表的内容删除一个值,没有则报错
531         index,count
532             index 根据索引找到对应的值,找不到则报错
533             count 计算当前值出现的次数
534         copy,clear
535             copy  复制一个相同的列表
536             clear 清空当前列表
537         sort, reverse
538             sort 排序默认是升序,当参数reverse=True的时候就是倒序,排序的列表中必须全部是数字或者字母,否则会报错
539             reverse 反转
540     dict 只能转换如下类型[('name', 'hu'), ('age', 18)], 字典的key必须是不可变类型
541         python2和python3在处理字典的时候会返回不一样的值,python3会返回一个迭代器,而python2直接会把值给返回出来
542         copy,clear
543             copy  复制一个相同的字典
544             clear 清空当前字典
545         get     如果字典中不存在key,不会报错,会返回一个None. a.get('sex')
546         pop     根据key去删除字典的值,并且会把删除key对应的value返回回来, key不存在就报错
547         popitem     随机的删除一个键值对,并把键值对以元祖的形式返回回来,如果key不存在则报错
548         update      和列表的extend很相似,原字典中有这个key直接更新,没有就添加
549         fromkeys
550             #fromkeys可以通过已经给定的key快速的创建一个初始化的字典
551             res1 = {}.fromkeys('str', None)
552             res2 = {}.fromkeys(['name', 'age', 'sex'], None)
553             print(res1)
554             print(res2)
555             # 结果
556             # {'s': None, 't': None, 'r': None}
557             # {'name': None, 'age': None, 'sex': None}
558         setdefault
559             # setdefault有两个参数,第一个参数是key,如果key在原字典中存在,则直接返回原字典对应的key的值
560             # 如果原字典中key不存在,则添加key到原字典中,value的值为第二个参数,并且返回第二个参数
561             a = {'name': 'hu', 'age': 18}
562             res = a.setdefault('sex', None)
563             print(a, res)
564 
565             # 结果:
566             # {'name': 'hu', 'age': 18, 'sex': None} None
567     tuple
568         index   寻找值所对应的索引,找不到则报错
569         count   寻找值出现的次数
570     set 值必须是不可变类型, 集合是无序不重复的
571         集合运算
572             交集          【&】符号代表交集
573             并集          【|】符号代表并集
574             差集          【-】符号代表差集,有顺序之分print(linuxs - pythons)  # 在linux中但是不在python中
575             对称差集        【^】符号代表对称差集
576             父子           【>=】父子关系
577         集合方法
578             add         添加值如果存在,就不变
579             pop         随机删除一个,并把结果返回
580             remove      删除元素,元素不存在就报错
581             discard     元素如果存在就删除,不存在就不变
582             update      将一个集合更新到一个集合中,如果有则不变,没有则添加
583             isdisjoint  如果两个集合灭有交集,返回True
584 文件操作的方法
585     1. 不需要参数
586         readable        查看当前文件句柄是否可读
587         writeable       查看当前文件句柄是否可写
588         tell            查看当前指针距离文件头的字节个数
589         close           关闭当前文件
590         flush           将当前缓冲区的内容刷新到文件中
591 
592         fileno
593         isatty
594     2. 需要一个参数(只有在rt模式下读取的才是字符)
595         read            默认读取文件内的所有内容,传入一个参数代表读出几个字节的
596         readline        读取当前指针所在行的值,传递的参数代表的是读取几个字节
597         readlines       把每一行的值转换成bytes类型,最后返回一个列表
598         write           将内容写入到文件中
599         writelines
600             # 下面这两种方法是一样的
601             for i in line:
602                 f.write(i)
603             f.writelines(line)
604     3. 需要两个参数
605         seek    第一个参数代表移动的字节数,第二个参数0代表开头,1代表当前位置,2代表文件末尾
606 内置函数(64个,目前只是写了自己还不是很熟悉的)
607     max         求最大值, res = max(salaries, key=lambda key: salaries[key]), key是比较标准
608     min         求最小值,
609     sorted      从大到小顺序排列   sorted(salaries, key=lambda key: salaries[key], reverse=True)
610 
611 
612     filter      过滤 res = filter(lambda item: not item.endswith('_dsb'), test) 如果不是以_dsb结尾的就保留下来,返回一个迭代器
613                 它不能向map和reduce一样对数据进行修改, 应用想去掉列表中的某个值x
614     reduce      reduce需要导入才能进行使用
615                 # 求1-100的和
616                 # 这第三个参数是初始值,如果没有,则会从迭代对象中找到一个值赋值给它
617                 from functools import reduce
618                 res = reduce(lambda x, y: x + y, range(100), 100)
619                 print(res, type(res))
620 
621                 # 拼接字符串
622                 test = ['yuanhao_dsb', 'egon_dsb', 'wupeiqi_dsb', 'alex_dsb', 'egon']
623                 from functools import reduce
624                 res = reduce(lambda x, y: x + y, test, '10000')
625                 print(res, type(res))
626                 应用在拼接字符串或者是数字的叠加过程
627     map         映射  res = map(lambda item: item + '_dsb', lists)将lists的每个参数传递给item进行映射之后返回一个迭代器
628                 应用在对某一类值进行修改
629     sum     sum就是单纯的求和
630     round    对浮点数进行四舍五入取值
631     power   返回幂运算值或者与其指定的数值的模
632     divmod  返回两个数值的商和余数
633     dir    返回对象或者当前作用域内的属性列表
634     ascii  返回对象的可打印表字符串表现方式
635     vars  返回当前作用域内的局部变量和其值组成的字典,或者返回对象的属性列表
636     all   判断可迭代对象每个元素是否都是True
637     any  判断可迭代对象中是否又True的元素
638     zip   聚合传入的每个迭代器中的相同位置的元素,返回一个新的元祖类型迭代器
639     reversed   反转序列生成新的可迭代对象
640     bytearray    根据传入的参数创建一个新的字节数组
641     bytes     根据传入的参数创建一个新的不可变字节数组
642     memoryview  根据传入的参数创建一个新的内存查看对象
643     frozenset  根据传入的参数创建一个新的不可变集合
644 
645     enumerate   根据可迭代对象创建枚举对象
646     slice   根据传入的参数创建一个切片对象
647     super   根据传入的参数创建一个新的子类和父类的关系的代理对象
648     object  创建一个新的object对象
649 
650 常用模块(14个)
651     time
652         time.time()  1539593357.4160235
653         time.localtime()  做为一种中间格式用来转换不同的时间格式
654         time.strftime('%Y-%m-%d %X')   '2018-10-15 16:57:24'
655         time.asctime()      'Mon Oct 15 18:23:37 2018'
656         time.ctime()    'Mon Oct 15 18:23:44 2018'
657 
658         time.asctime(b)   # 通过asctime把结构化时间转换成固定的外国人接受的时间
659         time.ctime(a)  # 通过ctime将时间戳转换成外国人能够接受的时间
660 
661     datetime
662         datetime.datetime.now()    获取当前时间       2018-10-15 18:40:17.028194
663         datetime.datetime.fromtimestamp(time.time())  将时间戳转换成对应的时间
664         datetime.datetime.now() + datetime.timedelta(hours=3) 将当前时间加上三个小时
665 
666         c_time.replace(month=11, year=2020, minute=10)  替换c_time的时间
667     sys
668         1. sys.argv    # 这个是传入的参数,返回的是列表的形式,第一个是当前执行文件的名称
669         2. sys.path   # 系统的环境变量,可以通过append方法进行更改
670         3. sys.modules  # 内存已经加载的模块,以字典的形式存在
671         4. sys.version  # 解释器的版本
672         5. sys.platform   # 当前执行的平台
673         6. sys.exit()    # 退出当前执行的python解释器
674 
675         # 了解
676         7. sys.api_version   # api版本号
677         8. sys.maxsize  # 最大值得整数32位为 2 ** 32 - 1 64位为2 ** 64 -1
678         9. sys.maxunicode   # 最大的unicode  0x10FFFF
679     os
680         1. 目录操作
681 682                 os.mkdir     创建一个单级目录
683                 os.makedirs  创建多级目录,递归创建
684 685                 os.rmdir     删除一个目录
686                 os.removedirs  递归删除目录,如果目录为空
687 688                 chdir       改变当前目录
689                 pardir      当前执行目录的父目录
690                 curdir      当前执行文件的目录
691 692                 getcwd()    获得当前解释器执行文件目录
693                 listdir()   以列表的形式返回当前目录下面有什么内容
694         2. 文件操作
695 696                 os.remove()   删除文件
697 698                 os.rename()   修改文件名称
699 700                 os.stat        查看当前文件的状态信息
701                 os.path.getsize()   查看当前文件的大小
702                 os.path.getatime()   查看当前文件的创建时间
703                 os.path.getmtime()   查看当前文件的修改时间
704         3. 变量信息
705             os.stat     # 文件的状态信息
706             os.name     # win是‘nt’, linux平台是'posix'
707             os.sep      # 操作系统特定的路径分隔符
708             os.linesep  # 换行符win为'\t\n', linux为'\t'
709             os.pathsep  # 分割文件路径的字符串win为;, linux为:
710             os.environ  # 系统环境变量
711             os.system() # 运行shell命令,直接显示
712         4. 路径的判断
713             os.path.exists()   # 判断路径是否存在
714             os.path.isfile()   # 判断是否是个文件
715             os.path.isdir()    # 判断是否是个目录
716             os.path.join()     # 拼接路径
717         5. 路径操作
718             os.path.split()  # 以列表的形式返回文件名和目录
719             os.path.basename # 获得得就是split的文件名
720             os.path.dirname  # 获得得就是split的目录
721         5. 规范化路径
722             os.path.normcase()  # 将大写变小写,并将所有斜杠转成反斜杠(返回的是原字符串)
723             os.path.normpath()  # 会把反斜杠转换成斜杠,然后可以识别相对路径
724             os.path.abspath()   # 返回path规范化的绝对路径
725     random
726         random.random()   # 得到一个(0-1)之间的浮点数
727         random.uniform(1, 3)  # 得到一个(1, 3)之间的一个小数
728 
729         random.randint(1, 3)  # 得到一个[1, 3]之间的整数
730         random.randrange(1, 3)   # 得到一个[1, 3)之间的一个整数
731 
732         random.choice([1, '23', [4, 5]])  # 获得列表中的一个值
733         random.choices([1, '23', [4, 5]], k=2)   # 获得列表中的两个值返回一个列表
734         random.sample([1, '23', [4, 5]], k=2)  # 列表元素任意2个组合
735 
736         # 打乱顺序
737         l = [1,2,3,4,5]
738         random.shuffle(l) # 传递的必须是一个列表
739     hashlib
740         password = hashlib.md5('123'.encode('utf-8'))
741         password.update(''.encode('utf-8')
742         password.hexdigest()
743 
744     json, pickle
745         f.write(pickle.dumps(user))
746         pickle.dump(user, f)
747         pickle.load(f)
748         res = pickle.loads(f.read())
749     shelve
750         import shelve
751         # shelve只有一个open函数
752         # 打开文件,文件可以存在也可以不存在,
753         f = shelve.open(r'shelve.txt', writeback=True)
754         # 在关闭之前可读可写参数writeback=True代表的是否可以进行修改
755         # f['user'] = {'name': 'hu'}
756         print(f['user'])
757         f['user']['sex'] = 'male'
758         f.close()
759     shutil
760         文件处理:
761             shutil.copyfileobj  传入的是两个对象,源文件,目的文件
762             shutil.copyfile     传入的是两个路径,原路径,目的路径
763             shutil.copymode     只复制文件的权限,目的恩瑾可定是要存在
764             shutil.copystat     只复制文件的状态信息,修改时间,查看时间,更改时间,flag是
765             shutil.copy         拷贝文件和权限
766             shutil.copy2        拷贝文件和状态信息
767             shutil.move()       更改文件名称
768         文件夹处理
769             shutil.copytree     拷贝目录
770             shutil.ignore_patterns  根据这个模块去设置是否不拷贝某个类型的文件
771             shutil.rmtree       删除目录
772         压缩包处理
773             shutil.make_archive()    压缩后的目录名称,格式,源目录
774             shutile.unpack_archive() 压缩后的目录名称, 格式,解压后的目录
775 
776             tarfile.open().add()
777             zipfile.ZipFile().write()
778     xml
779         import xml.etree.ElementTree as ET
780         tree = ET.parse('xml文件名称')
781         root = tree.getroot()
782         .......一系列的标签查找与替换操作
783 
784         root.iter('标签名称')
785         root.find('标签名称')
786         root.findall('标签名称')
787 
788         node.text     标签内容
789         node.attrib    标签属性
790         node.tag        标签名
791 
792         node.set('属性名', '属性值')
793 
794         tree.write('xml文件名称')
795 
796     configparser开始的标准写法
797 
798         import configparser
799         config = configparser.ConfigParsesr()
800         config.read('a.txt', encoding='utf-8')
801         .....一系列检查修改操作之后
802 
803         config.sections()
804         config.get('某个分区', '某个key')
805         config.set('某个分区', '某个key', 'value')
806         config.has_section('某个分区')
807         config.has_option('某个分区''key')
808 
809         config.write(open('conf.cfg', 'wt', encoding='utf-8'))
810 
811     logging  日志模块的使用方法
812         import logging.config
813         logger = logging.config.dictConfig(config=配置文件里面的配置字典)
814         return logging.getLogger('日志生成器的名称')
815     re
816         位置匹配
817             \A 开头
818             \Z 结尾
819             ^  开头
820             $  结尾
821         范围匹配
822             \d   数字   (\D相反是非数字)
823             \w   数字字母下划线  (\W相反)
824             \s   空字符(\t\n\f\b) (\s相反)
825             [...]   手动指定范围,ascii码表返回
826             [^...]  指定范围以外的内容
827         重复匹配
828             *   0次或者多次
829             +   一次或者多次
830             ?   0次或者一次     非贪婪模式
831             {n} 精确匹配前面n个表达式
832             {n, m} 匹配n到m次由前面的正则表达式定义的片段,贪婪模式
833 
834         分组
835             ()括号内的表达式是一个分组
836     subprocess
837         cmd = 'dir H:\python_study\day23'
838         find = 'findstr "py"'
839 
840         sub1 = subprocess.Popen(cmd,
841                                 stdout=subprocess.PIPE,
842                                 shell=True,)
843         # 把sub1的标准输出输入到sub2的输入中
844         sub2 = subprocess.Popen(find,
845                                 stdout=subprocess.PIPE,
846                                 stdin=sub1.stdout)
847 
848         print(sub2.stdout.read().decode('gbk'))
849 小工具
850     cp拷贝文件
851     递归实现二分法的过程
852     递归实现冒泡排序的过程
853 
854 logging的常用配置文件内容
855     """日志配置文件内容"""
856     from conf import settings
857     import os
858     # from lib.common import get_config_module
859 
860     STANDARD_FORMAT = '%(asctime)s %(name)s %(funcName)s %(module)s %(message)s'
861     SIMPLE_FORMAT = '%(asctime)s %(module)s %(message)s'
862     COMPLETE_FORMAT = '%(asctime)s %(name)s %(funcName)s %(lineon)s %(module)s %(message)s'
863 
864     # 拼接日志文件存储路径
865     LOGFILE_PATH = os.path.join(settings.LOG_DIR, 'atm_log', 'atm.log')
866     USER_LOGFILE_PATH = os.path.join(settings.LOG_DIR, 'usr_log', 'usr_log')
867 
868 
869     # print(LOGFILE_PATH, USER_LOGFILE_PATH)
870     # 这个就是之前通过手工的方式创建的四个日志核心组件
871     LOGGING_DIC = {
872         # 日志字典的版本,这个自己设置的
873         'version': 1,
874         # 日志格式定义字段,通过一定格式的字符串进行创建
875         'formatters': {
876             # 定义了日志的表示格式标准格式,简单格式和完整格式
877             'standard': {
878                 'format': STANDARD_FORMAT
879             },
880             # 简单格式
881             'simple': {
882                 'format': SIMPLE_FORMAT
883             },
884             # 完整格式
885             "complete":{
886                 "format": COMPLETE_FORMAT
887             }
888         },
889         # 日志过滤器,暂时设置成空
890         'filters': {},
891         # 日志处理器
892         'handlers': {
893             # 定义了两种日志处理器
894             # 把日志内容打印到终端
895             'console': {
896                 'level': 'DEBUG',  # 日志级别
897                 'class': 'logging.StreamHandler',  # 日志流处理器
898                 'formatter': 'simple'   # 使用的打印格式是上面设置的simple
899             },
900             'default': {
901                 'level': 'DEBUG',
902                 'class': 'logging.handlers.RotatingFileHandler',   # 设置文件通过一定大小之后就换文件
903                 'formatter': 'standard',  # 写入文件的格式是上面定义的标准格式
904                 'filename': LOGFILE_PATH,  # 写入文件的路径
905                 'maxBytes': 1024 * 1024 * 5,  # 日志文件的最大大小为5M 超出后 换文件
906                 'backupCount': 5,   # 最多留五个日志文件
907                 'encoding': 'utf-8',     # 写入的时候编码方式
908             },
909             'user_stream': {
910                 'level': 'DEBUG',
911                 'class': 'logging.handlers.RotatingFileHandler',  # 设置文件通过一定大小之后就换文件
912                 'formatter': 'standard',  # 写入文件的格式是上面定义的标准格式
913                 'filename': USER_LOGFILE_PATH,  # 写入文件的路径
914                 'maxBytes': 1024 * 1024 * 5,  # 日志文件的最大大小为5M 超出后 换文件
915                 'backupCount': 5,  # 最多留五个日志文件
916                 'encoding': 'utf-8',  # 写入的时候编码方式
917             },
918         },
919         # 日志生成器
920         'loggers': {
921             # 在getLogger的时候  如果指定的名称 不存在 或者不给名称 用的就是默认的
922             # 在这里如果key为空 它就是默认的
923             # 你可以自己定义生成器的名称 并且他们还能使用相同的默认配置
924             '': {
925                 'handlers': ['default'],
926                 'level': 'DEBUG',
927                 'propagate': False,
928             },
929             # 在getLogger的时候  如果指定的名称 不存在 或者不给名称 用的就是默认的
930             # 在这里如果key为空 它就是默认的
931             # 你可以自己定义生成器的名称 并且他们还能使用相同的默认配置
932             'user_log': {
933                 'handlers': ['user_stream', 'console'],
934                 'level': 'DEBUG',
935                 'propagate': False,
936             },
937         },
938 
939     }
940 format参数中可能用到的格式化串:
941     %(name)s Logger的名字
942     %(levelno)s 数字形式的日志级别
943     %(levelname)s 文本形式的日志级别
944     %(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
945     %(filename)s 调用日志输出函数的模块的文件名
946     %(module)s 调用日志输出函数的模块名
947     %(funcName)s 调用日志输出函数的函数名
948     %(lineno)d 调用日志输出函数的语句所在的代码行
949     %(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
950     %(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
951     %(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
952     %(thread)d 线程ID。可能没有
953     %(threadName)s 线程名。可能没有
954     %(process)d 进程ID。可能没有
955     %(message)s用户输出的消息
956 
957 时间中可能用到的格式化字符串
958     %a    Locale’s abbreviated weekday name.
959     %A    Locale’s full weekday name.
960     %b    Locale’s abbreviated month name.
961     %B    Locale’s full month name.
962     %c    Locale’s appropriate date and time representation.
963     %d    Day of the month as a decimal number [01,31].
964     %H    Hour (24-hour clock) as a decimal number [00,23].
965     %I    Hour (12-hour clock) as a decimal number [01,12].
966     %j    Day of the year as a decimal number [001,366].
967     %m    Month as a decimal number [01,12].
968     %M    Minute as a decimal number [00,59].
969     %p    Locale’s equivalent of either AM or PM.    (1)
970     %S    Second as a decimal number [00,61].    (2)
971     %U    Week number of the year (Sunday as the first day of the week) as a decimal number [00,53]. All days in a new year preceding the first Sunday are considered to be in week 0.    (3)
972     %w    Weekday as a decimal number [0(Sunday),6].
973     %W    Week number of the year (Monday as the first day of the week) as a decimal number [00,53]. All days in a new year preceding the first Monday are considered to be in week 0.    (3)
974     %x    Locale’s appropriate date representation.
975     %X    Locale’s appropriate time representation.
976     %y    Year without century as a decimal number [00,99].
977     %Y    Year with century as a decimal number.
978     %z    Time zone offset indicating a positive or negative time difference from UTC/GMT of the form +HHMM or -HHMM, where H represents decimal hour digits and M represents decimal minute digits [-23:59, +23:59].
979     %Z    Time zone name (no characters if no time zone exists).
980     %%    A literal '%' character.
知识总结

分割线-----------------------------------------------------------------------下面都是没有带答案的

一. 概念题

1. 编程
    2. cpu, 内存,硬盘
    3. 运行程序,硬件的工作过程
    4. 进制之间的转换
    5. 操作系统
    6. 编程语言的分类
        机器语言
        汇编语言
        高级语言
            编译型语言
            解释性语言
    7. 执行python程序的两种方式
    8. 变量
        变量的命名规范
        变量名的命名风格
        变量的三个特征
        常量
            常量的命名规范
    9.  引用计数
    10. 数据类型
    11. python2和python3的区别
    12. 运算
        比较运算
        赋值运算
            增量赋值
            链式赋值
            交叉赋值
            解压赋值
        逻辑运算
        身份运算
    13. 运行python程序的三个步骤
    14. 小整数池
    15. if判断的四种语法
    16. 结束while循环的两种方式
    17. while else的用法
    18. for主要用来做循环取值
    19. 可变类型与不可变类型是按照什么标准划分的
    20. 计算机系统分为哪三层
    21. 字符编码
        编码和解码
        解决乱码的核心法则
        python2默认的编码方式
        python3默认的编码方式
        #coding:文件头的作用
    22. 字符编码的操作核心法则(3条)
    23. 文件
    24. 文件处理的三个步骤
    25. 上下文管理的方式
    26. 操作文件内容的三种纯净模式
    27. 控制文件内容格式的两种模式
    28. 文件指针移动的单位是字节还是字符
    29. 文件是否可以修改?
        文件'修改'的两种方式
    30. 函数
    31. 函数的分类
    32. 使用函数的原则
    33. 函数的两个明确阶段
    34. 函数定义的三种形式
    35. 函数调用的三种形式
    36. return的特点
        yield的特点
    37. 函数参数的两大类
        形参(形参又分为几类)
        实参(实参又分为几类)
    38. 为什么说函数是第一类对象?
    39. 函数与变量的四种使用方式
    40. 函数的嵌套定义以及其应用场景
    41. 函数的嵌套调用以及其应用场景
    42. 什么是名称空间
    43. 名称空间的分类(三类)
    44. 名称空间的产生顺序
    45. 名称空间的销毁顺序
    46. 什么是作用域
    47. 作用域的分类(两种)
    48. 作用域关系的核心要义(一句话)
    49. 什么是闭包函数
    50. 为函数体传值的两种方式(分别的特点)
    51. 什么是装饰器
    52. 装饰器的分类(两大类)
    53. 什么是语法糖
    54. 装饰器的语法糖
    55. 有参装饰器的模板
    56. 无参装饰器的模板
    57. 叠加装饰器的加载顺序
    58. 叠加装饰器的执行顺序
    59. 什么是迭代器
    60. 迭代器的两个优点
    61. 迭代器的两个缺点
    62. 什么是可迭代对象
    63. 什么是迭代器对象
    64. python中的可迭代对象有哪些(6个)
    65. python中的迭代器对象有哪些(1个)
    66. for循环本质上是个迭代器循环,原理是什么(3步)
    67. 什么是生成器
    68. python中提供生成器的关键字
    69. 三元表达式
    70. 列表生成式
    71. 生成器表达式
    72. 字典生成式
    73. 什么是匿名函数
    74. 匿名函数的应用场景(2个)
    75. 什么是函数递归
    76. 递归要满足的两个原则
    77. 递归的两个明确的阶段
    78. 什么是面向过程编程
    79. 面向过程编程的优点和缺点
    80. 什么是面向对象编程
    81. 面向对象编程的优点和缺点
    82. 什么是模块
    83. 模块的作用
    84. 模块的分类(4类)
    85. 模块导入的两种方式,区别是什么
    86. import导入模块的三个步骤
    87. import导入的三种语法
    88. from导入模块的三个步骤
    89. from导入模块的三种语法
    90. 模块的搜索顺序
    91. 什么是包
    92. __init__文件是干什么用的
    93. __init__文件应该包含哪些内容
    94. 包的作用
    95. 相对导入和绝对导入
    96. 相对路径和绝对路径
    97. 文件的两种执行方式,区别是什么?
    98. 什么是对象
    99. 什么是类,面向对象编程为什么要有类
    100. 什么叫做面向对象是更高程度的一种封装
    101. 类的两种用途
    102. __init__方法在什么时候会被触发
    103. python3中类与类型是一个概念吗
    104. 什么是继承
    105. 什么是组合
    106. 什么是多态
    107. 什么是封装
    108. 继承分为哪两类, 区别是什么
    109. 类分为哪两类, 区别是什么
    110. 重用父类功能的两种方式, 分别有什么特点
    111. 单继承背景下属性的查找顺序
    112. 多继承背景下属性的查找顺序(两类)
        菱形继承
        非菱形继承
    113. 封装的特点是什么?
    114. 封装数据属性的目的
    115. 封装函数属性的目的
    116. 隐藏的__开头的属性有哪些特点(4个)
    117. property装饰器主要是用来解决什么问题的
    118. 什么是绑定方法与非绑定方法
    119. classmethod装饰器是用来绑定什么的
    120. staticmethod装饰器是用来绑定什么的
    121. 什么是反射?
    122. 反射的四个方法(增删改查)

二. 零散的知识点

is              比较的是两个地址
    ==              比较的两个变量的值
    id              打印出来的是变量的内存地址信息
    input           python中交互关键字
    global          全局变量
    nonlocal
    __all__         在模块的导入过程中,我们可以通过__all__来控制外部可以使用此模块的哪些内容
    __name__        执行文件的两种方式会导致__name__的值不一样, 直接执行__name__==__main__,导入模块执行会__name__等于模块名
    sys.modules     当前内存中加载的模块名称mdcmd,是字典的形式
    sys.path        当前的系统路径,不是内置模块,内存中也不存在此模块的时候,就会按照顺序到sys.path这个列表中去查询
    __init__方法     在类中出现的,当创建对象的时候会自动的调用此方法,并把创建的空对象当做第一个参数传递进去
    __init__文件     在包中出现的,用来导入包内的其他模块。在导入包的时候其实执行的__init__模块
    __dict__        对象或者类去查看名称空间用的,是一个字典
    __file__        当前文件的绝对路径,(win中也就是从盘符开始的路径)
    super函数        目前学到的只是继承父类的属性的时候用到的,super(父类名,self).方法名, 会给我们返回一个特殊的对象,按照mro列表中的顺序进行属性查找的。
    __str__         在类中创建一个__str__方法, 一定要有返回值,否则会报错,这样直接print(对象)的时候会给我们打印返回的值
    __del__         在类中创建一个__del__方法,在方法中删除系统资源,代表在对象被删除的时候会给我们自动的删除没有被回收的系统资源
    continue:       不执行当前continue之后的代码, 直接进入下一次循环, 不应该将continue作为最后一步执行的代码
    break           跳出当前循环
    while...else    不是因为break而跳出循环的时候就会执行else的代码
    a, b, *_ = [1, 2, 3, 4]      在解压赋值的时候,如果我们不想要后面的一些值就需要以这样的方式来书写
    __iter__        在迭代器和可迭代对象的时候学习的,使用此方法之后会把可迭代对象转换成迭代器对象
    __next__        具有此方法的对象都是迭代器对象,我们可以通过这个方法获得迭代器对象的值
    lambda          匿名函数   lambda  参数一, 参数二: 表达式   返回值就是表达式的值

三. 数据类型

数据类型
    int
    float
    str
    list
    tuple
    dict
    set

四. 文件操作的常用方法

文件操作的方法
    read
    write
    readline
    readlines
    writeline
    writelines
    seek
    tell

五. 常用模块

常用模块(14个)
    time
    datetime
    sys
    os
    random
    shutil
    pickle
    shelve
    json
    xml
    configparser
    logging
    re
    hashlib
    subprocess

七. 内置模块

   max         求最大值, res = max(salaries, key=lambda key: salaries[key]), key是比较标准
    min         求最小值,
    sorted      从大到小顺序排列   sorted(salaries, key=lambda key: salaries[key], reverse=True)


    filter      过滤 res = filter(lambda item: not item.endswith('_dsb'), test) 如果不是以_dsb结尾的就保留下来,返回一个迭代器
                它不能向map和reduce一样对数据进行修改, 应用想去掉列表中的某个值x
    reduce      reduce需要导入才能进行使用
                # 求1-100的和
                # 这第三个参数是初始值,如果没有,则会从迭代对象中找到一个值赋值给它
                from functools import reduce
                res = reduce(lambda x, y: x + y, range(100), 100)
                print(res, type(res))

                # 拼接字符串
                test = ['yuanhao_dsb', 'egon_dsb', 'wupeiqi_dsb', 'alex_dsb', 'egon']
                from functools import reduce
                res = reduce(lambda x, y: x + y, test, '10000')
                print(res, type(res))
                应用在拼接字符串或者是数字的叠加过程
    map         映射  res = map(lambda item: item + '_dsb', lists)将lists的每个参数传递给item进行映射之后返回一个迭代器
                应用在对某一类值进行修改
    sum     sum就是单纯的求和
    round    对浮点数进行四舍五入取值
    power   返回幂运算值或者与其指定的数值的模
    divmod  返回两个数值的商和余数
    dir    返回对象或者当前作用域内的属性列表
    ascii  返回对象的可打印表字符串表现方式
    vars  返回当前作用域内的局部变量和其值组成的字典,或者返回对象的属性列表
    all   判断可迭代对象每个元素是否都是True
    any  判断可迭代对象中是否又True的元素
    zip   聚合传入的每个迭代器中的相同位置的元素,返回一个新的元祖类型迭代器
    reversed   反转序列生成新的可迭代对象
    bytearray    根据传入的参数创建一个新的字节数组
    bytes     根据传入的参数创建一个新的不可变字节数组
    memoryview  根据传入的参数创建一个新的内存查看对象
    frozenset  根据传入的参数创建一个新的不可变集合

    enumerate   根据可迭代对象创建枚举对象
    slice   根据传入的参数创建一个切片对象
    super   根据传入的参数创建一个新的子类和父类的关系的代理对象
    object  创建一个新的object对象

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄