python基础

本文详细介绍了Python的基础知识,包括网络编程的UDP和TCP协议,以及多任务处理的线程、进程和协程。重点讲解了UDP和TCP的客户端和服务端通信流程,线程的创建与同步机制,进程的创建与通信,以及协程的概念和案例。还涵盖了正则表达式的基本用法。
摘要由CSDN通过智能技术生成
python基础笔记

Python整理笔记
1. 网络-udp
.socket是一种全双工的进程间的通信方式,可以同时接收和发送数据。
udp的网络程序流程:
1. 创建客户端套接字:socket(AF_INET, SOCK_DGRAM)
2. 准备接收方的地址:IP,port
3. 接收,发送数据:recvfrom(decode),sendto(encode)
4. 关闭套接字:close()
2. 网络-tcp
Tcp和udp的不同点:
1. 面向连接 (三次握手)
2. 有序数据传输
3. 重发丢失的数据包
4. 舍弃重复的数据包
5. 无差错的数据传输
6. 阻塞/流量控制

.Tcp客户端通信过程:
1. 创建套接字:socket(AF_INET, SOCK_STREAM)
2. 建立连接(三次握手):connect
3. 发送—接收信息:send(encode),recv(decode)
4. 关闭套接字:close
.Tcp服务端通信过程:
1. 创建套接字:socket(AF_INET, SOCK_STREAM)
2. 绑定ip,port:bind
3. 监听客户端是否连接(变主动为被动):listen
4. 接收客户端连接并返回新的套接字(还有客户端地址):new_socket, client_addr
5. 用新的套接字为客户端服务(接收和发送数据):send(encode), recv(decode)
6. 关闭套接字
3. 多任务
并发:任务数多于cpu核数
并行:任务数少于cpu核数
3.1多任务-线程
线程模块:threading
线程的创建步骤:
1. 导入模块:import threading
2. 创建一个线程对象:t1 = threading.Thread(target=func_name, args=(num,),name=”子线程名字”)
3. 创建一个线程并启动:t1.start()
4. 等待子线程执行完毕后再继续向下执行主线程:t1.join()
主线程会等子线程结束后再结束。线程的调度是随机的,没有先后顺序。
互斥锁的运用:
1. 创建锁:Mutex = threading.Lock()
2. 加锁:Mutex.acquire()
3. 解锁:Mutex.release()
死锁:在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。
3.2多任务-进程
进程是系统进行资源分配的最小单位。
进程和线程的区别与优缺点:
区别:线程依赖于进程。
优缺点:线程开销小,但不利于资源的保护,而进程则相反。
进程的创建步骤:
1. 导入模块:import multiprocessing
2. 创建一个进程对象:
P = Multiprocessing.Process(target=func_name, [args=(元组), kwargs={字典}])
3. 创建并启动进程:p.start()
4. 等待子进程执行完毕:p.jon()
通过Queue实现进程间通信:
1. 创建一个队列:q = multiprocess.Queue(3) # 3 代表队列中最多可以接收3条消息
2. 向队列中添加数据: q.put(data)
3. 从队列中取数据:q.get()
4. 判断队列中是否为空:q.empty()
5. 判断队列中是否已满:q.full()
注意:如果是通过进程池创建的进程,队列的使用要用:multiprocessing.Manager().Queue()的方式,否则会报错

进程池 Pool
进程池的实现步骤:
1. 导入进程池模块:from multiprocessing import pool
2. 定义进程池,最大进程池进程数:po = pool(number)
3. 通过进程池调用目标 apply_async 非阻塞,不会等待子进程结束;apply阻塞,会等待子进程结束再结束
Po.apply_async(要调用的目标,(传递给目标的参数元组,))
4. 关闭进程池:po.close()
5. 等待进程池执行完毕:po.join()
3.3多任务-协程
迭代器:
For ···in··· 迭代的本质是先通过iter()函数获取可迭代对象Iterable的迭代器,然后对获取到的迭代器不断调用next()方法来获取下一个值并将其赋值给item,当遇到Stopiteration的异常后循环结束。

生成器:生成器是一种特殊的迭代器。
只要在def定义的函数中有yield关键字,就称为生成器。
Yield关键字有两点作用:
·保存当前的运行状态,然后暂停执行,即:将生成器挂起。
·将yield关键字后面表达式的值作为返回值返回,此时可以理解为起到了return的作用。

协程
协程和线程的差异:协程是比线程更小的执行单元。可以在任何地⽅保存当前函数的⼀ 些临时变量等信息,然后切换到另外⼀个函数中执⾏,注意不是通过调⽤函 数的⽅式做到的,并且切换的次数以及什么时候再切换到原来的函数都由开发者⾃⼰确定

协程案例:
Import gevent
from gevent import monkey
Import random
Import time
monkey.Patch_all()

def coroutine_work(coroutine_name):
for i in range(10):
print(coroutine_name, 1)
time.sleep(random.random())
gevent.joinall([
gevent.spawn(coroutine_work, “work1”)
gevent.spawn(coroutine_work, “work2”)
])

进程,线程,协程对比
1. 进程是资源分配的单位
2. 线程是操作系统调度的单位
3. 进程切换需要的资源很大,效率低
4. 线程切换需要的资源一般,效率一般
5. 协程切换任务资源最小,效率高
6. 多进程,多线程根据cpu核数不一样可能是并行的,协程在一个线程中,是并发

4.正则表达式
导入模块:re模块
4.1匹配单个字符
字符 功能
· 匹配任意字符,除了\n
[] 匹配[]中列举的字符
\d 匹配数字,0-9
\D 匹配非数字
\s 匹配空白,即空格,tab键
\S 匹配非空白
\w 匹配单词字符,即a-z,A-Z,0-9,_
\W 匹配非单词字符

4.2匹配多个字符
字符 功能
* 匹配前一个字符出现0或无数次,可有可无
+ 匹配前一个字符出现至少一次
? 匹配前一个字符有1个或者没有
{m} 匹配前一个字符出现m次
{m,n} 匹配前一个字符出现m-n之间的次数

4.3 匹配开头结尾
字符 功能
^ 匹配以···开头的字符
$ 匹配以···结尾的字符

4.4匹配分组的使用
字符 功能
| 匹配左右任意一个表达式
(ab) 括号中字符作为一个分组
\num 引用分组num匹配到的字符串
(?P) 分组起别名
(?P=name) 引用别名为name分组匹配到的字符串

4.5 re高级 search,findall,sub,split的使用

  1. re.search 扫描整个字符串并返回第一个匹配成功的字符,匹配成功re.search方法返回一个匹配的对象,否则返回None。可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。
    re.findall
    在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
    re.sub用于替换字符串中的匹配项
    re.split 根据匹配进行切割字符串,并返回一个列表
  2. re.match与re.search的区别
    re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。
  3. 贪婪和非贪婪的特点以及使用方式
    Python里正则匹配默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;非贪婪则相反,总是尝试匹配尽可能少的字符。在”*”,”?”,”+”,”{m,n}”后面加上?,使贪婪变成非贪婪
  4. 字符串前加r的作用
    Python中字符串前面加上 r 表示原生字符串
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值