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生成器-博文读后感的更多相关文章

  1. python——生成器

    python——生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个 ...

  2. 小学生都能学会的python(生成器)

    小学生都能学会的python(生成器) 1. 生成器 生成器的本质就是迭代器. 生成器由生成器函数来创建或者通过生成器表达式来创建 # def func(): # lst = [] # for i i ...

  3. Python 生成器 (generator) & 迭代器 (iterator)

    python 生成器 & 迭代器 生成器 (generator) 列表生成式 列表生成式用来生成一个列表,虽然写的是表达式,但是储存的是计算出来的结果,因此生成的列表受到内存大小的限制 示例: ...

  4. python生成器学习

    python生成器学习: 案例分析一: def demo(): for i in range(4): yield i g=demo() g1=(i for i in g) #(i for i in d ...

  5. 【python之路29】python生成器generator与迭代器

    一.python生成器 python生成器原理: 只要函数中存在yield,则函数就变为生成器函数 #!usr/bin/env python # -*- coding:utf-8 -*- def xr ...

  6. Generator - Python 生成器

    Generator, python 生成器, 先熟悉一下儿相关定义, generator function 生成器函数, 生成器函数是一个在定义体中存有 'yield' 关键字的函数. 当生成器函数被 ...

  7. python生成器原理剖析

    python生成器原理剖析 函数的调用满足"后进先出"的原则,也就是说,最后被调用的函数应该第一个返回,函数的递归调用就是一个经典的例子.显然,内存中以"后进先出&quo ...

  8. 什么是Python生成器?与迭代器的关系是什么?

    生成器是一个特殊的迭代器,它保存的是算法,每次调用next()或send()就计算出下一个元素的值,直到计算出最后一个元素,没有更多的元素时,抛出StopIteration.生成器有两种类型,一种是生 ...

  9. Python 生成器与迭代器 yield 案例分析

    前几天刚开始看 Python ,后因为项目突然到来,导致Python的学习搁置了几天.然后今天看回Python 发现 Yield 这个忽然想不起是干嘛用的了(所以,好记性不如烂笔头.).然后只能 花点 ...

随机推荐

  1. 【bzoj3573】 Hnoi2014—米特运输

    http://www.lydsy.com/JudgeOnline/problem.php?id=3573 (题目链接) 题意 题意是这道题最大的难点→_→ Solution 沙茶树形dp,考虑一定会存 ...

  2. 20165218 《网络对抗技术》Exp2 后门原理与实践

    Exp2 后门原理与实践 准备工作 1. 查看Linux和Win的IP地址,ping通 Linux地址 Win7地址 ping 2.下载ncat并装载到win7主机 3.下载socat并装载到win7 ...

  3. Centos7搭建redis集群及安装sentinel

    准备三个节点,系统版本为CentOS7.3 11.0.8.15 master 11.0.8.16 slave01 11.0.8.17 slave02 1.安装redis # yum install - ...

  4. 《剑指offer》— JavaScript(22)从上往下打印二叉树

    从上往下打印二叉树 题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 思路 借助两个辅助队列,一个用来存放结点,一个用来存放结点值: 先将根节点加入到队列中,然后遍历队列中的元素,遍历 ...

  5. POI导入excel文件2

    POI上传到服务器读取excel文件1中已经介绍了上传文件和导入excel所有的内容http://www.cnblogs.com/fxwl/p/5896893.html , 本文中只是单单读取本地文件 ...

  6. python的list()列表数据类型的方法详解

    一.列表 列表的特征是中括号括起来的,逗号分隔每个元素,列表中的元素可以是数字或者字符串.列表.布尔值......等等所有类型都能放到列表里面,列表里面可以嵌套列表,可以无限嵌套 字符串的特征是双引号 ...

  7. 「Vue」程序式路由导航用法

    1.button发起点击请求<mt-button type='primary' size='large' plain @click="topdcmt(id)">商品评论 ...

  8. GetVersionEx 正确获取windows10版本

    vs2008直接将下面xml保存成文件添加到资源文件 vc的话insert-->Resource-->Custom-->输入24,ok-->id改为1-->把下面内容保存 ...

  9. windows下64位python的安装及机器学习相关包的安装(实用)

    开通博客已久,想了好久决定写个基础的安装教程,望后人少走弯路,也借此希望跟大家多多交流.文中给出的链接默认是基于对python2.7的前提下的包. 1.首先下载64位Python包,进行安装(默认py ...

  10. Android SDK更新失败对策

    Fetching https://dl-ssl.google.com/android/repository/addons_list-2.xml Failed to fetch URL https:// ...