python高级知识点总结

线程知识
1 多任务
并行
并发
2 父线程与子线程
一个进程中默认只有一个线程 --- 主线程

3 创建子线程的两种方法
使用Thread类 实例对象
class threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)
常用参数
target指定子线程运行的函数名
args执行子线程的函数代码在运行时 的参数
thd = threading.Thread()


使用Thread子类 实例对象
实现其中的run()方法


thd.start()方法 只是启动子线程的创建和执行

4 主线程等待子线程退出

默认情况下父线程会等待所有子线程退出
如果需要在子线程执行完成后 还需要执行一些代码(比如检测子线程+10000次之后的运算结果) 需要在主线程中使用 Thread实例对象.join()

5 同一个进程内部的多个线程 共享全局变量

6 多线程同步--秩序

互斥锁保证在任何一个时间点只有 一个 任务可以获取并占有 锁资源

创建锁资源 mutex = threading.Lock()

获取锁资源 mutex.acquire()

在默认情况下 如果锁已经被其他任务锁定 那么 本次获取将会阻塞该任务的执行

释放锁资源 mutex.release()

7 互斥锁的优缺点
优点
保证多任务修改共享数据时能够同步 使运算结果正确
缺点
丧失多任务优势
容易造成死锁问题

扫描二维码关注公众号,回复: 922855 查看本文章

8 死锁问题

任务在获取锁时造成 一直在等待(死等) 锁资源 而不能成功获取

原因:
没有正确释放 --
用户规范 用完一定要关
权宜之计就是在获取锁的时候 使用非阻塞 或者 阻塞+超时等待 方式获取锁
多种锁资源分配不当 -- 银行家算法可以解决该问题


9 acquire()方法功能说明

acquire(blocking=True, timeout=-1)
函数作用 申请锁资源
参数含义 blocking参数表示是否阻塞 True表示阻塞 False表示非阻塞(不阻塞等待)
timeoute参数表示阻塞等待的最长时间 超时则放弃等待
-1表示死等
如果是一个正数 代表等待这么秒

返回值 表示是否成功获取到锁资源 True表示成功获取 False表示获取失败

acquire(True,10)
acquire(True) === acquire()
acquire(False,10)


进程

0. 进程间通信-Queue队列
创建
q = multiprocessing.Queue() 参数表示队列长度 -- 数据条数
往里面放数据
q.put(data)
取出数据
q.get()
判断满
q.full()
判断空
q.empty()
获取队列中的数据数量 mac会崩溃
q.qsize()

put(obj[, block[, timeout]])
obj表示数据对象
block表示是否阻塞等待 True表示阻塞等待 False表示不阻塞 不等待
timeout 表示如果等待 等待最长的时间

如果超时等待或者 不阻塞等待都没有获取到数据 则抛出异常

put(data,block=True,timeout=-1)

put(data,True,10)
put(data,False) 不等待 put_nowait(data)
如果超时放入 或者 非阻塞放入数据 没有完成任务 都会抛出异常

get(block=True, timeout=-1])
block表示是否阻塞等待 True表示阻塞等待 False表示不阻塞 不等待
timeout 表示如果等待 等待最长的时间 -1表示死等

get() == get(True)
get(True,10) 最多超时等待10s 如果没有取到数据 就抛出异常
get(False) 不阻塞等待 直接获取数据 如果没有取到数据 就抛出异常


1. 进程池

创建进程池 pool = Pool(进程的最大数量)
添加任务
apply是阻塞的任务添加方式 会等待添加的任务执行完成才会继续往下执行
apply_async 是非阻塞的任务添加方式 只管添加 不等任务结束

关闭进程池
.close()
pool.terminate() 终止进程池中所有的正在执行的进程任务

等待所有任务执行完成
.join() 保持主进程存活 等待所有的工作进程 全部退出

注意事项:
1. 如果需要在进程池中 使用进程间通信Queue 不要使用multiprocessing.Queue() (要求是通过继承的方式创建的进程)
应该使用 multiprocessing.Manager().Queue()

2. .join()之前 一定要调用 .close() 或者.terminate()
3. 在正常情况下 是不需要teminate()终止所有工作进程的


------------------今天迭代器生成器语法---------------------------------------
1. 迭代
根据记录的前面的元素的位置信息 去访问后续的元素的过程 -遍历 迭代


2. 可迭代对象 iterable

能够被迭代访问的对象 for in
常用可迭代对象-list tuple str
from collections import Iterable
isinstance(obj, Iterable)

3. 可迭代对象

可迭代对象通过__iter__方法提供一个 可以遍历对象中数据的工具-迭代器
iter(可迭代对象) 可以获取可迭代对象的迭代器

通过迭代器可以迭代访问 数据
next(迭代器) ===== 迭代器对象.__next__()

如果需要实现一个迭代器 就需要实现__next__()

4. 迭代器 iterator -- 迭代器访问可迭代对象中数据
判断对象是否是迭代器类型

from collections import Iterator
isinstance(obj, Iterator)

自己实现
迭代器本身也是可迭代对象 __iter__() 提供迭代器(self)
下一个元素的值 = next(迭代器) =====> __next__()

5. 生成器 generator
生成器是一种特殊的迭代器 --- 是迭代器 并且有自己的特点
1 创建生成器表达式 [] ----》 (x for x in range(100))
2 生成器函数
凡是有yield关键字的函数都不是普通函数了 而是生成器函数

6. yield关键字的作用

挂起当前函数 将后面表达式的值 返回到调用生成器的地方
接收数据 并唤醒当前函数 并且紧接着上次运行的地址继续执行

7. 唤醒生成器的两种方式

生成器.send("数据")
next(生成器) === 生成器.send(None)

在第一次调用生成器对象的是 必须使用next()
在后续的情况下 send和next可以混用

协程对比 进程 线程
协程 用户层面的概念

进程 线程 都是操作系统层面的概念


正则

1. 正则表达式的使用场景
关键词-匹配
学习技巧- 理解 -多练习

<img alt="丁叮c的直播" data-original="https://rpic.douyucdn.cn/live-cover/appCovers/2017/12/27/462253_20171227014914_big.jpg" src="https://rpic.douyucdn.cn/live-cover/appCovers/2017/12/27/462253_20171227014914_big.jpg" width="283" height="163" style="display: block;">


2. 两个函数
match() 从头开始匹配 如果某个字符不能满足匹配规则 将匹配失败 返回None
直到匹配完成 将匹配结果放入匹配结果对象中

从匹配结果对象中获取到匹配结果
matchobj.group()

result = re.match(正则, 数据)
if result:
print(result.group())
else:
print("匹配失败")

search() 从头开始查找 如果某个字符不能满足匹配规则 将继续往后面查找 并尝试继续匹配
如果查找完 都没有匹配上 则返回None
如果匹配成功 将匹配结果放入匹配结果对象中

从匹配结果对象中获取到匹配结果
matchobj.group()

result = re.search(正则,数据)
if result:
print(result.group())
else:
print("匹配失败")

3. 匹配单个字符 -- 元字符

. 匹配一个任意字符(除去\n)
[] 匹配集合中任意一个字符
[-] 匹配字符范围的其中任意一个字符
[^] 禁止 集合内任意一个的字符匹配 -- 取反 黑名单
digit
\d 匹配一个任意数字字符 等价 [0123456789] == [0-9]
\D 匹配一个任意的 非数字字符 等价于 [^0123456789] == [^0-9] = [^\d]
space
\s 匹配一个任意空白字符 不止空格 等价于 [\t\r\n\v\f ]
\S 匹配一个任意的非空白字符
word
\w 匹配一个任意的 单词字符 [\da-zA-Z_]
\W 匹配一个任意的 非单词字符 [^\da-zA-Z_]

拓展-


4 匹配多个字符-量词
a. {n} 匹配前面那个字符n次
b. {n,m} 匹配 至少n次 最多m次 m可以不写 代表匹配无限次 没有上限
c. + 至少匹配一次 {1,}
d. * 任意多次 {0,}

5. 匹配位置
a. ^ 匹配开始位置
虽然match自带匹配开始的属性 但是为了正则的语义完整 建议也加上^

b. $ 匹配结束位置
匹配的是结束位置 而不是数据

6. 分组 group
目的 -- 在正则中使用() 将感兴趣的数据从整体中提取出来 放到分组存储

等整体匹配成功返回的结果对象中 .group(分组编号)就可以获取对应分组中数据了

group(0) == group() 就是正则表达式整体匹配的结果

用户的分组编号从1开始

() 表示匹配数据并放入分组
.group(分组编号)就可以获取对应分组中数据了


| 表示匹配|左边或者右边的正则表达式

(|) 表示匹配分组中| 左边或者右边的表达式 并且放入分组中

总结

1 ?在正则中出现的不同场合
(?P<name>\w??)

2 () [] {} <>在正则中的作用

猜你喜欢

转载自www.cnblogs.com/snailon/p/9056758.html