Python原理--总结
基础数据类型:
字符串:
upper,lower,startwith,endswith,replace,strip,split,count,isdigit,index
列表:
append,insert,extend,pop,remove,del,改:li[] = "海洋" 查:根据索引,切片查询
count,index,sort,reverse
列表的注意事项:
循环一个列表时,删除元素时,剩下的值会向前近一步 (索引也会更改), 不要改变列表的大小,这样会影响你最终结果
字典:
可变类型不能作为key
Python 中的空间和作用域:
三个空间:
内置名称空间:print,input
全局名称空间:当前py文件中的变量(也叫全局命名空间)
局部名称空间:函数执行时,会开辟出局部空间(也叫临时名称空间)
globals() 查看全局存储的全局变量
locals() 查看当前存储的变量
全局作用域---->内置名称空间和全局名称空间
局部作用域---->局部名称空间
作用:
作用域对与变量而言,声明变量在程序里可使用的范围,
局部作用域可以引用全局作用域变量,局部作用域不能改变全局变量
加载顺序:
内置--->全局--->局部 (从外到内)
取值顺序:
就近原则LEGB
编码:
1byte = 8bit 1KB = 1024B(byte) 1M = 1024KB
ASCII: 英文编码 英文一个字节
GBK : 国标码 英文 一个字节,中文两个两个
Unicode:万国码 英文四个字节, 中文四个字节
UTF-8 : 万国码升级 英文一个字节, 欧洲两个字节,中文三个字节
同一代码块:
优点:能够进行复用,提高一些字符串,这样在数字处理时间和空间上提升性能,节省内存
适用对象:
int:任何数字在同一代码块下都会复用
str:几乎所有的字符串都会符合缓存机制
不同代码块:
小数据池:
小数据池,是不同代码块下的缓存机制,也叫小整数缓存机制和驻留机制
int:5-256整数进行缓存,当你将整数赋值给变量时,直接引用已经创建好的缓存对象
str:满足缓存规则的字符串
逻辑运算符:
x and y x 为真返回y x为假返回x
x or y x为真返回x x 为假返回y
not x x为真返回假 x为false返回true
深浅copy:
浅copy:拷贝的数据半共享,如你有一个嵌套的列表,他只会拷贝第一层,当你修改第一层数据,数 据不变,第二层数据也就是嵌套的列表没有拷贝,而是指向第二层数据的内存地址,当数据 修改,跟着变化
深拷贝:
数据完全不共享,深拷贝将拷贝的数据放在一个独立的内存中。
闭包:
在函数嵌套中,内层函数对外层函数非全局变量的使用
作用:
也就是保重数据安全,自由变量不会在内存中消失,而且全局还引用不到
开放封闭原则:
开放:对代码拓展的开放,比如模块,函数功能,扩展开放,意思也就是,当你代码写完后,还可以在原基 础上进行修改。
封闭:对源码的修改是封闭的,不可扩展,对与更改是封闭的。
函数:
函数是以功能为导向去完成一件事,如项目中的登录,注册,一个函数就是一个功能,随掉随用
优点:
减少代码的重复性
增强代码的可读性
匿名函数:一句话函数,用于内置函数,匿名函数结合内置函数使用
func = lambda x,y : x+y 名字func :前形参 :后返回值
示例1:
func = lambda x : (x[0],x[2]) 返回多个元素加()
示例2:
func = lambda x,y :x if x > y else y
func = lambda *args : max(args) #返回最大的值,也可以添加三元运算>
内置函数:***加key的 min,max,sorted,map,reduce,filter
加key的格式:
将最小的值返回
dic = {'a':3,'b':2,'c':1}
print(min(dic.values(),key=lambda x:x)) key=lambda 函数名 :前形参 :后返回值
函数参数:
*args 位置参数聚合成一个元祖
*kwargs 关键位参数聚合成一个元祖
实参加* 代表打散,聚合给*args
实参加** 代表打散,只能用于字典,聚合给**kwargs
参数说明:
位置参数:从左至右,一一对应
默认参数:传值覆盖,不传则默认
仅限关键字参数:放在默认参数后面
形参顺序:
位置参数,*args,默认参数,仅限关键字参数,**kwargs
实参顺序:
位置参数,关键字参数,混合参数(位置参数,关键字参数)
注意事项:
默认参数的坑,当你的默认参数是可变类型,不会消失,使用的是同一个内存地址
函数名指向的是函数的内存地址,加上()就可执行
列表推导式:
简单,快捷,装逼
循环模式:
li = [i for i in range(2,101,2)] 构建1-100的偶数
筛选模式:
[i for i in range(1,31) if i %3 ==0 ] if筛选能被3整除的
可迭代对象:
内部含有 __iter__
方法,可以for循环的就是可迭代对象
dir() 查看是否含有可迭代对象方法
优点:
可迭代对象是一个操作方法灵活,侧重于对少量数据灵活处理(并且内存足够)
缺点:
占用内存
不能迭代取值(索引,字典的key)
迭代器 ltertor:
iter方法是将可迭代对象转换成迭代器
next方法是迭代器进行取值(无法找到下一个结果时会出现StopIteration异常)
什么是迭代器,可以重复迭代的工具,内部含有__iter__
和__next__
方法就是迭代器,
优点:迭代取值,节省内存(迭代之后元素消失),惰性机制不走回头路
缺点:操作方法少,不直观,查询速度较慢(时间换空间)
作用:
为什么要使用迭代器,当你要获取文件内容时,传统方式是读取文件内容到内存空间中,在使用
for循环遍历,如你文件较大,这样会占用极大的内存空间,而使用迭代器是可以一个迭代读取一
段内容,节省内存空间,这也是迭代器存在的作用
生成器:
yield:
函数中包含yield,这个就是生成器函数,返回值是一个生成器,执行内容需要调用next()方法
yield from:
在函数中如果yield from list 这样会将list列表变成迭代器返回
生成器表达式:
(i for i in range(1,11)) 使用()扩起来就可以了, 就是生成器表达式
在Python社区,生成器和迭代器被看作成一种,生成器的本质就是迭代器,区别是,生成器是我们自己 用Python代码构建的,迭代器都是内置函数转化过来的
装饰器原理:
装饰器本质上是一个函数
装饰器遵循开放封闭原则
装饰器,在原函数上,不需要做任何代码变动下,增加额外功能
作用:
用于插入日志,性能测试
序列化:
将内存中的数据(list,tuple,dict)变成可存储或者网络传输,这个变的过程他就是序列化
Json:
dict,list, tuple,str,int
不同语言都遵循使用的一种数据转换格式,可以互相使用json传输数据
Pickle:
支持所有数据类型
python语言遵循的一种数据化转换格式,只能在python中使用
作用:
为什么要用序列化,因为硬盘存储和网络传输时只能接受bytes类型的。
dumps 将数据转换 dump将数据转换并写入文件(json存储空间小,pickle存储空间大)
类:面对对象
继承:比如你有几个类,而类与类之间有重复的变量属性和函数属性,把重复的变量属性和函数
提取出来,放到父类,当子类想要使用时,调用即可,这样可以减少重复代码。
抽象类:是一个开发规范,约束他的所有子类必须实现一些和他同名的方法
所有的类都必须继承object
见到抽象类的写法,一定要知道在子类中实现同名的方法
多态:
一个类表现出多种形态,是通过继承来完成,打个比方说这个苹果继承水果类,葡萄也继承水果类
那我们就说苹果的对象是水果类
葡萄的对象也是水果类
在这一个例子里,水果这个类型表现出了苹果和葡萄的类型的形态,这个就是多态
封装:
就是把属性变量和方法装起来
广义:
把属性和方法装起来,外面不能直接调用了,要通过类的名字来调用
狭义:
把属性和方法藏起来,外面不能调用,只能在类的内部调用
网络五层:
osi五层:
应用层 python(应用层包括会话层,表示层)
传输层 tcp udp 四层路由器 四层交换机
网络层 路由器 三层交换机 ipv4 ipv6 (国际协议)
数据链路层 mac arp 网卡 二层傻瓜交换机
物理层 网线接口类型,介质传输速率
seq 序号 用来表示tcp源端像目标端发送字节流,发送方发送数据对此进行标记 32位
ACK 确认请求 只有ACK标志位等于1事,确认序号才有效,ack = seq + 1
SYN 发送请求
FIN 释放一个连接
注意:确认方=发起方req + 1 ,两端配对
TCP协议:
三次握手:
第一次握手:
客户端向服务端发送syn=1的请求和一个随机seq等于x的报文,进入发送状态
第二次握手:
服务端收到客户端发送的syn报文,给客户端回应syn=1的请求和一个随机seq等于y的 报文 和确认请求ack=x+1,进入接收状态
第三次握手:
客户端收到服务器syn报文和确认请求,在回应服务器一个ack = y+1报文,客户端和服 务端进入建立连接状态,完成三次握手
三次握手作用:
客户端向服务端发送一个连接请求,这个请求因为网络节点问题滞留了,请求在到达 服务器已经是一个失效的连接,如果没有三次握手,服务器确认请求,建立连接,但是
请求是失效的,客户端不会理会服务器的确认信息,也不会发送消息,服务端一直等待 客户端发送数据,这样很多资源就浪费了,这就是三次握手的作用
四次挥手:
第一次挥手:
客户端向服务器发送FIN=1,seq序号=x (u是上面传送过来的数据最后一个一个字节+1)
客户端停止发送数据,进入终止等待状态1
第二次挥手:
服务端收到FIN,回发一个确认请求 ack=x+1和seq=y,
此时进入关闭等待状态
第三次挥手:
客户端进入终止等待状态2
服务端向客户端发送FIN=1 ,ack = x+1 假定此时的序号为seq=w
服务端进入最后确认状态,等待客户端确认
第四次挥手:
客户端发送ack=w+1,seq= x+1
客户端进入时间等待状态。