Python知识点进阶——生成器
生成器
为什么要将列表转化为迭代器?
因为列表太大的话用内存太大,做成迭代器可以节省空间,用的时候再拿出部分。
生成器是不会把结果保存在一个系列中,而是保存生成器的状态,在每次进行迭代时返回一个值,知道遇到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知识点进阶——生成器的更多相关文章
- Python知识点进阶——迭代器
可迭代对象 可迭代对象可以简单的理解为用for循环遍历的,如list.tuple.dict.set.str 判断一个对象是否是迭代器: 可以将数据类型 和 是否为可迭代对象 比较来判断是否是可以迭代 ...
- Python知识点进阶——细节问题
int()强制转换浮点数 在int()的强制转换浮点数时候,不管是正数还是负数,只取整数部分. 注意:这里不是向上或者向下取整,也不是四舍五入. 无限递归 递归是为了将问题简化为更小规模的同类型问题, ...
- 十三. Python基础(13)--生成器进阶
十三. Python基础(13)--生成器进阶 1 ● send()方法 generator.send(value) Resumes the execution, and "sends&qu ...
- 学习python须知,Python基础进阶需掌握哪些知识点?
Python基础进阶需要掌握哪些知识点?Python将是每个程序员的标配,有编程基础再掌握Python语言对于日后的升职加薪更有利.Python语言简洁利于理解,语法上相对容易能够让开发者更专注于业务 ...
- Python函数进阶:闭包、装饰器、生成器、协程
返回目录 本篇索引 (1)闭包 (2)装饰器 (3)生成器 (4)协程 (1)闭包 闭包(closure)是很多现代编程语言都有的特点,像C++.Java.JavaScript等都实现或部分实现了闭包 ...
- Python爬虫进阶四之PySpider的用法
审时度势 PySpider 是一个我个人认为非常方便并且功能强大的爬虫框架,支持多线程爬取.JS动态解析,提供了可操作界面.出错重试.定时爬取等等的功能,使用非常人性化. 本篇内容通过跟我做一个好玩的 ...
- 年薪20万Python工程师进阶(7):Python资源大全,让你相见恨晚的Python库
我是 环境管理 管理 Python 版本和环境的工具 pyenv – 简单的 Python 版本管理工具. Vex – 可以在虚拟环境中执行命令. virtualenv – 创建独立 Python 环 ...
- python 知识点补充
python 知识点补充 简明 python 教程 r 或 R 来指定一个 原始(Raw) 字符串 Python 是强(Strongly)面向对象的,因为所有的一切都是对象, 包括数字.字符串与 函数 ...
- python高级之生成器&迭代器
python高级之生成器&迭代器 本机内容 概念梳理 容器 可迭代对象 迭代器 for循环内部实现 生成器 1.概念梳理 容器(container):多个元素组织在一起的数据结构 可迭代对象( ...
随机推荐
- 【转】c# winform 创建文件,把值写入文件,读取文件里的值,修改文件的值,对文件的创建,写入,修改
创建文件和读取文件的值 #region 判断文件是否存在,不存在则创建,否则读取值显示到窗体 public FormMain() { InitializeComponent(); //ReadFile ...
- C#数据库(MySQL)帮助类
using MySql.Data.MySqlClient; using System; using System.Collections.Generic; using System.Configura ...
- Swift网络库Alamofire的导入
一.手动导入 1, 官网下载 Alamofire 2, 解压下载的文件 放入工程的顶层目录下 3, 打开工程 Add Files 4, 选中项目 TARGETS > General > E ...
- Java项目—嗖嗖移动业务大厅
嗖嗖移动业务大厅包类(如下图): SosoMgr: package cn.biz; import java.util.Scanner; import cn.common.Common; import ...
- Java调用SQL Server的存储过程详解(转)
1使用不带参数的存储过程 使用 JDBC 驱动程序调用不带参数的存储过程时,必须使用 call SQL 转义序列.不带参数的 call 转义序列的语法如下所示: 以下是引用片段:{call proce ...
- tomcat7 开机自启动(转)
转自 http://blog.csdn.net/rainyspring4540/article/details/51861079 环境:win7 tomcat7 开机自启动: 使用管理员打开命令提示 ...
- javascript实现多线程提升项目加载速度
以前大家都认为js是单线程执行的,假如我们要执行一些耗时的操作,比如加载一张很大的图片,我们可能需要一个进度条来让用户进行等待,在等待的过程中,整个js线程会被阻塞,后面的代码不能正常运行,这可能大大 ...
- Visual Studio Code的快捷键和相关技巧
编辑相关的键盘快捷键: Shift + Alt + F = 格式化代码(似乎不好用) Ctrl + Shift + Enter = 在上一行新建空行并转到上一行 Ctrl + K,Ctrl + C = ...
- cf600E. Lomsat gelral(dsu on tree)
题意 题目链接 给出一个树,求出每个节点的子树中出现次数最多的颜色的编号和 Sol dsu on tree的裸题. 一会儿好好总结总结qwq #include<bits/stdc++.h> ...
- 关于node中的板块问题
最近自己在看node实战那本书,不过发现有一些书上不对的地方,罗列如下:1.connect服务自己有一些中间件可供使用,但是书上说的有cookie-parser.logger.favicon和body ...