美文网首页
关于yield与 yield from的理解

关于yield与 yield from的理解

作者: 夏树的宝马 | 来源:发表于2017-09-04 13:06 被阅读356次

以下属于自我的理解,如果不太明白,别问我,我也很萌逼。

def func(n):
    '''
    yield 的 next和send都能调用它执行,但是初始化后send不能传一个非None的值,
    因为send传入的位置是yield 那里所以需要先调用一次next
    :param n:
    :return:
    '''
    for i in range(0,n):
        arg=yield i
        print('fncv',arg)
f=func(10)
print(f.__next__())
print(f.send(100))
此段  来着 python基础教程
def repeater(value):
    while True:
        new=(yield value)
        if new is not None:
            value=new

r=repeater(43)
# next(r)
# yield 就是把yield右边的值返回出去,send 就是把yield右边的值变为 send的值,
# send只有当生成器被挂起才有意义,在启动时如果要调用send,可以传递None
print(r.send("xxx")) # 如果未挂起直接传递非None数据,就会报错
这里的return表示程序的结束
def read_yeild(filepath):
    with open(filepath,'r',encoding='utf-8') as f:
        while 1:
            bolk=f.readline()
            if bolk:
                yield bolk
            else:
                return

1.yield 主要用来生成一个生成器,每一次调用就返回一个特定的值,且只能在单一的生成器中循环,如:



def fab(max): 
n, a, b = 0, 0, 1 
while n < max: 
yield b # print b 
a, b = b, a + b 
n = n + 1 

def feibola_02(a,b,x):
    '''
    这个没有实现自己的想法
    :param a: 起始数字
    :param b: 第二个数字
    :param x: 需要传出多少个
    :return:
    '''
    yield a
    yield b
    x = x - 2
    while x and x>0:
        b,a,=b+a,b,
        x=x-1
        yield b



def feibola_03(a,b,x):
    '''
    :param a: 起始数字
    :param b: 第二个数字
    :param x: 需要传出多少个
    :return:
    '''
    i=1
    if x==i or i<x:
        yield a
    while i<x:
        yield b
        b,a,=b+a,b,
        i+=1

for i in feibola_03(1,1,6):
    print(i)

2.yield from 主要用于生成器之间的切换,比如我们在asyncio中使用的就是如此:

import asyncio

@asyncio.coroutine
def feibola(a,b,x,self_fun):
    x = x - 2
    while x:
        a,b=b,b+a
        x=x-1
        print(b,self_fun)
        yield from asyncio.sleep(0)
# 获取事件
loop=asyncio.get_event_loop()
# 创建期物
tasks=[feibola(1,1,5,'第一个'),feibola(100,100,5,'第二个')]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()

3.总结都是使用的生成器,只不过yield只在函数内部,yield from 可以多个函数之间切换:
上面函数结果如图:


asyncio异步图
http://yxonic.blog.ustc.edu.cn/2015/07/python-asyncio/

相关文章

网友评论

      本文标题:关于yield与 yield from的理解

      本文链接:https://www.haomeiwen.com/subject/kwisjxtx.html