yield生成器函数
生成器有主要有四种方法:
next()执行函数,直到遇到下一个yield为止,并返回值send(value)为生成器发送一个数值,next()方法就相当于send(None)close()终止生成器throw(exc[exc_value,[exc_tb]])在生成器yield处引发一个异常,close()相当于引发一个GeneratorExit异常
输出型
一个斐波那契数列的例子
def fibonacci():
a, b = 0, 1
while True:
yield b
a, b = b, a+b
a = fibonacci()
for i in range(10):
print a.next()
运行结果:
1
1
2
3
5
8
13
21
34
55
python2.7 fb.py 0.01s user 0.01s system 94% cpu 0.025 total
生成器每次生成一个数字并返回。
接收输入型
def reciver():
while True:
n = (yield)
print "Got %s" % n
r = reciver()
r.next()
r.send(1)
r.send('2')
运行结果:
Got 1
Got 2
python2.7 rec.py 0.01s user 0.01s system 86% cpu 0.023 total
这个模型可以看做接收外部数据并进行处理。
输入输出型
生成器能否接收send传送来的数据,处理之后再返回呢?答案是肯定的
def get():
n = 0
result = None
while True:
n = (yield result)
result = n*10
t = get()
t.next()
for i in range(10):
print t.send(str(i))
t.close()
运行结果
0000000000
1111111111
2222222222
3333333333
4444444444
5555555555
6666666666
7777777777
8888888888
9999999999
python2.7 problem.py 0.02s user 0.00s system 83% cpu 0.024 total
传递参数
当然生成器函数也是函数,也支持参数传递。
def countdown(n):
print("counting down from %d" % n)
while n > 0:
yield n
n -= 1
return
c = countdown(10)
print c.next()
print c.next()
for i in countdown(10):
print i
print sum(countdown(10))
运行结果
counting down from 10
10
9
counting down from 10
10
9
8
7
6
5
4
3
2
1
counting down from 10
55
从上面的例子我们发现,每次调用生成器函数要先执行next()函数,然后才能发送数据, 如果忘记的话就会报错。
TypeError: can't send non-None value to a just-started generator
这个有人容易忘记。这怎么办?用装饰器来自动执行:
def coroutine(func):
def start(*args,**kwargs):
g = func(*args,**kwargs)
g.next()
return g
return start
@coroutine
def reciver():
while True:
n = (yield)
print "Got %s" % n
r = reciver()
r.send(1)
r.send('2')
yield生成器函数的更多相关文章
- 解决dva dispatch yield生成器函数中异常中断,无法继续调用的问题
在生成器函数中,哪怕是一点报错.都会导致程序无法再次执行.这是yield的特性导致的.最简单的解决方案,就是将所有报错回避,并且做好交互. 0.dva全局管理出错状态 https://dvajs.co ...
- 020.Python生成器和生成器函数
一 生成器 1.1 基本概念 元组推导式是是生成器(generator) 生成器定义 生成器可以实现自定义,迭代器是系统内置的,不能够更改 生成器的本质就是迭代器,只不过可以自定义. 生成器有两种定义 ...
- Python 3 中生成器函数yield表达式的使用
生成器函数或生成器方法中包含了一个yield表达式.调用生成器函数时,会返回一个迭代子,值从迭代子中每次提取一个(通过调用其__next__()方法).每次调用__next__()时,生成器函数的yi ...
- 生成器函数yield
先看一个栗子: # -*- coding:UTF-8 -*- __autor__ = 'zhouli' __date__ = '2018/12/6 21:08' # 生成器函数,函数里只要有yield ...
- ES6学习笔记<三> 生成器函数与yield
为什么要把这个内容拿出来单独做一篇学习笔记? 生成器函数比较重要,相对不是很容易理解,单独做一篇笔记详细聊一聊生成器函数. 标题为什么是生成器函数与yield? 生成器函数类似其他服务器端语音中的接口 ...
- 巨蟒python全栈开发-第12天 生成器函数 各种推导式 yield from
一.今日主要内容总览(重点) 1.生成器(目的:帮助我们创建对象) (1)生成器的本质就是迭代器 (2)一个一个的创建对象 (3)创建生成器的方式: 1.生成器函数 2.通过生成器表达式来获取生成器 ...
- ES6笔记(5)-- Generator生成器函数
系列文章 -- ES6笔记系列 接触过Ajax请求的会遇到过异步调用的问题,为了保证调用顺序的正确性,一般我们会在回调函数中调用,也有用到一些新的解决方案如Promise相关的技术. 在异步编程中,还 ...
- yield生成器及字符串的格式化
一.生成器 def ran(): print('Hello world') yield 'F1' print('Hey there!') yield 'F2' print('goodbye') yie ...
- python迭代器和生成器(3元运算,列表生成式,生成器表达式,生成器函数)
1.1迭代器 什么是迭代器: 迭代器是一个可以记住遍历的位置对象 迭代器对象从集合的第一个元素元素开始访问,直到所有元素被访问完结束,迭代器只能往前不会后退. 迭代器有两个基本方法:iter ,nex ...
随机推荐
- jquery树形菜单
转自:http://keleyi.com/dev/3068696139522ae4.htm 代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1 ...
- 160308、java排序(形如1.1、1.2.1)
package com.rick.sample; import java.util.ArrayList; import java.util.Collections; import java.uti ...
- VMware虚拟机下安装CentOS7.0超详细图文教程
1.本文说明: 官方的第一个文本档案.也就是0_README.txt,大概意思是这样(渣翻译,但是大概意思还是有的). CentOS-7.0-1406-x86_64-DVD.iso:这个镜像(DVD ...
- HDU3342有向图判圈DFS&&拓扑排序法
HDU3342 Legal or Not 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3342 题目意思:一群大牛互相问问题,大牛有不会的,会被更厉害 ...
- Net Core MVC6 RC2 启动过程分析
入口程序 如果做过Web之外开发的人,应该记得这个是标准的Console或者Winform的入口.为什么会这样呢?.NET Web Development and Tools Blog ASP.NET ...
- 基于spring的quartz定时框架,实现简单的定时任务功能
在项目中,经常会用到定时任务,这就需要使用quartz框架去进行操作. 今天就把我最近做的个人主页项目里面的定时刷新功能分享一下,很简单. 首先需要配置一个配置文件,因为我是基于spring框架的,所 ...
- 出现unmapped spring configuration files found
intell idea启动出现unmapped spring configuration files found提示. 把spring里面的内容都打勾.
- 剑指Offer——数组中出现次数超过一半的数字
题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2 ...
- js 获取Array数组 最大值 最小值
https://stackoverflow.com/questions/1669190/find-the-min-max-element-of-an-array-in-javascript // 错误 ...
- linux物理页面的换入换出简析
2017-04-25 我们都知道,现代操作系统使用分页机制和虚拟内存,同时为了提高物理页面的利用率,采用了请求调页的机制,即物理内存的分配只有在真正需要的时候才会进行,比如发生了真正的读写操作,而普通 ...