python生成器

什么是生成器

根据开发人员指定的规则循环生成数据,当条件不成立时则生成数据结束。数据不是一次性全部生产出来,而是使用一个,再生成一个,可以节约大量内存。

创建生成器的方式

  • 生成器推导式
  • 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)  
相关推荐
子夜江寒18 小时前
基于 OpenCV 的图像形态学与边缘检测
python·opencv·计算机视觉
SmartRadio1 天前
CH585M+MK8000、DW1000 (UWB)+W25Q16的低功耗室内定位设计
c语言·开发语言·uwb
rfidunion1 天前
QT5.7.0编译移植
开发语言·qt
少林码僧1 天前
2.31 机器学习神器项目实战:如何在真实项目中应用XGBoost等算法
人工智能·python·算法·机器学习·ai·数据挖掘
rit84324991 天前
MATLAB对组合巴克码抗干扰仿真的实现方案
开发语言·matlab
智航GIS1 天前
10.4 Selenium:Web 自动化测试框架
前端·python·selenium·测试工具
jarreyer1 天前
摄像头相关记录
python
宝贝儿好1 天前
【强化学习】第六章:无模型控制:在轨MC控制、在轨时序差分学习(Sarsa)、离轨学习(Q-learning)
人工智能·python·深度学习·学习·机器学习·机器人
大、男人1 天前
python之asynccontextmanager学习
开发语言·python·学习
hqwest1 天前
码上通QT实战08--导航按钮切换界面
开发语言·qt·slot·信号与槽·connect·signals·emit