python生成器generator介紹
在跟著廖雪峰的博客學習python,看到生成器這一章節的時候,首先提到了generator 、yield,然後在搜索資料的時候,又查到了協程這一概念,這篇文章總結這幾個概念.
generator 從字面上理解,就是生成器,它的實作方式有兩種:
1、不同於列表產生器([]),而是用 ()來表示。 (原來這個叫做生成器表達式哦,哈哈)
存取方式,可以用for 循環來訪問,也可以用 .next 來存取。
N = ['Hello', 'World', 18, 'Apple', 'None'] hh = (s.lower() for s in N if isinstance(s,str) ==True)print hh#for item in hh:# print item#print hh.next()#print hh.next()#print hh.next()#print hh.next()
輸出結果
hello
world
apple
none
hh 是生成器回傳的值,類似一個陣列。支援 for循環訪問和 .next()訪問,有一點需要注意的是,for 循環執行完了之後就不能執行 hh.next()了,類似於指針到了最後,或者C++中迭代器指向了最後,再訪問就會出現錯誤。
2、用yield來產生 ,(叫做生成器函數)
無論用next() 和for 循環來調用,都是執行到了yield之後,返回 n值,然後將當前的狀態掛起,然後返回。
def create_counter(n):print "create counter"#while True:while False:yield nprint 'increment n'n += 1cnt = create_counter(2)#print cntfor item in cnt:print item#print next(cnt)#print next(cnt)#print cnt.next()#print cnt.next()
例如這個範例中,當印cnt的時候,
#說明這是一個,生成器。
當 為False的時候,只會印出 create counter
當為True的時候,用for 循環就會出現死循環的情況。
協程:
我知道有行程、執行緒的概念,但是協程是什麼東西,我還真是不知道
從技術的角度來說,「協程就是你可以暫停執行的函數」。如果你把它理解成“就像生成器一樣”,那麼你就想對了。這是在一篇文章上看到的。
python之所以執行效率高
1、為子程式切換不是執行緒切換,而是由程式本身控制,因此,沒有執行緒切換的開銷,和多執行緒比,線程數量越多,協程的效能優勢就越明顯。
2、執行的過程中不會涉及到鎖定機制。
附上一個簡單的生產者與消費者的例子:
def consumer(): r = ''while True: n = yield rif not n:returnprint('[CONSUMER] Consuming %s...' % n) time.sleep(1) r = '200 OK'def produce(c): c.next() n = 0while n < 5: n = n + 1print('[PRODUCER] Producing %s...' % n) r = c.send(n)print('[PRODUCER] Consumer return: %s' % r) c.close()if __name__=='__main__': c = consumer() produce(c)
1. consumer函數是一個generator。
2. c.send(None)其實等價於next(c),第一次執行時其實只執行到n = yield r就停止了,然後把r的值回傳給呼叫者。
3. yield r是一個表達式,透過send(msg)被賦值,而send(msg)是有回傳值的,回傳值為:下一個yield r表達式的參數,即為r 。
4. produce一旦生產了東西,透過c.send(n)切換到consumer執行。 consumer透過yield拿到訊息,處理,再透過yield把結果傳回。也就是說,c.send(1) 不但會給c 傳送一個數據,它還會等著下次yield 從c 中返回一個數據,它是有返回值的,一去一回才算完,拿到了傳回的資料(200 OK)才繼續下面執行。
5. 整個流程無鎖,由一個執行緒執行,produce和consumer協作完成任務,所以稱為“協程”,而非執行緒的搶佔式多任務。
說,就是yield r 是表達式,透過c.send 被賦值,然後傳回值為下一個為yield r 表達式的參數。
以上是python生成器generator介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

PHP適合網頁開發和快速原型開發,Python適用於數據科學和機器學習。 1.PHP用於動態網頁開發,語法簡單,適合快速開發。 2.Python語法簡潔,適用於多領域,庫生態系統強大。

PHP起源於1994年,由RasmusLerdorf開發,最初用於跟踪網站訪問者,逐漸演變為服務器端腳本語言,廣泛應用於網頁開發。 Python由GuidovanRossum於1980年代末開發,1991年首次發布,強調代碼可讀性和簡潔性,適用於科學計算、數據分析等領域。

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

在 Sublime Text 中運行 Python 代碼,需先安裝 Python 插件,再創建 .py 文件並編寫代碼,最後按 Ctrl B 運行代碼,輸出會在控制台中顯示。

在 Visual Studio Code(VSCode)中編寫代碼簡單易行,只需安裝 VSCode、創建項目、選擇語言、創建文件、編寫代碼、保存並運行即可。 VSCode 的優點包括跨平台、免費開源、強大功能、擴展豐富,以及輕量快速。

VS Code 可用於編寫 Python,並提供許多功能,使其成為開發 Python 應用程序的理想工具。它允許用戶:安裝 Python 擴展,以獲得代碼補全、語法高亮和調試等功能。使用調試器逐步跟踪代碼,查找和修復錯誤。集成 Git,進行版本控制。使用代碼格式化工具,保持代碼一致性。使用 Linting 工具,提前發現潛在問題。

在 Notepad 中運行 Python 代碼需要安裝 Python 可執行文件和 NppExec 插件。安裝 Python 並為其添加 PATH 後,在 NppExec 插件中配置命令為“python”、參數為“{CURRENT_DIRECTORY}{FILE_NAME}”,即可在 Notepad 中通過快捷鍵“F6”運行 Python 代碼。
