生成器_正则
多线程特点_随机性
1 | import threading |
多线程特点_守护线程
1 | # |
多线程特点_数据共享
1 | # 定义一个列表类型的全局变量,创建两个子线程分别执行 |
多线程特点_互斥锁
图解
代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30import threading
global_num = 0
# 创建了一个锁
lk = threading.Lock()
def fun1():
#加锁
lk.acquire()
global global_num
for i in range(10000000):
global_num += 1
print(f"fun1的函数结果{global_num}")
#释放锁
# lk.release()
def fun2():
# 加锁
lk.acquire()
global global_num
for i in range(10000000):
global_num += 1
print(f"fun2的函数结果{global_num}")
lk.release()
# 释放锁
if __name__ == '__main__':
t1 = threading.Thread(target=fun1)
t2 = threading.Thread(target=fun2)
t2.start()
t1.start()
进程和线程对比
1
2
3
4 进程和线程的区别:
1. 线程依赖进程, 进程是CPU分配资源的基本单位, 线程是CPU调度资源的基本单位.
2. 进程更消耗资源, 不能共享全局变量, 相对更稳定.
3. 线程更轻量级, 可以共享全局变量, 相对更灵活.
迭代器入门
1 | """ |
生成器介绍
案例1: 推导式写法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23def my_fun():
for i in range(1, 11):
# my_list =[] #创建
# for i in range(1,11):
# my_list.append(i) #添加
# return my_list #返回
#等价于
# yield 在这里做了三件事
# 1:创建生成器对象
# 2:把值存储在生成器中
# 3:返回生成器
yield i
#1:创建生成器对象
my_g1 = my_fun()
print(type(my_g1))#<class 'generator'>
print(next(my_g1))
print(next(my_g1))
print("*"*24)
for i in my_g1:
print(i)
print("*")案例2: yield关键字
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39"""
案例: 演示生成器之 推导式写法.
生成器介绍:
概述:
所谓的生成器就是基于 数据规则, 用一部分在生成一部分, 而不是一下子生成完所有.
目的:
可以节省大量的内存.
实现方式:
1. 推导式写法.
2. yield关键字
"""
# 需求: 通过yield方式, 获取到生成器之 1 ~ 10之间的整数.
# 回顾: 推导式写法.
my_g = (i for i in range(1, 11))
# yield方式如下.
# 1.定义函数, 存储到生成器中, 并返回.
def my_fun():
# my_list = [] # 创建
# for i in range(1, 11):
# my_list.append(i) # 添加
# return my_list # 返回
# 效果类似于上边的代码.
# yield在这里做了三件事儿: 1.创建生成器对象. 2.把值存储到生成器中. 3.返回生成器.
for i in range(1, 11):
yield i
# 2.测试.
my_g2 = my_fun()
print(type(my_g2)) # <class 'generator'>
print(next(my_g2))
print(next(my_g2))
print('-' * 23)
for i in my_g2:
print(i)案例3: 批量歌词
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32"""
需求:基于传入的文件,创建生成器 ,生产批次歌词
分批加载数据: 歌词 假设 8条为一个批次
"""
import math
# 定义函数 返回生成器
# batch_size 批次大小
def dataset_loader(batch_size):
# 读取文件
with open("./data/jaychou_lyrics.txt", "r", encoding="utf-8") as src_f:
# 一次读取一行数据
lines = src_f.readlines()
# 计算批次总数 ,假设 5批 每个批次8条 5*8 = 40条数据
# 之所以使用math.ceil,是因为考虑到可能最后歌词数不够8条,也算一个批次
# 总批次(total_batch) =celi(len(lines) /batch_size)
total_batch = math.ceil(len(lines) / batch_size)
# 循环 获取到【每个批次】的数据,放入生成器中,并返回
for idx in range(total_batch):
# 如何按照我们的要求来取批次
# 假设total_batch 是5个批次 range(5) 则idx值 0 1 2 3 4
# 第一批歌词,批次索引(idx=0),歌词为:第1条~第8条 索引为0~7
# 第二批格式,批次索引(idx=1),歌词为:第9条~第16条 索引8~15
# 第三批格式,批次索引(idx=2),歌词为:第17条~24条 索引:16~23
# yield lines[0:8] 包左不包右 前面的值 idx * batch_size
# yield lines[8:16] 包左不包右 前面的值 idx *batch_size
yield lines[idx * batch_size:idx * batch_size + batch_size]
d1=dataset_loader(8)
# print(next(d1))
for tmp_batch in d1:
print(tmp_batch)
Property属性介绍
场景1: 装饰器用法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33"""
property属性介绍:
概述/目的/作用:
把函数当做变量来使用
实现方式:
方式一:装饰器
方式二:类属性
实现方式一:
property的装饰器用法
@property 修饰 获取值的函数 get_age
@获取值的函数名.setter 修饰 设置值的函数 set_age
"""
# 没有property属性
class student:
# 私有化属性 age
def __init__(self):
self.__age = 18
# 没有property属性的时候:
# 提供公共的访问接口 (get/set)
def age(self):
return self.__age
def age(self, age):
self.__age = age
if __name__ == '__main__':
s1 = student()
# print(s1.get_age())
# print(s1.get_age)
print(s1.age)
s1.age=20
print(s1.age)场景2: 类属性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40"""
property属性介绍:
概述/目的/作用:
把函数当做变量来使用
实现方式:
方式一:装饰器
方式二:类属性
实现方式一:
property的装饰器用法
@property 修饰 获取值的函数 get_age
@获取值的函数名.setter 修饰 设置值的函数 set_age
"""
# 没有property属性
class student:
# 私有化属性 age
def __init__(self):
self.__age = 18
# 没有property属性的时候:
# 提供公共的访问接口 (get/set)
def get_age(self):
return self.__age
def set_age(self, age):
self.__age = age
age = property(get_age, set_age)
if __name__ == '__main__':
s1 = student()
# print(s1.get_age())
# print(s1.get_age)
print(s1.age)
s1.age = 20
print(s1.age)
正则表达式入门
1 | """ |
正则表达式_校验单个字符
1 | """ |
正则表达式_校验多个字符
1 | import re |
正则表达式_校验开头和结尾
1 | import re |
正则表达式_校验分组
1 | # 1 需求:在列表中["apple", "banana", "orange", "pear"],匹配apple和pearfruit = ["apple", "banana", "orange", "pear"] |
正则表达式_校验邮箱
1 | # 2 需求:匹配出163、126、qq等邮箱 |
正则表达式_提取QQ号
1 | #需求是匹配QQ号 |
正则表达式_校验html
1 | """ |
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.