python yield 与 yield from转

https://blog.csdn.net/chenbin520/article/details/78111399?locationNum=7&fps=1

2017年09月27日 12:02:08

阅读数:10674

1、yield使用 
1)函数中使用yield,可以使函数变成生成器。一个函数如果是生成一个数组,就必须把数据存储在内存中,如果使用生成器,则在调用的时候才生成数据,可以节省内存。 
2)生成器方法调用时,不会立即执行。需要调用next()或者使用for循环来执行。使用for循环不需要自己捕获StopIteration异常。使用next()方法,当生产器方法执行结束会抛出StopIteration异常(只要不是使用yield返回数据,都会抛出StopIteration异常)。 
示例:

def fib(max):
n,a,b = 0,0,1
while n < max:
yield b
a, b = b, a+b
n = n + 1
return 'done' n = fib(10)
for n1 in n:
print(n1)

3)yield不仅可以返回值,也可以接收值。下面面示例为生产消费模式。生产者生产一条记录,消费者消费一条记录。 
4)调用生成器send方法传递数据时,必须先调用next(c)或者c.send(None)方法,执行到yield语句,等待接收数据。否则会报错。 
以下代码为廖雪峰网站的示例https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432090171191d05dae6e129940518d1d6cf6eeaaa969000

def consumer():
r = ''
while True:
n = yield r
if not n:
return
print('[CONSUMER] Consuming %s...' % n)
r = '200 OK' def produce(c):
c.send(None) # 和next方法一样 获取下一个值,必须先使用None参数调用一次, 执行到yield
n = 0
while n < 5:
n = n + 1
print('[PRODUCER] Producing %s...' % n)
r = c.send(n) # 先发送值给yield语句,再执行到yield语句时返回
print('[PRODUCER] Consumer return:%s' % r)
c.close() c = consumer()
produce(c)

2、yield from的使用 
1)为了让生成器(带yield函数),能简易的在其他函数中直接调用,就产生了yield from。 
2)以下代码,htest为生成器,itest通过yield from 直接调用htest。这样itest也变成了一个生成器。创建itest实例不断的去获取数据,当生成器执行结束时,会抛出StopIteration异常。那这个异常是htest抛出的,还是itest抛出的。通过捕获异常,会发现其实是itest抛出异常,htest并不会抛出StopIteration异常。 
3)yield from 也可以返回值,通过变量接收。变量接收的值,即htest使用return返回的值。示例代码中,当i==3时,会直接使用return返回,这时val的值就是100;因为htest函数中不是使用yield返回值,所以itest会继续执行print(val)语句。itest代码执行完,然而并没有使用yield返回数据(htest中没有,itest中也没有),所以马上会抛出StopIteration异常)(如果在itest函数最后使用yield返回一个数据,就不会抛出异常)。

def htest():
i = 1
while i < 4:
n = yield i
if i == 3:
return 100
i += 1 def itest():
val = yield from htest()
print(val) t = itest()
t.send(None)
j = 0
while j < 3:
j += 1
try:
t.send(j)
except StopIteration as e:
print('异常了')

python yield 与 yield from转的更多相关文章

  1. 关于Python中的yield

    关于Python中的yield   在介绍yield前有必要先说明下Python中的迭代器(iterator)和生成器(constructor). 一.迭代器(iterator) 在Python中,f ...

  2. (转) Python Generators(生成器)——yield关键字

    http://blog.csdn.net/scelong/article/details/6969276 生成器是这样一个函数,它记住上一次返回时在函数体中的位置.对生成器函数的第二次(或第 n 次) ...

  3. Python生成器与yield

    列表推导与生成器表达式 当我们创建了一个列表的时候,就创建了一个可以迭代的对象: >>> squares=[n*n for n in range(3)] >>> f ...

  4. 【Python学习】yield send我就说这么多

    C#的yield已经忘得差不多了.又遇到python的yield.iterator def testYield(): print 'yield1' m = yield 1 print 'm =' , ...

  5. 从yield 到yield from再到python协程

    yield 关键字 def fib(): a, b = 0, 1 while 1: yield b a, b = b, a+b yield 是在:PEP 255 -- Simple Generator ...

  6. 深入理解Python中的yield和send

    send方法和next方法唯一的区别是在执行send方法会首先把上一次挂起的yield语句的返回值通过参数设定,从而实现与生成器方法的交互. 但是需要注意,在一个生成器对象没有执行next方法之前,由 ...

  7. Python:笔记(7)——yield关键字

    Python:笔记(7)——yield关键字 yield与生成器 所谓生成器是一个函数,它可以生成一个值的序列,以便在迭代中使用.函数使用yield关键字可以定义生成器对象. 一个例子 我们调用该函数 ...

  8. python协程--yield和yield from

    字典为动词“to yield”给出了两个释义:产出和让步.对于 Python 生成器中的 yield 来说,这两个含义都成立.yield item 这行代码会产出一个值,提供给 next(...) 的 ...

  9. Python生成器(yield)

    对于调用一个普通的Python函数,一般是从函数的第一行代码开始执行,结束于return语句.异常或者函数所有语句执行完毕.一旦函数将控制权交还给调用者,就意味着全部结束.函数中做的所有工作以及保存在 ...

随机推荐

  1. usg6000

    USG6000密码恢复 1.如果某个管理员遗忘了密码,可以使用其它高权限的管理员账号登录设备,然后修改密码.例如,管理员admin1的密码遗忘,此时可以由管理员admin登录设备,然后修改admin1 ...

  2. 20164301 Exp5 MSF基础应用

    Exp5 MSF基础应用 1. 实践内容 1.1一个主动攻击实践,如ms08_067,smb_delivery(唯一) 1.2 一个针对浏览器的攻击,如ms10_046: 1.3 一个针对客户端的攻击 ...

  3. Python读取和写入Excel文件

    制作Excel表 常用方法说明 Workbook类 Workbook类创建一个XlswWrite的Workbook对象,相当于创建一个excel表 And_worksheet()用来创建工作表,默认为 ...

  4. Python3字符串的操作

    红色字体代表必须记住 str.capitalize():把字符串的第一个字符大写 str.casefold():转换字符串中所有大写字符为小写,其他语言(非汉语或英文)中把大写转换为小写的情况只能用 ...

  5. python-闭包函数

    在函数编程中经常用到闭包.闭包是什么,它是怎么产生的及用来解决什么问题呢.给出字面的定义先:闭包是由函数及其相关的引用环境组合而成的实体(即:闭包=函数+引用环境)(想想Erlang的外层函数传入一个 ...

  6. git的基本应用(一)

    Git常用的命令: mkdir  文件夹名称           创建文件夹 git  init                     将文件夹交个git管理 ls -ah              ...

  7. 20175202 《Java程序设计》第八周学习总结

    20175202 2018-2019-2 <Java程序设计>第八周学习总结 教材知识点总结 1.泛型: 主要目的是可以建立具有类型安全的集合框架,如链表.散列映射等数据结构. 泛型类的声 ...

  8. 20175202 《Java程序设计》第六周学习总结

    20175202 2018-2019-2 <Java程序设计>第六周学习总结 教材知识点总结 1.内部类: Java支持在一个类中定义另一个类,称作内部类,包含内部类的类叫做外嵌类. 内部 ...

  9. DNS缓存服务器与转发服务器

    DNS缓存服务器与转发服务器 什么是缓存服务器(cache-only) 缓存服务器只需要根区域解析库文件,不包含任何其它区域解析库文件,这样的服务器就叫着缓存服务器.这样的服务器只有缓存搜寻结果的功能 ...

  10. EF Like

    public static class EdmxExtensions { [EdmFunction("YourEFModel", "String_Like")] ...