易错易忘点

1、python2与python3的区别

1、默认字符编码
python2:ascii
python3: utf-8
    
2、print
python2:
    1、打印时可加括号,也可不加
    2、打印一个值,输出无括号
    3、打印多个值,若打印时加了括号,输出也有括号,并且有逗号分隔,即元组形式
    4、打印多个值,若打印时没加括号,输出也没括号,并且没有逗号分隔,与python3一致
    5、python3中,打印时必须要加括号
3、input
	1、python2中有两种打印语句:input和rawinput
    2、python2中input接收用户输入时,需要指定数据类型,input接收的就是该类型的数据
    3、python2中rawinput接收用户输入时,不需要指定类型,全部接收为字符串
    4、python3中只有input,不需要指定类型,全部接收为字符串
4、字符串
	1、py2中:unicode类型表示字符串序列,str表示字节序列
    2、py3中str表示字符串序列,byte类型表示字节序列
5、global与nonlocal
	1、py3中新增了关键字nonlocal,声明变量为多层嵌套函数整个局部

2、装饰器

1、本质是闭包函数
2、使用闭包的思想,生成一个新的同名函数,不同的名称空间
3、不改变源代码,不改变调用方式
4、新的名称空间中,在执行真正的原函数代码之前,必须执行添加额代码块,可以是判断,可以是新增的功能
4、使用新的同名函数,不会改变调用方式,并且真正的函数代码没有改变

3、多线程、多进程

IO密集型使用多线程编程
计算密集型使用多进程编程
使用线程池、进程池设定最大线程、进程数量
使用互斥锁保证数据安全,即数据完整和数据同步

4、GIL

1、全局解释器锁,本质是线程互斥锁
2、每个进程内都有一把
3、由于进程内线程共享全局资源,为了保证共享数据的完整性和状态同步,GIL使得同一时间只有一个线程能够访问共享数据

5、OSI七层协议

应用层	HTTP,FTP,NFS
表示层	Telnet,SNMP
会话层	SMTP,DNS
传输层	TCP,UDP
网络层	IP,ICMP,ARP
数据链路层	Ethernet,PPP,SLIP,FDDI
物理层	IEEE 802.1A,IEEE 8O2.11

6、HTTP协议

作用
	超文本传输协议,规定了传输数据的数据格式
四大特征
	1、基于TCP/IP作用于应用层之上的协议
    2、基于请求响应
    3、无状态:服务器不保留客户端的任何状态,降低服务器的记忆负担,提高响应速度
    4、无连接:每次连接只处理一个请求,响应完成,即断开连接,大大降低了www服务器的执行效率
   	(长连接:可以保持连接,连续发送多个数据包,当没有数据时,需要双方发送链路检测包)

数据格式
	1、请求格式
    	请求首行(请求方式,协议版本)
     	请求头
     	

     	请求体
	2、响应格式 
     	响应首行
     	响应头
     	

     	响应体
         
数字编码
	将文字信息对应成数字编号,便于传输和编程,自定义对应关系
    1**:服务端成功受到请求,正在处理,客户端可以继续提交其他数据
    2**:服务端成功响应了数据
    3**:重定向
    4**:客户端错误,如404请求资源不存在,403当前不符合某一些条件,拒绝访问
    5**:服务器内部错误

7、垃圾回收机制

存储机制:
	栈区:存储变量名和变量值内存地址关联关系
    堆区:存储变量值
    内存管理回收的是堆区的内容

1、引用计数
	变量值引用计数为0,变量值所占的内存会被释放
2、标记清除
	循环引用:
    	1、容器对象包含其他对象,存储的只是其他对象的内存地址,添加引用而已
        2、循环引用指的就是容器对象互相包含,即互相引用了,那么当栈区变量名与内存关联被删除后,它们的值存储了对方的引用,即引用计数不为0,然后又跟其他的任何对象不产生关联。
		3、容器对象,如列表,字典,元组,集合,类等都可以包含其他对象的引用,都可能产生循环引用问题
	标记清除:
    	1、使用GC算法
        2、标记:遍历所有的GC Roots对象(栈区中的所有内容或者线程),将所有GC Roots对象能直接或者间接访问到的d对象标记为存活状态,其余的均为非存活状态,应该被清除
        3、清除:遍历堆中所有的对象,将没有标记的对象全部清除
2、分代回收
	背景:基于引用计数的回收机制,每次回收内存,都需要把所有对象的引用计数都遍历一遍,非常耗时
	分代:指的是根据变量在多次扫描后,都没有被回收的变量,gc机制将其扫描频率降低,这样多次分级之后,大大减少了遍历的变量个数,节省了时间
    回收:依然是,引用计数为0就回收内存

8、进制转换

bin()  # 将十进制转换成二进制
oct()  # 将十进制转换成八进制
hex()  # 将十进制进制转换成十六进制
int(value,num)  # 将num进制的value转换成十进制

9、eval与exec的区别

''''
相同点:将字符串的引号去掉,执行里面的代码
不同点:eval不能识别逻辑代码
'''
# 例如:
code1 = "print('hello')"
code2 = "for i in range(10):print(i)"
eval(code1)
exec(code2)
'''
hello
hello
'''

eval(code2)  # 报错
exec(code2)

原文地址:https://www.cnblogs.com/WM2019/p/11872947.html