以下屬于自我的理解买窟,如果不太明白鳍侣,別問我党巾,我也很萌逼。
def func(n):
'''
yield 的 next和send都能調(diào)用它執(zhí)行溪掀,但是初始化后send不能傳一個(gè)非None的值,
因?yàn)閟end傳入的位置是yield 那里所以需要先調(diào)用一次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基礎(chǔ)教程
def repeater(value):
while True:
new=(yield value)
if new is not None:
value=new
r=repeater(43)
# next(r)
# yield 就是把yield右邊的值返回出去步鉴,send 就是把yield右邊的值變?yōu)?send的值揪胃,
# send只有當(dāng)生成器被掛起才有意義,在啟動(dòng)時(shí)如果要調(diào)用send氛琢,可以傳遞None
print(r.send("xxx")) # 如果未掛起直接傳遞非None數(shù)據(jù)喊递,就會(huì)報(bào)錯(cuò)
這里的return表示程序的結(jié)束
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 主要用來生成一個(gè)生成器,每一次調(diào)用就返回一個(gè)特定的值阳似,且只能在單一的生成器中循環(huán)骚勘,如:
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):
'''
這個(gè)沒有實(shí)現(xiàn)自己的想法
:param a: 起始數(shù)字
:param b: 第二個(gè)數(shù)字
:param x: 需要傳出多少個(gè)
: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: 起始數(shù)字
:param b: 第二個(gè)數(shù)字
:param x: 需要傳出多少個(gè)
: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 主要用于生成器之間的切換,比如我們?cè)赼syncio中使用的就是如此:
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()
# 創(chuàng)建期物
tasks=[feibola(1,1,5,'第一個(gè)'),feibola(100,100,5,'第二個(gè)')]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()
3.總結(jié)都是使用的生成器撮奏,只不過yield只在函數(shù)內(nèi)部俏讹,yield from 可以多個(gè)函數(shù)之間切換:
上面函數(shù)結(jié)果如圖:
asyncio異步圖
http://yxonic.blog.ustc.edu.cn/2015/07/python-asyncio/