深入理解python的產生器運算式和列表解析__python

來源:互聯網
上載者:User
前言

      沒有用過的東西,沒有深刻理解的東西很難說自己會,而且被別人一問必然破綻百出。雖然之前有接觸過python協程的概念,但是只是走馬觀花,這兩天的一次交談中,別人問到了協程,頓時語塞,死活想不起來曾經看過的東西,之後突然想到了yield,但為時已晚,只能說概念不清,所以本篇先縷縷python的產生器和yield關鍵字 什麼是產生器 產生器是一個特殊的程式,可以被用作控制迴圈的迭代行為 產生器類似於傳回值為數組的一個函數,這個函數可以接收參數,可以被調用,但是,不同於一般的函數會一次性返回包含了所有數值的數組,產生器一次只產生一個值,這樣消耗的記憶體數量大大減少,而且允許調用函數可以很快的開始處理前幾個傳回值。因此,產生器看起來像一個函數但是表現的卻像一個迭代器。 python中的產生器

python提供了兩種基本的方式。 產生器函數:也是用def來定義,利用關鍵字yield一次返回一個結果,阻塞,重新開始 產生器運算式:返回一個對象,這個對象只有在需要的時候才產生結果


下面詳細講解:


產生器函數

為什麼叫產生器函數。因為他隨著時間的推移產生了一個數值隊列。一般的函數在執行完畢之後會返回一個值然後退出,但是產生器函數會自動掛起,然後重新拾起繼續執行,他會利用yield關鍵字關起函數,給調用者返回一個值,同時保留了當前的足夠多的狀態,可以使函數繼續執行。產生器和迭代協議是密切相關的,可迭代的對象都有一個__next()__成員方法,這個方法要麼返回迭代的下一項,要麼引起異常結束迭代。
為了支援迭代協議,擁有yield語句的函數被編譯為產生器,這類函數被調用時返回一個產生器對象,返回的對象支援迭代介面,即成員方法__next()__繼續從中斷處執行執行。

看下面的例子:

 # 計數器 def create_counter(n): print("create counter") while True: yield n print('increment n') n += 1 cnt = create_counter(2) print(cnt) print(next(cnt)) print(next(cnt)) print(next(cnt)) print(next(cnt)) # D:\Python\python\python-3.6.1\Python36-64\python.exe # <generator object create_counter at 0x0000000002271D00> # create counter # 2 # increment n # 3 # increment n # 4 # increment n # 5 


分析一下這個例子: 在create_counter函數中出現了關鍵字yield,預示著這個函數每次只產生一個結果值,這個函數返回一個產生器(通過第一行輸出可以看出來),用來產生連續的n值 在創造產生器執行個體的時候,只需要像普通函數一樣調用就可以,但是這個調用卻不會執行這個函數,這個可以通過輸出看出來 next()函數將產生器對象作為自己的參數,在第一次調用的時候,他執行了create_counter()函數到yield語句,返回產生的值2 我們重複的調用next()函數,每次他都會從上次被掛起的地方開始執行,直到再次遇到了yield關鍵字

為了更加深刻的理解,我們再舉一個例子。

 # 立方 def cube(n): for i in range(n): yield i ** 3 print(cube(5)) print(next(cube(5))) print(next(cube(5))) print(next(cube(5))) print("for迴圈") for i in cube(5): print(i) # D:\Python\python\python-3.6.1\Python36-64\python.exe # <generator object cube at 0x0000000001FA1D00> # 0 # 0 # 0 # for迴圈 # 0 # 1 # 8 # 27 # 64 

所以從理解函數的角度出發我們可以將yield類比為return,但是功能確實完全不同,在for迴圈中,會自動遵循迭代規則,每次調用next()函數,所以上面的結果不難理解。 產生器運算式:

產生器運算式來自於迭代和列表解析的組合,產生器運算式和列表解析類似,但是他使用圓括弧而不是方括弧括起來的。如下代碼:

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.