当前位置: 首页 > java >正文

python生成器

什么是生成器

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

创建生成器的方式

  • 生成器推导式
  • yield 关键字

生成器推导式

生成器相关函数

  • next 函数获取生成器中的下一个值
  • for 循环遍历生成器中的每一个值
# 创建生成器
# 注意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 关键字,那么就是生成器

def my_generator(n):for i in range(n):print("开始生成...")yield iprint("生成结束...")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)

生成器高级应用场景

很多模型都是一个批次一个批次的给模型喂数据,来训练模型的

import mathdef 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):  # 批次大小为8print(batch)  # 输出每个批次的数据

property属性

property属性介绍

  • 负责把一个方法当做属性进行使用,这样做可以简化代码使用
  • 定义property属性有两个方法
    • 装饰器方式
    • 类属性方式

装饰器方式

  • @property 修饰获取值的方法
  • @方法名.setter 修饰设置值的方法
class Person(object):def __init__(self):self._age = 0# 获取属性@propertydef age(self):return self._age# 设置属性@age.setterdef age(self, value):if value < 0:raise ValueError("年龄不能为负数")self._age = valueif __name__ == '__main__':person = Person()print(person.age)  # 使用 @property 装饰器获取年龄person.age = 20  # 使用 @age.setter 装饰器设置年龄print(person.age)  # 使用 @property 装饰器获取年龄

类属性方式

  • 类属性 = property(获取值方法,设置值方法)
class Person(object):def __init__(self):self._age = 0def get_age(self):return self._agedef 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)  
http://www.xdnf.cn/news/12815.html

相关文章:

  • SWAN(Scade One) 语言原理介绍
  • Linux中《进程控制》详细介绍
  • RootSIFT的目标定位,opencvsharp。
  • DOM(文档对象模型)深度解析
  • 开源项目实战学习之YOLO11:12.6 ultralytics-models-tiny_encoder.py
  • 【深度学习-Day 25】告别过拟合:深入解析 L1 与 L2 正则化(权重衰减)的原理与实战
  • 标准代码项目开发流程学习指南
  • CMS内容管理系统的设计与实现:架构设计
  • 红黑树完全指南:为何工程都用它?原理、实现、场景、误区全解析
  • 数学:”度量空间”了解一下?
  • JESD204B IP核接口实例,ADI的ADRV9009板卡,ZYNQ7045驱动实现2发2收。
  • LLMs 系列科普文(14)
  • 关于IE浏览器被绑定安装,还卸载不掉
  • 72常用控件_QGridLayout的使用
  • 热成像实例分割电力设备数据集(3类,838张)
  • Vscode下Go语言环境配置
  • 矢状位片不可用怎么办?前后位测量方法评估骨盆倾斜角!
  • 智能职业发展系统:AI驱动的职业规划平台技术解析
  • LLMs 系列科普文(2)
  • python:Tkinter 开发邮件客户端,能编写邮件,发送邮件带附件
  • F(x, y, z) = 0 隐函数微分 确定自变量
  • 【资源分享】手机玩转经典游戏!小鸡模拟器1.9.0:PSP/NDS/GBA完美运行!
  • SSE (Server-Sent Events) 技术简介
  • Java八股文——并发编程「并发安全篇」
  • C-Equilateral Triangle
  • Windows安装Miniconda
  • 鸿蒙学习笔记01
  • 手写 vue 源码 === runtime-core 实现
  • RISC-V 开发板 + Ubuntu 23.04 部署 open_vins 过程
  • Kaggle注册不成功,添加插件header Editor