在跟著廖雪峰的博客學習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
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中文網其他相關文章!

Python适合数据科学、Web开发和自动化任务,而C 适用于系统编程、游戏开发和嵌入式系统。Python以简洁和强大的生态系统著称,C 则以高性能和底层控制能力闻名。

2小時內可以學會Python的基本編程概念和技能。 1.學習變量和數據類型,2.掌握控制流(條件語句和循環),3.理解函數的定義和使用,4.通過簡單示例和代碼片段快速上手Python編程。

Python在web開發、數據科學、機器學習、自動化和腳本編寫等領域有廣泛應用。 1)在web開發中,Django和Flask框架簡化了開發過程。 2)數據科學和機器學習領域,NumPy、Pandas、Scikit-learn和TensorFlow庫提供了強大支持。 3)自動化和腳本編寫方面,Python適用於自動化測試和系統管理等任務。

兩小時內可以學到Python的基礎知識。 1.學習變量和數據類型,2.掌握控制結構如if語句和循環,3.了解函數的定義和使用。這些將幫助你開始編寫簡單的Python程序。

如何在10小時內教計算機小白編程基礎?如果你只有10個小時來教計算機小白一些編程知識,你會選擇教些什麼�...

使用FiddlerEverywhere進行中間人讀取時如何避免被檢測到當你使用FiddlerEverywhere...

Python3.6環境下加載Pickle文件報錯:ModuleNotFoundError:Nomodulenamed...

如何解決jieba分詞在景區評論分析中的問題?當我們在進行景區評論分析時,往往會使用jieba分詞工具來處理文�...


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

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

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境