Python高阶
1. 闭包
定义:双层嵌套函数, 内层函数可以访问外层函数的变量 将内存函数作为外层函数的返回,此内层函数就是闭包函数
通过闭包:
优点:
- 不定义全局变量,也可以让函数持续访问和修改一个外部变量
- 闭包函数引用的外部变量,是外层函数的内部变量。作用域封闭难以被误操作修改
缺点:额外的内存占用
nonlocal关键字的作用:
- 在闭包函数(内部函数中)想要修改外部函数的变量值
- 需要用nonlocal声明这个外部变量
2. 装饰器
装饰器就是使用创建一个闭包函数,在闭包函数内调用目标函数。 可以达到不改动目标函数的同时,增加额外的功能。
@outer定义在目标函数上
func是被装饰的 函数
3. 设计模式
设计模式就是一种编程套路。 使用特定的套路得到特定的效果
单例模式
单例模式就是对一个类,只获取其唯一的类实例对象,持续复用它。
适用场景:当一个类只能有一个实例,而客户可以从一个众所周知的访问点访问它时。
优点:节省内存 节省创建对象的开销
工厂模式
工厂模式:将对象的创建由使用原生类本身创建 转换到由特定的工厂方法来创建
使用场景:当需要大量创建一个类的实例的时候, 可以使用工厂模式。
优点:
4. 多线程
进程线程合并执行
进程: 就是一个程序,运行在系统之上,那么便称之这个程序为一个运行进程,并分配进程ID方便系统管理。
线程:线程是归属于进程的,一个进程可以开启多个线程,执行不同的工作,是进程的实际工作最小单位。
操作系统中可以运行多个进程,即多任务运行
一个进程内可以运行多个线程,即多线程运行
并行执行:多个进程同时在运行,即不同的程序同时运行,称之为:多任务并行执行 一个进程内的多个线程同时在运行,称之为:多线程并行执行
多线程编程
threading模块的使用
- thread_obj = threading.Thread(target=func) 创建线程对象
- thread_obj.start() 启动线程执行
eg:
需要传参的话可以通过:
- args参数通过元组(按参数顺序)的方式传参
- 或使用kwargs参数用字典的形式传参
5. 网络编程
服务器开发
socket: (简称 套接字) 是进程之间通信一个工具,进程之间想要进行网络通信需要socket。 Socket负责进程之间的网络数据传输。
2个进程之间通过Socket进行相互通讯,就必须有服务端和客户端
- Socket服务端:等待其它进程的连接、可接受发来的消息、可以回复消息
- Socket客户端:主动连接服务端、可以发送消息、可以接收回复
Socket服务端编程:
主要分为如下几个步骤:
1. 创建socket对象
2. 绑定socket_server到指定IP和地址
3. 服务端开始监听端口
4. 接收客户端连接,获得连接对象
5. 客户端连接后,通过recv方法,接收客户端发送的消息
6. 通过conn(客户端当次连接对象),调用send方法可以回复消息
7. conn(客户端当次连接对象)和socket_server对象调用close方法,关闭连接
实现服务端并结合客户端进行测试:
客户端开发
Socket客户端编程
主要分为如下几个步骤:
1. 创建socket对象
2. 连接到服务端
3. 发送消息
4. 接收返回消息
5. 关闭链接
6. 正则表达式
正则表达式,又称规则表达式(Regular Expression),是使用单个字符串来描述、匹配某个句法规则的字符串,常被用来检索、替换那些符合某个模式(规则)的文本。
Python正则表达式,使用re模块,并基于re模块中三个基础方法来做正则匹配。 分别是:match、search、findall 三个基础方法。
基础匹配
- re.match,从头开始匹配,匹配第一个命中项
- re.search,全局匹配,匹配第一个命中项
- re.findall,全局匹配,匹配全部命中项
re.match(匹配规则, 被匹配字符串)
从被匹配字符串开头进行匹配, 匹配成功返回匹配对象(包含匹配的信息),匹配不成功返回空。
search(匹配规则, 被匹配字符串)
搜索整个字符串,找出匹配的。从前向后,找到第一个后,就停止,不会继续向后
整个字符串都找不到,返回None
findall(匹配规则, 被匹配字符串)
匹配整个字符串,找出全部匹配项
找不到返回空list: []
元字符匹配
单字符匹配
示例:
字符串 s = “itheima1 @@python2 !!666 ##itcast3”
- 找出全部数字: re.findall(r‘\d’, s)
字符串的r标记,表示当前字符串是原始字符串,即内部的转义字符无效而是普通字符
- 找出特殊字符:
re.findall(r‘\W’, s)
- 找出全部英文字母:
re.findall(r’[a-zA-Z]’, s)
[]内可以写:[a-zA-Z0-9] 这三种范围组合或指定单个字符如[aceDFG135]
数量匹配
边界匹配:
分组匹配:
7. 递归
递归: 即方法(函数)自己调用自己的一种特殊编程写法,即(函数调用自己,即称之为递归调用。)
注意:
- 注意退出的条件,否则容易变成无限递归
- 注意返回值的传递,确保从最内层,层层传递到最外层
os模块的3个方法
- os.listdir,列出指定目录下的内容
- os.path.isdir,判断给定路径是否是文件夹,是返回True,否返回False
- os.path.exists,判断给定路径是否存在,存在返回True,否则返回False