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编程之中能起到什么样的作用. 定义: 生成器和迭代器 通过列表生成式,我们可以直接创建一个列 ...
随机推荐
- JAVA常见面试题及解答
JAVA相关基础知识1.面向对象的特征有哪些方面 1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时 ...
- Sqlite 快速插入数据到本地表中
用原始Insert方法太慢,网上找到了https://www.cnblogs.com/yisen-code/p/6897524.html 思路是: 开启事务,开启预处理,然后把SQL用参数传入具体值来 ...
- CSS Animation triggers text rendering change in Safari
薄荷新首页上周五内测,花哥反馈在 MacBook Safari 浏览器下 鼠标移动到第一个商品的时候后面几个商品的文字会加粗.这是什么鬼??? 待我回到家打开笔记本,鼠标蹭蹭蹭的发现问题远不止如此: ...
- 转发一篇能看懂的关于ingress的说明
最近发现好多人问 Ingress,同时一直也没去用 Nginx 的 Ingress,索性鼓捣了一把,发现跟原来确实有了点变化,在这里写篇文章记录一下 https://mritd.me/2017/03/ ...
- Buffer Pool--内存总结2
按内存划分: 1.DATABASE CACHE 用于存放数据页面的缓冲区,8KB每页 2.各项组件 A)数据库连接(CONNECTION) B)通用数据,如果事务上下文,表和索引的元数据 C)执行计划 ...
- Oracle数据泵导出导入(expdp/impdp)
一.创建表空间 create tablespace atp logging datafile 'D:\oracle\oradata\orcl\atp.dbf' size 50m autoextend ...
- asp.net Frameset框架集的嵌套使用
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Frame.aspx.cs& ...
- [uwp]数据绑定再学习
在开始上代码前,先来假设这样一种情形: 出于某些原因,创建一个自定义控件(UserControl),然后为它定义一个依赖属性,这个属性有两个作用,一是调用控件方通过数据绑定技术为它赋值,二是控件内部的 ...
- Android - Telephony API 1.6
SignalStrength: 1. public int getGsmSignalStrength() : GSM Signal Strength, valid values are (0-31, ...
- order by 使用注意
create table user ( id int primary key, name varchar(11) , depid int ); create table dept( id int pr ...