线程:
线程依附于进程 cpu调度的基本单位 每个进程至少包含一个线程 此线程为主线程
在进程中创建一个新的新的线程 这个线程为子线程
线程用来实现多任务编程
同一个进程中的线程数据可以共享
线程创建步骤:
1.导包 import threading
2.通过线程类创建线程对象 t1 = threading.Thread(target=函数名)
3.启动线程任务
注意点:
线程直接执行是无序的 因为cpu调度 cpu在做着高平切换
主线程会等待所有子线程执行结束后在结束
线程直接可以全局共享
多线程操作共享可能出现安全问题 so会使用互斥锁解决
cpu调度资源测略;
1.抢占式
2.均分时间片
多线程共享全局变量
丢次数原因: 多线程共享全局变量 会抢资源 所以会出现丢失
线程同步 方法 加锁
互斥锁:
对共享数据进行锁定,保证同一时刻只有一个线程去操作
也就是抢锁 谁先抢到锁 谁先运行
创建互斥锁:
1.创建锁 mutex = threading.Lock()
2.上锁 mutex.acquire()
3.释放锁 mutex.release()
区别与进程:
迭代器:
遍历集合元素的标准方式
range()就是一个迭代器
什么是迭代器:
自定义类 只要重写__iter__() 返回当前对象 __next__() 返回当前值,并且更新当前值 方法就可以称之为迭代器
目的:
1.隐藏底层逻辑,使用户 用起来方便
2.惰性加载,用的时候才能获取
可以通过 for 循环或 next() 函数进行遍历 取值
生成器:
根据制定的规则生成数据,数据不是一次性生成而是一个一个生成的
目的:节省大量内存
创建方式:
1.生成器推导式 即 ge = (i for i in range(8))
2.yield关键字 干了三步 def mygenerater(n):
1.创建生成器 for i in range(n):
2.把值存储到生成器 yield i
3.返回生成器
可以通过 for 循环遍历 或 next() 函数取下一个值
strir() 去掉末尾\n \t 头尾空格 也就是说 去掉字符串首尾的空白字符
math.ceil() 向上取整
property 属性
实现方式
1.装饰器方法
@property 修饰 获取值的函数
@获取值的函数.setter 修饰设置值的函数
之后就可以直接.上述函数名.吧函数当做变量来使用
2.类属性
类属性名 = property(获取值的函数名,设置值的函数名)
之后就可以直接.上述函数名.吧函数当做变变量来使用
特点:把函数当做变量来使用
正则表达式: 其他语言也有
匹配或者查找符合某些规则的字符串 就可以使用正则表达式了
功能:
1.数据验证
2.数据检索
3.数据隐藏
4.数据过滤 .............等等
re模块 匹配的
1.导入模块
2.使用match方法匹配
名字 = re.match('正则表达式','要校验的字符串')
3.如果匹配成功用group方法提取
名字.group()