生成器

为什么要将列表转化为迭代器?

因为列表太大的话用内存太大,做成迭代器可以节省空间,用的时候再拿出部分。

生成器是不会把结果保存在一个系列中,而是保存生成器的状态,在每次进行迭代时返回一个值,知道遇到StopIteration异常结束。

创建生成器

先看个例子

当要生成的list非常大时,会抛出异常,存储报错。

那怎样生成这种巨大的list呢?

可以看出b是一个generator,也就是生成器模式

生成器的创建很简单,将列表生成式的中括号改成小括号即可

注意:这里说的不是列表,因为列表的中括号改成小括号是元组!

如果想要生成一个内容,可用next()函数:

直到最后会抛出异常,也就是到达了生成器的末端

函数进化为生成器

将函数中的return换成yield,函数就变成了生成器。

当我们调用时,发现返回的是生成器对象。为了拿到数据,我们可以使用next()函数

不过在此之前,我们先要用一个变量去接收这个生成器对象,并且为了观察生成器的特点,我们对函数进行修改

当我们使用next(a)对生成器操作一次时,会返回循环一次的值

也就是在yield处结束本次运行

但是它的特点就是下次使用next(a)时,接着上次的断点继续运行,直到下一个yield

不断使用next(a),直到运行到生成器结尾处,会出现StopIteration异常。

使用for循环调用生成器

与next()等价的方式

send()

每次运行,除了返回下一个,还会打印出None

注意item=yield i 这句,首先执行的等号右边,yield返回,此时,返回生成器一个对象,并且中断

下次使用f.__next__()时候,并没有传内容进去,可认为yield i这整个赋值给item的为None,所以item打印出为None

为了做比较,引入send()

send()可看做next()的增强版,除了可以使用next()功能,还能传入一个值到上次yield断开地方的整体表达式(这里是yield i)

多任务——协程

当我们在while主程序中,先使用f1.__next__()调用生成器func1,因为func1的循环条件始终为真,所以先打印(执行装入操作)然后遇到yield退出生成器func1,回到主程序

接着执行f2.__next__()调用生成器func2,像之前调用func1一样,先打印(执行打包操作)然后遇到yield退出生成器func2,回到主程序。因为主程序循环条件始终为真,所以继续像之前一样,接着调用,如此往复。这里使用打断来停止程序执行,不然会不断执行下去,由于两个生成器交替执行,很快,就像在多任务执行。

Python知识点进阶——生成器的更多相关文章

  1. Python知识点进阶——迭代器

    可迭代对象 可迭代对象可以简单的理解为用for循环遍历的,如list.tuple.dict.set.str 判断一个对象是否是迭代器: 可以将数据类型 和 是否为可迭代对象 比较来判断是否是可以迭代 ...

  2. Python知识点进阶——细节问题

    int()强制转换浮点数 在int()的强制转换浮点数时候,不管是正数还是负数,只取整数部分. 注意:这里不是向上或者向下取整,也不是四舍五入. 无限递归 递归是为了将问题简化为更小规模的同类型问题, ...

  3. 十三. Python基础(13)--生成器进阶

    十三. Python基础(13)--生成器进阶 1 ● send()方法 generator.send(value) Resumes the execution, and "sends&qu ...

  4. 学习python须知,Python基础进阶需掌握哪些知识点?

    Python基础进阶需要掌握哪些知识点?Python将是每个程序员的标配,有编程基础再掌握Python语言对于日后的升职加薪更有利.Python语言简洁利于理解,语法上相对容易能够让开发者更专注于业务 ...

  5. Python函数进阶:闭包、装饰器、生成器、协程

    返回目录 本篇索引 (1)闭包 (2)装饰器 (3)生成器 (4)协程 (1)闭包 闭包(closure)是很多现代编程语言都有的特点,像C++.Java.JavaScript等都实现或部分实现了闭包 ...

  6. Python爬虫进阶四之PySpider的用法

    审时度势 PySpider 是一个我个人认为非常方便并且功能强大的爬虫框架,支持多线程爬取.JS动态解析,提供了可操作界面.出错重试.定时爬取等等的功能,使用非常人性化. 本篇内容通过跟我做一个好玩的 ...

  7. 年薪20万Python工程师进阶(7):Python资源大全,让你相见恨晚的Python库

    我是 环境管理 管理 Python 版本和环境的工具 pyenv – 简单的 Python 版本管理工具. Vex – 可以在虚拟环境中执行命令. virtualenv – 创建独立 Python 环 ...

  8. python 知识点补充

    python 知识点补充 简明 python 教程 r 或 R 来指定一个 原始(Raw) 字符串 Python 是强(Strongly)面向对象的,因为所有的一切都是对象, 包括数字.字符串与 函数 ...

  9. python高级之生成器&迭代器

    python高级之生成器&迭代器 本机内容 概念梳理 容器 可迭代对象 迭代器 for循环内部实现 生成器 1.概念梳理 容器(container):多个元素组织在一起的数据结构 可迭代对象( ...

随机推荐

  1. Axure7.0注册码 Axure7.0序列号 Axure7.0License key

    很多同学安装了Axure7.0,但找不到注册码(license key).以前网上流传的Axure6.5的注册码不能用了.下面整理几个可用的Axure7.0注册码分享给大家,祝大家使用愉快,做出更多牛 ...

  2. spring MVC之注解开发控制器(二)

    开发表单控制器 在传统的Spring MVC开发方法中,是通过扩展SimpleFormController类来创建简单的表单控制器.这样就定义了基本的表单处理流程,并允许通过覆盖几个生命周期方法来定制 ...

  3. Oracle同义词。。。

    同义词 --私有同义词--私有同义词权限grant create synonym to scott;--创建私有同义词create synonym dp for scott.dept;--将查询dep ...

  4. 如何配置阿里Maven镜像

    1.下载maven的zip解压,官方下载地址为:http://maven.apache.org/download.cgi 选择需要下载maven的版本就好了 2.到下载的maven路径下,conf/s ...

  5. js中的load先执行还是Jquery的ready先执行问题

    onload需要页面上所有的资源都加载上之后执行,而ready则是DOM文档树已经解析完成时,说ready比onload快最显著的是比如一个页面上有一个很大的图片,加载要好久,onload只有在图片加 ...

  6. C#中 String和string的区别

    string 是 System.String的别名,所以相当于声明了 using string = System.String 再者,string是C#的关键字,String是System下的类名.

  7. JAVA方法定义和调用

    类的方法代表的是实例的某种行为或功能 定义类的方法 访问修饰 类型 方法名(参数列表){ //方法体 } 1.把方法当作一个模块,是个“黑匣子”,完成某个特定的功能,并返回处理结果 2.方法分类“ 返 ...

  8. Mybatis介绍(一)

    这里介绍的mybatis比较简单, 我做为一个初学者, 记录下个人在学习中方法, 如果那里出错, 希望读者朋友们见谅. 首先这里介绍一下我们下面用的表结构: author表是保存了作者的个人信息, 因 ...

  9. 【转/TCP协议编程】 基于TCP的Socket 编程

    基于TCP(面向连接)的socket编程,分为客户端和服务器端. 客户端的流程如下: (1)创建套接字(socket) (2)向服务器发出连接请求(connect) (3)和服务器端进行通信(send ...

  10. python3基础07(进程操作及执行系统级命令等)

    #subprocess 创建子进程 连接输入 输出 管道错误,及获取他们的状态,可执行操作系统级的命令# subprocess.run(args, *, stdin=None, input=None, ...