協程函數

# yield把函數變成迭代器# return的返回值只返回一次,yield返回屢次# 函數在暫停以及繼續下一次運行時的狀態是有yield保存# 協程函數# def eater(name):#     print('%s start to eat food' %name)#     while True:#         food=yield#         print('%s get %s, to start eat' %(name,food))##     print("done")## e=eater('鋼蛋')# # print(e)## next(e)# e.send("包子")# e.send("飯")# print(next(e))# 用列表# def eater(name):#     print('%s start to eat food' %name)#     food_list=[]#     while True:#         food=yield food_list#         print('%s get %s, to start eat' %(name,food))#         food_list.append(food)##     print("done")## e=eater('鋼蛋')# print(next(e))# print(e.send("包子"))# print(e.send("飯"))# 課迭代的:對象下有__iter__方法的都是可迭代的對象# 迭代器:對象.__iter__()獲得的結果就是迭代器# 迭代器的特性:# 迭代器.__next__()取下一個值# 優勢:# 一、提供了一種統一的迭代對象的方式,不依賴於索引# 二、惰性計算# 缺點:# 一、沒法獲取迭代器的長度# 二、一次性的,只能日後取值,不能往前退,不能像索引那樣取某個位置的值# 生成器:函數內帶有yield,那麼這個函數的執行結果就是生成器# 生成器本質就是迭代器# def func():#     n=0#     while n<5:#         yield n#         n+=1# g=func()# print(next(g))# print(next(g))## for i in g:#     print(i)# 總結yield的功能:# 一、至關於把__iter__和__next__方法封裝到函數內部# 二、與return比,return只能返回一次,而yield能返回屢次# 三、函數暫停已經繼續運行的狀態是經過yield保存的# yield的表達式形式:# food=yield# def eater(name):#     print('%s start to eat' %name)#     food_list=[]#     while True:#         food=yield food_list#         print('%s eat %s' %(name,food))#         food_list.append(food)## def aa# e=eater('zhejiangF4')# print(next(e))# e.send("大便")# e.send與next(e)的區別# 一、若是函數內yield是表達式形式,那麼必須先next(e)# 二、兩者的共同之處可讓函數在上次暫停的位置,繼續運行,不同的地方在於send在觸發# 下一次代碼的執行時,會順便給yield傳一個值# 我想不用加next,就能傳參數# def init(func):#     def wrapper(*args,**kwargs):#         res=func(*args,**kwargs)#         next(res)#         return res # 返回 next(res),就是執行(return food_list)的下一步#     return wrapper## @init #eater=init(eater)# def eater(name):#     print('%s start to eat' %name)#     food_list=[]#     while True:#         food=yield food_list # 從return res取值 food=yield food_list意思是return food_list(只執行一次)+food=yield#         print('%s eat %s' %(name,food))#         food_list.append(food)### e=eater('zhejiangF4') #wrapper('zhejiangF4')# # print(next(e))# e.send("大便")# e.send("小便")# 爬網頁,不斷地打開不一樣的URL# from urllib.request import urlopen# def get():#     while True:#         url=yield#         res=urlopen(url).read()#         print(res)## g=get()# next(g) # 讓光標停到url=yield# g.send('http://www/python.org') # 爲了傳值到URL# 協程函數## 把etc目錄下,到root的文件的路徑都打印出來,# 在虛擬機輸入# grep -rl 'root' /etc# 就能夠獲得結果,可是用PYTHON,須要下面的作法# 先寫流程:# def search():#     '找到文件的絕對路徑'#     pass## def opener():#     '打開文件,獲取文件句柄'#     pass## def cat():#     '讀取文件內容'#     pass## def grep():#     '過濾一行中有無python'#     pass## def printer():#     '打印包含python的路徑'#     pass## 在電腦運行中,輸入import os# os.walk('c:\\egon'')# 或# os.walk(r'c:\egon'') # r表明右邊的都是普通字符,沒有轉譯符# g=os.walk(r'c:\egon'')# next(g)# next(g)# 咱們發現第一個值與第3個值拼接就獲得文件的絕對路徑# import os## def search():#     while True:#         dir_name=yield#         g=os.walk(dir_name)#         for i in g:#             # print(i)#             for j in i[-1]:#                 file_path='%s\\%s' %(i[0],j)#                 print(file_path)## e=search()# next(e)# e.send('c:\\egon')# 我想把包含某個字符串的文件路徑找出來import os,timedef init(func):    def wrapper(*args,**kwargs):        res=func(*args,**kwargs)        next(res)        return res    return wrapper@initdef search(target):    '找到一個絕對路徑,往下一個階段發一個'    while True:        dir_name=yield # 傳'c:\\egon'        print("車間search開始生產產品")        time.sleep(2)        g=os.walk(dir_name)        for i in g:            for j in i[-1]:                file_path='%s\\%s' %(i[0],j)                target.send(file_path) # 把file_path值傳到target中@initdef opener(target):    '打開文件,獲取文件內容'    while True:  # 循環地接上面程序的結果        file_path=yield # 上面的程序結果複製到file_path        print('車間opener開始生產產品:文件句柄')        time.sleep(2)        with open(file_path) as f:            target.send((file_path,f))@initdef cat(target):    '讀取文件內容'    while True:        file_path,f=yield        print('車間cat開始生產產品:文件的一行內容')        time.sleep(2)        for line in f:            target.send((file_path,line))@initdef grep(pattern,target):    '過濾一行內容中有沒有PYTHON'    while True:        file_path,line=yield        print('車間grep開始生產產品:包含python這一行內容的文件路徑')        time.sleep(2)        if pattern in line:            # target.send(line) # 這是文件內容的行,不是初始要求的帶有某個字符串的文件路徑            target.send(file_path)@initdef printer():    '打印文件路徑'    while True:        file_path=yield        print('車間printer開始生產產品:獲得最終產品')        time.sleep(2)        print(file_path)e=search(opener(cat(grep('python',printer()))))e.send('c:\\egon')# 以上是面向過程的編程(流水線),在設計程序時,須要把整個流程設計出來# 優勢:# 一、體系結構更加清晰# 二、簡化程序的複雜度# 缺點:# 可擴展性不好,一個部分改了,其餘所有要改,因此設計好不會常常改,常常更新的遊戲都不能用
相關文章
相關標籤/搜索