python 原理

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:拷贝的数据半共享,如你有一个嵌套的列表,他只会拷贝第一层,当你修改第一层数据,数 据不变,第二层数据也就是嵌套的列表没有拷贝,而是指向第二层数据的内存地址,当数据 修改,跟着变化

​ 深拷贝:

​ 数据完全不共享,深拷贝将拷贝的数据放在一个独立的内存中。

闭包:

​ 在函数嵌套中,内层函数对外层函数非全局变量的使用

​ 作用:

​ 也就是保重数据安全,自由变量不会在内存中消失,而且全局还引用不到

开放封闭原则:

​ 开放:对代码拓展的开放,比如模块,函数功能,扩展开放,意思也就是,当你代码写完后,还可以在原基 础上进行修改。

​ 封闭:对源码的修改是封闭的,不可扩展,对与更改是封闭的。

函数:

​ 函数是以功能为导向去完成一件事,如项目中的登录,注册,一个函数就是一个功能,随掉随用

​ 优点:

​ 减少代码的重复性

​ 增强代码的可读性

  1. 匿名函数:一句话函数,用于内置函数,匿名函数结合内置函数使用

    ​ 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) #返回最大的值,也可以添加三元运算>

  2. 内置函数:***加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

​ 客户端进入时间等待状态。

猜你喜欢

转载自www.cnblogs.com/haiyang11/p/11061070.html
今日推荐