生成器:一类特殊的迭代器
#生成器,一类特殊的迭代器(1.记录位置2.返回值3.位置+1)
#next —> 获取下一个值
#生成器创建的两种方式
#第一种 列表推导式
list2 = [0,2,4,6,8,10]
print(list2)
list3 = [x * 2 for x in range(10)]
print(list3)
#生成器,把列表推导式的中括号改成小括号就变成生成器了
list4 = (x * 2 for x in range(10))
print(list4)
value = next(list4) #通过next获取值
print(value)
value = next(list4)
print(value)
print(’---------------’)
#第二种 函数使用了yield
def test():
return 10
def test1():
yield
m = test()
print(m)
m2 = test1()
print(m2)
#创建一个实现斐波那契的生成器
def fibnacci(n):
#n是指定的列数
#定义变量
a = 1
b = 1
#保存位置
current_index = 0
print(’-------1--------’)
#循环生成
while current_index < n:
#返回a
data1 = a
#改变a,b的值
a,b = b, a+b
#位置+1
current_index += 1
print(’-------2-------’)
yield data1 #yield 可以充当返回值
#yield作用:
#1.起到return的作用,可以返回值
#2.保存a,b,,并且暂停程序的执行
print(’--------3---------’)
if name == ‘main’:
#获取生成器
fib = fibnacci(5)
#取值
# value = next(fib)
# print(value)
#for遍历
for value in fib:
print(value)
协程: 是一个特殊的生成器 微线程、纤程 协程就是你可以暂停执行的函数 协程的操作是程序员
意义:对于多线程应用,cpu通过切片的方式来切换线程间的执行,协程切换时只使用一个线程(单线程),在一个线程中规定某个代码执行顺序
协程的适用场景:当程序中存在大量不需要CPU的操作时,适用于协程。
greenlet:
是一个第三方的库
gevent 也是用来协程的 能够自动切换任务,自动识别耗时操作
猴子补丁作用:
1.在运行时替换方法、属性等
2.再不修改第三方代码的情况下增加原来不支持的功能
3.在运行时为内存中的对象增加patch而不是在磁盘的源代码中增加
进程线程协程对比:
进程是系统进行资源分配调度的独立单位,线程是cpu调度分派的基本单位,协程是一种用户态的轻量级线程,协程的调度完全由用户控制
应用场景:
多进程:密集cpu任务,需要充分使用多核cpu资源的时候用多进程:缺陷:多个进程之间通信成本高,切换开销大
多线程:密集io任务, 缺陷:同一个时间切片只能运行一个线程,不能做到高并行,但是可以做到高并发
协程:当程序中存在大量不需要cpu的操作时
缺陷:单线程执行,处理密集cpu和本地磁盘io的时候,性能比较低
正则表达式:又称规则表达式
经常被用来检索和替换那些符合某个模式的文本
可以:
测试字符串的某个模式
实现按照某种归则替换文本
根据模式从字符串中提取一个子字符串(爬虫)
[ol-] 匹配中括号中的任意字符 ^ 取反
[a-z] 匹配小写字母a到z
\d 匹配数字
\D匹配非数字的所有字符
\s 匹配空格
\S 除了空格的所有
\w 字母数字和下划线
\W 与小写取反
. 所有字符(除了\n)
- 出现0次或n次
+匹配前一个字符出现1次或者无限次
?匹配前一个字符出现1次或者0次
{m}匹配前一个字符出现m次
{m,n}匹配前一个字符出现m-n次
re模块
re.match(pattern,string,flags=0)
pattern: