生成器有主要有四种方法:

  • 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生成器函数的更多相关文章

  1. 解决dva dispatch yield生成器函数中异常中断,无法继续调用的问题

    在生成器函数中,哪怕是一点报错.都会导致程序无法再次执行.这是yield的特性导致的.最简单的解决方案,就是将所有报错回避,并且做好交互. 0.dva全局管理出错状态 https://dvajs.co ...

  2. 020.Python生成器和生成器函数

    一 生成器 1.1 基本概念 元组推导式是是生成器(generator) 生成器定义 生成器可以实现自定义,迭代器是系统内置的,不能够更改 生成器的本质就是迭代器,只不过可以自定义. 生成器有两种定义 ...

  3. Python 3 中生成器函数yield表达式的使用

    生成器函数或生成器方法中包含了一个yield表达式.调用生成器函数时,会返回一个迭代子,值从迭代子中每次提取一个(通过调用其__next__()方法).每次调用__next__()时,生成器函数的yi ...

  4. 生成器函数yield

    先看一个栗子: # -*- coding:UTF-8 -*- __autor__ = 'zhouli' __date__ = '2018/12/6 21:08' # 生成器函数,函数里只要有yield ...

  5. ES6学习笔记<三> 生成器函数与yield

    为什么要把这个内容拿出来单独做一篇学习笔记? 生成器函数比较重要,相对不是很容易理解,单独做一篇笔记详细聊一聊生成器函数. 标题为什么是生成器函数与yield? 生成器函数类似其他服务器端语音中的接口 ...

  6. 巨蟒python全栈开发-第12天 生成器函数 各种推导式 yield from

    一.今日主要内容总览(重点) 1.生成器(目的:帮助我们创建对象) (1)生成器的本质就是迭代器 (2)一个一个的创建对象 (3)创建生成器的方式: 1.生成器函数 2.通过生成器表达式来获取生成器 ...

  7. ES6笔记(5)-- Generator生成器函数

    系列文章 -- ES6笔记系列 接触过Ajax请求的会遇到过异步调用的问题,为了保证调用顺序的正确性,一般我们会在回调函数中调用,也有用到一些新的解决方案如Promise相关的技术. 在异步编程中,还 ...

  8. yield生成器及字符串的格式化

    一.生成器 def ran(): print('Hello world') yield 'F1' print('Hey there!') yield 'F2' print('goodbye') yie ...

  9. python迭代器和生成器(3元运算,列表生成式,生成器表达式,生成器函数)

    1.1迭代器 什么是迭代器: 迭代器是一个可以记住遍历的位置对象 迭代器对象从集合的第一个元素元素开始访问,直到所有元素被访问完结束,迭代器只能往前不会后退. 迭代器有两个基本方法:iter ,nex ...

随机推荐

  1. Excel单元格格式设置

    工作中遇到一些小问题: 例如办公自动化里的如何设置单元格格式 此格式分为两种:一种是样式上的格式 比如边框 行距字体等 第二种为数据格式: 比如每次我输入1000的话自动变红或者加粗字体 office ...

  2. sql语句中left join、right join 以及inner join之间的使用与区别

    sql语句中left join.right join 以及innerjoin之间的使用与区别 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录  right join( ...

  3. CH5E01 乌龟棋【线性DP】

    5E01 乌龟棋 0x5E「动态规划」练习 描述 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物.乌龟棋的棋盘是一行N 个格子,每个格子上一个分数(非负整数).棋盘第1 格是唯一的起点,第N 格是终点 ...

  4. Design and Architectural Goals

    w动态实例化-轻量级,组件间依赖程度.专一性-复用性.灵活性. https://www.codeigniter.com/userguide3/overview/goals.html http://co ...

  5. 用linux c求最大公约数

    我写了两中函数,一个是辗转相除法一个是更相减损法,主要代码如下: /*辗转相除法*/int gcd(int a, int b) { ) { return b; } else { return gcd( ...

  6. 使用MFC做D3D的框架

    转载请注明出处http://www.cnblogs.com/CAION/p/3192111.html (程序运行时是和其他程序挺像 = =,但我保证这是原创的) 1.将D3D的初始化,渲染等等一些行为 ...

  7. Win32 配置文件用法

    #include "stdafx.h"#include <Shlobj.h>#include <Shlwapi.h> #pragma comment(lib ...

  8. Mybatis框架学习总结-Mybatis框架搭建和使用

    Mybatis介绍 Mybatis是一个支持普通SQL查询,存储过程,和高级映射的优秀持久层框架.Mybatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.Mybatis可以使 ...

  9. 0603-Zuul构建API Gateway-通过Zuul上传文件,禁用Zuul的Filter

    一.通过Zuul上传文件 参看地址:https://cloud.spring.io/spring-cloud-static/Edgware.SR3/single/spring-cloud.html#_ ...

  10. django【F和Q】

    一.F 案例每人增加500工资 ORM:UserInfo.objects.filter().update(salary=500) 这不行吧 SQL: update userinfo set salar ...