1、什么是生成器

我们可以把生成器理解为一个高端的列表。生成器就是一个集算法和列表还有依次读取于一体的功能。因为如果列表存储的内容过多就会造成内存的浪费。但是如果“列表”内的元素可以通过某种规则展示出来、且我们只需要前几项的元素,我们就可以通过使用生成器来进行。

2、生成器怎么用

# 列表的用法
a = [x for x in range(10)]
=>[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 生成器的用法
a = (x for x in range(10))
=><generator object <genexpr> at 0x0000027656609408>

我们输出的是一个generator。而列表打印的出来的就是元素。我们如何将generator的元素打印出来呢?使用next函数,将generator的元素打印出来。

next(b)
=>0
next(b)
=>1
next(b)
=>2
next(b)
=>3
next(b)
=>4
next(b)
=>5
........
#当元素超出时报错停止
next(b)
=>Traceback (most recent call last):File "<stdin>", line 1, in <module>
StopIteration

对于这种情况,我们不必一直使用next对其进行调用,我们可以使用使用for循环对其进行调用,这样就可以省去很多事情,便于操作。

这是一种简单的用法,下面我们将函数信息与生成器结合使用。其大致使用方法跟一般的函数(循环)的使用。

#使用generator达到生成器的效果
def fid(max):n, a, b = 0, 0 ,1while n < max:yield ba , b = b , a + bn += 1
f = fid(6)
=><generator object fid at 0x00000201278195E8>
next(f)
=>1
next(f)
=>1
next(f)
=>2
next(f)
=>3

我们可以看出yield的效果和return的效果差不都,但是yield不会使函数值返回,而是使得函数的值暂时挂起。我们使用next使得函数的值输出,这极大的提高了我们的效率。

3、生成器在深度学习中的应用

def xs_gen_pro(data,batch_size):lists = datanum_batch = math.ceil(len(lists) / batch_size)    # 确定每轮有多少个batchfor i in range(num_batch):if(i==0):np.random.shuffle(lists)batch_list = lists[i * batch_size : i * batch_size + batch_size]np.random.shuffle(batch_list)batch_x = np.array([x for x in batch_list[:,0]])batch_y = np.array([y for y in batch_list[:,1]])yield batch_x, batch_y
​
if __name__ == "__main__":#data_gen = xs_gen(data,5)for x,y in xs_gen(data,5):print("item",x,y)for x,y in xs_gen(data,5):print("item",x,y)

为了方便演示,上面是直接对列表进行读入操作,一般在用的时候是读取path列表,在按照path提取数据。

item [50 30 20 90 80] [5 3 2 9 8]
item [ 60   0 100 110  40] [ 6  0 10 11  4]
item [120  10 140 130 150] [12  1 14 13 15]
item [70] [7]
item [120  90  70  80 130] [12  9  7  8 13]
item [ 10 150 100   0  50] [ 1 15 10  0  5]
item [140  30  60  20 110] [14  3  6  2 11]
item [40] [4]

这样就可以很好的读取到数据了。

4、再看生成器

前面已经对生成器有了感性的认识,我们以生成器函数为例,再来深入探讨一下Python的生成器:

1、语法上和函数类似:生成器函数和常规函数几乎是一样的。它们都是使用def语句进行定义,差别在于,生成器使用yield语句返回一个值,而常规函数使用return语句返回一个值。

2、自动实现迭代器协议:对于生成器,Python会自动实现迭代器协议,以便应用到迭代背景中(如for循环,sum函数)。由于生成器自动实现了迭代器协议,所以,我们可以调用它的next方法,并且,在没有值可以返回的时候,生成器自动产生StopIteration异常。

3、状态挂起:生成器使用yield语句返回一个值。yield语句挂起该生成器函数的状态,保留足够的信息,以便之后从它离开的地方继续执行。

5、使用生成器所需的注意事项

我们通过对上面的输出进行分析可以得出,我们可以知道,输出仅有一次。因此我们使用生成器时需要注意的是:生成器只能遍历一次。

6、参考

赖明星——《python生成器到底有什么优点?》

小宋是呢——《[开发技巧]·深度学习使用生成器加速数据读取与训练简明教(TensorFlow,pytorch,keras)》

mybatis generator 打印出来表了 但是没有生成未见_Python丨深度学习中使用生成器加速数据读取与训练...相关推荐

  1. IDEA 中使用 MyBatis Generator 逆向工程出现运行成功但是没有生成相应的文件

    记录一个 MyBatis Generator 逆向工程出现运行成功但是没有生成相应的文件问题. 我这里使用的是main方法运行,在出现运行成功没有报错但是也没有生成对应的文件,把下面这一段代码加上运行 ...

  2. 使用MyBatis Plus 3.2.0版本插件代码生成器生成实体类后,对于数据库中字段类型datetime的字段会转变为LocalDateTime类型

    问题描述: 使用MyBatis Plus 3.2.0版本插件代码生成器生成实体类后,对于数据库中字段类型datetime的字段会转变为LocalDateTime类型,IDEA提示报错"Usa ...

  3. mybatis generator 中文注释_mybatis代码生成器,提高开发效率

    出处:https://www.cnblogs.com/homejim/p/9782403.html 在使用 mybatis 过程中, 当手写 JavaBean和XML 写的越来越多的时候, 就越来越同 ...

  4. MyBatis Generator 代码自动生成器,从此解放你的双手

    前言 在日常开发工作中,我们往往需要自己去构建各种数据表所对应的持久化对象(PO).用于操作数据库的接口(DAO)以及跟 DAO 所绑定的对应 XML.这都是一些重复性的操作,不需要多大技术含量,这时 ...

  5. 5.6 Mybatis代码生成器Mybatis Generator (MBG)实战详解

    文章目录 前言 一.Mybatis Generator简介 二.Maven插件运行方式 三.生成配置 generatorConfig.xml MyBatis3Simple风格 MyBatis3风格 M ...

  6. 取代 Mybatis Generator,这款代码生成神器配置更简单,开发效率更高

    作为一名 Java 后端开发,日常工作中免不了要生成数据库表对应的持久化对象 PO,操作数据库的接口 DAO,以及 CRUD 的 XML,也就是 mapper. Mybatis Generator 是 ...

  7. MyBatis Generator(MBG)PostgreSQL使用说明 区分大小写敏感

    PostgreSQL使用说明区分大小写敏感 PostgreSQL对所有数据库标识符(表名,模式名,列名等)区分大小写.此外,PostgreSQL对所有小写字母的所有标识符都有不同的偏好.如果您使用Po ...

  8. 使用MyBatis Generator自动生成持久层CRUD代码的两种方法

    最近在使用MyBatis,得知可以利用MyBatis Generator自动生成实体类.DAO接口和Mapping映射文件.当数据库中的表多的时候,让你不用再手写Mapping映射文件,和实体类,就可 ...

  9. MyBatis Generator 代码生成器

    MyBatis Generator 代码生成器 MyBatis Generator简介 MyBatis Generator(MBG)是MyBatis 的代码生成器.它将为MyBatis的所有版本生成代 ...

最新文章

  1. 前端解决跨域问题的8种方案(最新最全)
  2. JSP第二次作业_5小题
  3. java 连接redis失败_java 连接Redis问题及demo
  4. asp.net控件开发基础十四
  5. Jenkins的Pipeline脚本在美团餐饮SaaS中的实践
  6. 在CISCO ASA 防火墙上配置Web ×××
  7. 加载顺序_Java的web.xml组件加载顺序
  8. 动态规划(装配线调度)
  9. 异构计算 软硬协同设计_优雅的设计CNN并行架构-软硬协同之位宽设置(2)
  10. html img属性text,TextField的htmlText属性中img标签的有趣现象
  11. 盘点OLCF的超级计算机
  12. windows server 2008r2 如何隐藏iis版本号_如何拥有自己炫酷的个人博客
  13. android消息发送字符串,Android aSmack-如何对文件发送进行自定义消息...
  14. sybase如何配置monitor
  15. 2021-11-09 jQuery常用方法及事件
  16. Flutter 自定义下拉菜单
  17. fastadmin 配置阿里云邮箱SMTP 邮箱服务器(邮箱发件服务器)
  18. LeetCode.714.买卖股票的最佳时机含手续费
  19. 阿里云技术专家刘晨旭:阿里云对数据可靠性保障的一些思考
  20. python 实现发送手机短信验证码后台方法

热门文章

  1. python csdn博客_GitHub - 1783955902/CSDNBlogBackup: Python实现CSDN博客的完整备份
  2. 怎么退出自适应巡航_简单聊聊定速巡航和自适应定速巡航的区别
  3. oracle中 start with,Oracle中connect by...start with...的使用
  4. safari浏览器横屏怎么设置_如何避免苹果safari自带浏览器“跟踪”你的信息!
  5. mysql 字段钳口可加引号_根据处理对象划分,计算机可以分为模拟计算机、(
  6. 有两个python怎么停用其中一_python3.X 复学(2)-----开始了就不要停止
  7. 安全使用计算机事例,计算机安全案例分析.ppt
  8. python中的try与if,python中if和try的区别是什么
  9. go语言 mysql卡死_一次mysql死锁的排查过程-Go语言中文社区
  10. 类java的步骤_java类加载的过程