日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

day4-生成器并行运算

發(fā)布時間:2025/3/19 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 day4-生成器并行运算 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、概述

  之前只是介紹生成器,那有些同學(xué)就說了,這個生成器除了能節(jié)省資源,提高工作效率,但是我們再哪些場景下可以用呢?在哪些地方可以體現(xiàn)出它的價值呢?下面我們來逐一解答這些疑問。

二、生成器執(zhí)行原理

1、執(zhí)行原理

def consumer(name):print("%s 準(zhǔn)備吃包子啦!"%name)while True:baozi = yieldprint("包子[%s]來了,被[%s]吃了"%(baozi,name))c = consumer("zhangqigao") c.__next__()#輸出 zhangqigao 準(zhǔn)備吃包子啦!

?如果我再加一個__next__()方法會有什么效果?

def consumer(name):print("%s 準(zhǔn)備吃包子啦!"%name)while True:baozi = yieldprint("包子[%s]來了,被[%s]吃了"%(baozi,name))c = consumer("zhangqigao") c.__next__() c.__next__()#輸出 zhangqigao 準(zhǔn)備吃包子啦! 包子[None]來了,被[zhangqigao]吃了

?很明顯,第一種情況沒有執(zhí)行"print("包子[%s]來了,被[%s]吃了"%(baozi,name))",這段代碼,接下來我們就來調(diào)試一下。

2、調(diào)試

第一步:生成一個生成器

第二步:執(zhí)行第一個__next__()方法進(jìn)入函數(shù),執(zhí)行到y(tǒng)ield時中斷,把返回值返回給baozi這個變量:

第三步:開始執(zhí)行下面的程序,也就執(zhí)行到了第二個__next__()方法,直接跳轉(zhuǎn)到y(tǒng)ield這邊,繼續(xù)上一次的中斷往下執(zhí)行,這樣就執(zhí)行了yield下面的程序,當(dāng)再次執(zhí)行到y(tǒng)ield關(guān)鍵字時,則繼續(xù)中斷,并且把返回值賦給baozi關(guān)鍵字,如果下面沒有其他程序,則程序結(jié)束。

?

小結(jié):

  • 用yield做生成器,你想把什么返回到外面,你就把yield關(guān)鍵字放在那里。
  • yield其實(shí)是保留了函數(shù)的中斷狀態(tài),返回當(dāng)前的值。
  • 如果yield沒有返回值,就返回一個空值None
  • 三、send()和__next__()方法的區(qū)別

    1、send()方法

    def consumer(name):print("%s 準(zhǔn)備吃包子啦!"%name)while True:baozi = yieldprint("包子[%s]來了,被[%s]吃了"%(baozi,name))c = consumer("zhangqigao") c.__next__() #不使用__next__()方法會報錯 b1 = "肉松餡" c.send(b1) #調(diào)用yield,同時給yield傳一個值 b2 = "韭菜餡" c.send(b2)#輸出 zhangqigao 準(zhǔn)備吃包子啦! 包子[肉松餡]來了,被[zhangqigao]吃了 包子[韭菜餡]來了,被[zhangqigao]吃了

    ?從上面可以看出send()和__next__()方法的區(qū)別:

  • __next__()只是調(diào)用這個yield,也可以說成是喚醒yield,但是不不會給yield傳值。
  • send()調(diào)用這個yield或者說喚醒yield同時,也活給yield傳一個值。
  • 使用send()函數(shù)之前必須使用__next__(),因為先要中斷,當(dāng)?shù)诙握{(diào)用時,才可傳值。
  • 為什么給消費(fèi)者傳值時,必須先執(zhí)行__next__()方法?

    因為如果不執(zhí)行一個__next__()方法,只是把函數(shù)變成一個生成器,你只有__next__()一下,才能走到第一個yield,然后就返回了,調(diào)用下一個send()傳值時,才會發(fā)包子。

    四、yield實(shí)現(xiàn)并行效果

    yield還有一個更強(qiáng)大的功能,就是:單線程實(shí)現(xiàn)并發(fā)效果。

    import timedef consumer(name):print("%s 準(zhǔn)備吃包子啦!"%name)while True:baozi = yieldprint("包子[%s]來了,被[%s]吃了"%(baozi,name))def producer(name):c = consumer("A")c2 = consumer("B")c.__next__()c2.__next__()print("老子準(zhǔn)備吃包子啦!")for i in range(10):time.sleep(1)print("做了一個包子,分兩半")c.send(i)c2.send(i)producer("zhangqigao")

    ?這個是生產(chǎn)者消費(fèi)者模式,這個也就是后面協(xié)程的效果,這個我們后續(xù)再講,先了解一下,生成器可以實(shí)現(xiàn)并發(fā)效果,極大的提高程序的運(yùn)行效率。

    ?

    轉(zhuǎn)載于:https://www.cnblogs.com/zhangqigao/articles/6621910.html

    總結(jié)

    以上是生活随笔為你收集整理的day4-生成器并行运算的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。