以下属于自我的理解,如果不太明白,别问我,我也很萌逼。
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 可以多个函数之间切换:
上面函数结果如图:
http://yxonic.blog.ustc.edu.cn/2015/07/python-asyncio/