python中的生成器(二)
一. 剖析一下生成器对象
先看一个简单的例子,我们创建一个生成器函数,然后生成一个生成器对象
def gen():
print('start ..')
for i in range(3):
yield i
print('end...')
G=gen()
print(type(G))
>>
<type 'generator'>
表示G是一个生成器对象,我们来剖析一下,里面到底有什么
print(dir(G)) >>['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__iter__', '__name__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'close', 'gi_code', 'gi_frame', 'gi_running', 'next', 'send', 'throw']
大家注意看有4个很特殊的函数close(),next(),send(),throw(),next()在python中的生成器(一)中已经介绍过了,今天我们就重点来说说send(),throw(),close()函数
1.send()函数
send()用于传递参数,实现与生成器的交互,当程序运行到receive=yield的时候 就会被挂起,等待生成器调用send方法,这个时候外部调用send函数,发送数据变量进来,数据变量就会传递到received
示例代码:
def echo():
while True:
received=yield
print('Receive:{}'.format(received)) Echo=echo()
next(Echo)
Echo.send('First')
Echo.send('Second')
>>
Receive:First
Receive:Second
a).echo函数里面一个死循环,里面有一行关键的代码,receive=yield 这个就是send函数从外部发送过来的入口.
b).外部函数一开始要生成一个生成器对象也就是Echo=echo()
c).然后很关键的一步就是next(Echo),一定要调用一次next函数,让生成器推进到第一条yield表达式那边
d).接下来我们就可以把yield操作和send操作结合起来,可以获取外界所输入的数据,然后用一套流程去进行处理
2.throw()函数
throw主要是向生成器发送一个异常,可以结束系统定义的异常(当然包括自定义的异常)
示例代码:
def gen():
while True:
try:
yield 'First'
yield 'Second'
except TypeError:
print('Catch the TypeError')
except ValueError:
print('Catch the ValueError') G=gen()
print(next(G))
G.throw(ValueError)
print(next(G))
>>
First
Catch the ValueError
Second
a).创建生成器对象G
b),执行next(G)并打印结果,我们会得到第一个yield里缓存的结果'First',并且停留在yield 'Second'之前
c).抛出一个异常类ValueError(注意ValueError是类不是字符串),当生成器收到异常直接跳过 yield 'Second'进入except部分,打印出'Catch the TypeError'
d).执行next(G)并打印结果,我们会回到while头部,并且消耗掉第一个yield 'Frist',执行yield 'Second'
3.close()函数
close用于停止生成器,如果停止之后再调用next,就会引发StopIteration错误
示例代码:
def echo():
while True:
received=yield
print('Receive:{}'.format(received)) try:
Echo=echo()
next(Echo)
Echo.close()
Echo.send('')
except StopIteration ,e:
print('Catch the StopIteration')
>>
Catch the StopIteration
当生成器对象Echo调用完close()之后,再调用send('123')就会抛出一个异常StopIteration,然后被我们捕捉到了
python中的生成器(二)的更多相关文章
- Python学习-39.Python中的生成器
先回顾列表解释 lista = range(10) listb = [elem * elem for elem in lista] 那么listb就将会是0至9的二次方. 现在有这么一个需求,需要存储 ...
- python中的生成器函数是如何工作的?
以下内容基于python3.4 1. python中的普通函数是怎么运行的? 当一个python函数在执行时,它会在相应的python栈帧上运行,栈帧表示程序运行时函数调用栈中的某一帧.想要获得某个函 ...
- python中的生成器(一)
我们先考虑一个场景: 有个情景需要循环输出1——10. 这里给两种方法: list1 = [1,2,3,4,5,6,7,8,9,10] for i in list1: print(i) for i i ...
- Python中的生成器与yield
对于python中的yield有些疑惑,然后在StackOverflow上看到了一篇回答,所以搬运过来了,英文好的直接看原文吧. 可迭代对象 当你创建一个列表的时候,你可以一个接一个地读取其中的项.一 ...
- 聊聊Python中的生成器和迭代器
Python中有两个重要的概念,生成器和迭代器,这里详细记录一下. 1. 生成器 什么是生成器呢? 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包 ...
- python中的生成器(generator)总结
1.实现generator的两种方式 python中的generator保存的是算法,真正需要计算出值的时候才会去往下计算出值.它是一种惰性计算(lazy evaluation). 要创建一个gene ...
- python学习之【第十三篇】:Python中的生成器
1.为什么要有生成器? 在Python中,通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅 ...
- python中的生成器、迭代器、闭包、装饰器
迭代器 迭代是访问集合元素的一种方式.迭代器是一个可以记住遍历的位置的对象.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退. 可迭代对象 以直接作用于 for ...
- python中的生成器和迭代器
前言: 我们来了解一下什么是python中生成器.了解一下python生成器是什么,以及生成器在python编程之中能起到什么样的作用. 定义: 生成器和迭代器 通过列表生成式,我们可以直接创建一个列 ...
随机推荐
- MSF漏洞攻击练习系统 – Metasploitable2
Metasploitable2 是Metasploit团队维护的一个集成了各种漏洞弱点的Linux主机(ubuntu)镜像,方便广大黑扩跟安全人员进行MSF漏洞测试跟学习,免去搭建各种测试环境.VMw ...
- 机器学习—集成学习(GBDT)
一.原理部分: 图片形式~ 二.sklearn实现: 可以看看这个:https://blog.csdn.net/han_xiaoyang/article/details/52663170 1.分类: ...
- [label][OS] 制作 U 盘安装 Windows 7
U盘安装完美的WIN7操作系统教程 [编辑] 请使用正版系统 http://item.jd.com/965031.html 以保证您的电脑信息安全 此教程适用与 win7及win8 准备工作 ...
- StringFormate使用
1常规类型的格式化 1.1显示不同转换符实现不同数据类型到字符串的转换 转换符 说明 示例 %s 字符串类型 “mingrisof” %c 字符类型 'm' %b 布尔类型 tru ...
- memory leak-----tomcat日志warn
web应用借助于结构:spring mvc + quartz结构,部署到tomcat容器时,shutdown时的error信息: appears to have started a thread na ...
- 【node错误】/usr/bin/env: node: No such file or directory
背景 安装了node后,执行npm run xxx的命令的时候,报错,提示如下: /usr/bin/env: node: No such file or directory 步骤 1. 什么玩意,执行 ...
- layou split 属性
layou split:true - 显示侧分栏
- MVC页面移除HTTP Header中服务器信息
默认情况下,每一个MVC请求的HTTP Header中都会包含着当前服务器的一些信息,出于安全还是性能还是处女座的强迫症等等,都想把这些信息移除掉,增加一些应用程序的神秘感,如下,默认情况下Chrom ...
- 安装OWA2013
首先可以参考以下博客进行安装 http://www.cnblogs.com/poissonnotes/p/3238238.html 需要特别注意的是,我的SHAREPOINT系统虽然是英文版的,但是同 ...
- Java50道经典习题-程序5 判断分数等级
题目:利用三元运算符来完成此题:从键盘录入一个整型的分数,没有负分满分为100分,学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示.分析:三元运算符的格式为:逻 ...