什么是生成器
根据开发人员指定的规则循环生成数据,当条件不成立时则生成数据结束。数据不是一次性全部生产出来,而是使用一个,再生成一个,可以节约大量内存。
创建生成器的方式
- 生成器推导式
yield
关键字
生成器推导式
生成器相关函数
next
函数获取生成器中的下一个值for
循环遍历生成器中的每一个值
python
# 创建生成器
# 注意1:括号() 代表这是一个生成器,不是元组
# 注意2:括号()里面写的是数据的生成规则,返回一个对象,对象内不是存储的数据,而是生成数据的规则
my_generator = (i * 2 for i in range(5))
print(my_generator) # 输出:<generator object <genexpr> at 0x000001B8ABC3B9F0>,说明这是一个生成器对象,不是存储数据的容器
# next 获取生成器下一个值
# value = next(my_generator)
# print(value) # 输出:0,说明生成器每次调用next()方法时,会根据生成规则生成下一个值
# for循环获取生成器的值
for value in my_generator:
print(value) # 输出:0 2 4 6 8,说明for循环会自动调用next()方法获取生成器下一个值,直到生成器没有值为止
yield
生成器
只要在def函数里面看到有yield
关键字,那么就是生成器
python
def my_generator(n):
for i in range(n):
print("开始生成...")
yield i
print("生成结束...")
if __name__ == '__main__':
gen = my_generator(5) # 创建生成器对象,不会执行生成规则,只有在调用next()方法时才会执行生成规则
#获取生成器中下一个值
# result = next(gen)
# print(result)
# while True:
# try:
# result = next(gen)
# print(result)
# except StopIteration as e:
# break
# for循环遍历生成器,for循环内部自动处理了停止迭代异常,使用起来更加方便
for value in gen:
print(value)
生成器高级应用场景
很多模型都是一个批次一个批次的给模型喂数据,来训练模型的
python
import math
def dataset_loader(bath_size):
with open('./jaychou_lyrics.txt', 'r', encoding='utf-8') as f:
lines = f.readlines()
# 统计有多少条歌词
lyrics_num = len(lines) # 歌词数量
# 计算共有多少个批次 match.ceil 向上取整,math.floor 向下取整
batch_num = math.ceil(lyrics_num / bath_size) # 批次数量
# 遍历每个批次
for i in range(batch_num):
yeild lines[i * bath_size: (i + 1) * bath_size] # 每次返回一个批次的数据
if __name__ == '__main__':
# 调用函数,传入批次大小
for batch in dataset_loader(8): # 批次大小为8
print(batch) # 输出每个批次的数据
property属性
property属性介绍
- 负责把一个方法当做属性进行使用,这样做可以简化代码使用
- 定义property属性有两个方法
- 装饰器方式
- 类属性方式
装饰器方式
@property
修饰获取值的方法@方法名.setter
修饰设置值的方法
python
class Person(object):
def __init__(self):
self._age = 0
# 获取属性
@property
def age(self):
return self._age
# 设置属性
@age.setter
def age(self, value):
if value < 0:
raise ValueError("年龄不能为负数")
self._age = value
if __name__ == '__main__':
person = Person()
print(person.age) # 使用 @property 装饰器获取年龄
person.age = 20 # 使用 @age.setter 装饰器设置年龄
print(person.age) # 使用 @property 装饰器获取年龄
类属性方式
- 类属性 = property(获取值方法,设置值方法)
python
class Person(object):
def __init__(self):
self._age = 0
def get_age(self):
return self._age
def set_age(self, value):
if value < 0:
raise ValueError("年龄不能为负数")
self._age = value
# 使用 property 装饰器定义属性
age = property(get_age, set_age)
if __name__ == '__main__':
person = Person()
print(person.age)
person.age = 20
print(person.age)