Python生成器-博文读后感
Windows 10家庭中文版,Python 3.6.4,
上午看过了一篇讲Python生成器的博文:
提高你的Python: 解释‘yield’和‘Generators(生成器)’(英文原文)
这篇博文讲的挺好的,但在读完后,自己仍然对yield、send、yield返回值等概念不清楚,于是,做了两个小试验。
试验一:yield语句的返回值
def xyz():
print('xyz 0')
while True:
print('xyz 1')
data = yield 2
print('xyz 2, data = ', data) if __name__ == '__main__':
mg = xyz()
for _ in range(3):
print('\nmain: _ = ', _)
print('main:', next(mg))
结果:
main: _ = 0
xyz 0
xyz 1
main: 2
main: _ = 1
xyz 2, data = None
xyz 1
main: 2
main: _ = 2
xyz 2, data = None
xyz 1
main: 2
介绍:
定义了生成器函数xyz(),使用语句data = yield 2;
旧的想法:data会等于2;
测试结果:data等于None;
执行next(mg)函数时,控制权交给了xyz()函数——第一次执行xyz()函数,输出了xyz 0,再进入循环,执行yield语句;
yield生成了2,控制权和生成的值2返回给调用函数——语句执行完毕后会给data赋值吧?或者等下一次给data赋值?,输出main: 2;
此时,生成器停在了这里;
再次执行next(mg)时,控制器又交给了xyz()函数,从上一次执行yield语句的下一句开始执行,于是,输出了“xyz 2, data = None”,上一次执行yield时,给data的值居然是None,孤以为会是2呢!
试验二:生成器的send函数和yield返回值语句的关系
def xyz():
print('xyz 0')
while True:
print('xyz 1')
data = yield 2
print('xyz 2, data = ', data) if __name__ == '__main__':
print('main 0')
mg = xyz()
print('main 1')
mg.send(None) # 第一次必须如此!!!
print('main 2')
for _ in range(3):
print('\nmain 3')
mg.send(_)
print('main 4')
结果:
main 0
main 1
xyz 0
xyz 1
main 2
main 3
xyz 2, data = 0
xyz 1
main 4
main 3
xyz 2, data = 1
xyz 1
main 4
main 3
xyz 2, data = 2
xyz 1
main 4
介绍:
第一次必须执行mg.send(None),为什么这样孤还没搞清楚,和生成器的内部实现有关;
在调用send函数时,控制权交给xyz()函数,执行到yield语句停止,再将控制器返回给调用函数;
主函数中循环执行send函数;
第一次发送了0,结果输出xyz 2, data = 0,这里的data不是None了,即便之前有调用send(None),这是否可以认为,yield语句是在 控制权交给生成器所在函数后才执行的?
xyz()中的循环执行到print('xyz 1')再次停止,控制器返回给主函数;
之后再把1、2发送给生成器;
总结
next(generator), generator.send(data)都会将控制权交给生成器函数;
yield语句是在获取控制权后执行,而不是之前,之前程序挂在这里了,同时保存了上下文;
下面三条语句的解释:
yield # 返回给主调函数None
data = yield # 返回给主调函数None,并把send的值赋值给data;如果是使用next获取了控制权,那么,调用next处获得None;
data = yield 2 # 返回给主调函数next(),并把send的值赋值给data;
本文开头的博文大家要看看,这样才可以更好地理解孤这篇文档,结合那篇博文及这两个试验,孤以为自己掌握了Python生成器的80%了吧,更多就需要看官网了。
----
本来想找个Python官方链接给大家的,可是啊,它的这个页面一时访问不了(为什么呢?):大家自行搜索官方、权威文档吧,也会讲解的更详细。
https://docs.python.org/3/tutorial/index.html

Python生成器-博文读后感的更多相关文章
- python——生成器
python——生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个 ...
- 小学生都能学会的python(生成器)
小学生都能学会的python(生成器) 1. 生成器 生成器的本质就是迭代器. 生成器由生成器函数来创建或者通过生成器表达式来创建 # def func(): # lst = [] # for i i ...
- Python 生成器 (generator) & 迭代器 (iterator)
python 生成器 & 迭代器 生成器 (generator) 列表生成式 列表生成式用来生成一个列表,虽然写的是表达式,但是储存的是计算出来的结果,因此生成的列表受到内存大小的限制 示例: ...
- python生成器学习
python生成器学习: 案例分析一: def demo(): for i in range(4): yield i g=demo() g1=(i for i in g) #(i for i in d ...
- 【python之路29】python生成器generator与迭代器
一.python生成器 python生成器原理: 只要函数中存在yield,则函数就变为生成器函数 #!usr/bin/env python # -*- coding:utf-8 -*- def xr ...
- Generator - Python 生成器
Generator, python 生成器, 先熟悉一下儿相关定义, generator function 生成器函数, 生成器函数是一个在定义体中存有 'yield' 关键字的函数. 当生成器函数被 ...
- python生成器原理剖析
python生成器原理剖析 函数的调用满足"后进先出"的原则,也就是说,最后被调用的函数应该第一个返回,函数的递归调用就是一个经典的例子.显然,内存中以"后进先出&quo ...
- 什么是Python生成器?与迭代器的关系是什么?
生成器是一个特殊的迭代器,它保存的是算法,每次调用next()或send()就计算出下一个元素的值,直到计算出最后一个元素,没有更多的元素时,抛出StopIteration.生成器有两种类型,一种是生 ...
- Python 生成器与迭代器 yield 案例分析
前几天刚开始看 Python ,后因为项目突然到来,导致Python的学习搁置了几天.然后今天看回Python 发现 Yield 这个忽然想不起是干嘛用的了(所以,好记性不如烂笔头.).然后只能 花点 ...
随机推荐
- Linux及安全实践三——程序破解
Linux及安全实践三--程序破解 一.基本知识 常用指令机器码 指令 作用 机器码 nop 无作用(no operation) 90 call 调用子程序,子程序以ret结尾 e8 ret 返回程序 ...
- PyQt5整体介绍
1 PyQt5整体介绍 PyQt5是基于图形程序框架Qt5的Python语言实现,由一组Python模块构成. PyQt5的官方网站是:www.riverbankcomputing.co.uk. Py ...
- c++11 时间类 std::chrono
概念: chrono库:主要包含了三种类型:时间间隔Duration.时钟Clocks和时间点Time point. Duration:表示一段时间间隔,用来记录时间长度,可以表示几秒钟.几分钟或者几 ...
- C++析构函数的自动调用(用于父类指针指向子类对象,内存泄漏问题)
class A {public:A() { printf("A \n"); }~A() { printf(" ~A \n"); } // 这里不管写不写virt ...
- 阿里云上部署了zabbix,突然无法收到报警邮件的解决办法
在阿里云上部署了zabbix,一直能正常接收到zbx发来的报警邮件(报警邮箱是163的),不知是什么原因,突然无法接收到报警邮件了. 但在服务器上手动执行echo "hello"| ...
- Hadoop基础-序列化与反序列化(实现Writable接口)
Hadoop基础-序列化与反序列化(实现Writable接口) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.序列化简介 1>.什么是序列化 序列化也称串行化,是将结构化 ...
- 通过TodoList案例对比Vue.js的MVVM设计模式与JQuery的MVP设计模式
Vue MVVM设计模式: 在使用vue进行编程时,不会再涉及到DOM的操作,取而代之的是修改数据层,当把数据进行变更的时候,vue之中它的底层会自动的根据数据的不同帮助我们去重新渲染页面. 编码时不 ...
- bzoj千题计划140:bzoj4519: [Cqoi2016]不同的最小割
http://www.lydsy.com/JudgeOnline/problem.php?id=4519 最小割树 #include<queue> #include<cstdio&g ...
- DFS——>记忆化搜索——>动态规划
以洛谷P1802 5倍经验日 为例 https://www.luogu.org/problem/show?pid=1802 题目背景 现在乐斗有活动了!每打一个人可以获得5倍经验!absi2011却 ...
- 把一个IEEE754浮点数转换为IBM370浮点数的C#代码
把一个IEEE754浮点数转换为IBM370浮点数的C#代码. 在这个网页上有古老的IBM370浮点格式的说明. // http://en.wikipedia.org/wiki/IBM_Floatin ...