Python產生器總結

來源:互聯網
上載者:User

標籤:prim   while   print   +=   SQ   區別   推導   長度   class   

什麼是產生器?

可以理解為一種資料類型,這種資料類型自動實現了迭代器協議,所以產生器就是一個可迭代對象。產生器可以說是提供了一種新的模式,那就是可以計算一部分,然後返回計算結果。但是保留了目前狀態,下次可在另外一個地方調用它,它會繼續按以前狀態繼續執行下去。這對於資料量很大的程式有很大的用處。總之就是很強~~

產生器總共有兩種產生方式:一種是聲產生器運算式,一種是產生器函數。

一、產生器運算式:

#產生器運算式和列表推導式非常相似,只要把列表推導式的【】改成()即可。g1=(i**2 for i in range(10))print(next(g1))  #0print(next(g1))   #1print(next(g1))   #4

二、產生器函數

  從格式上來說產生器函數和普通函數很相似,只有一點的區別。那就是產生器函數不需要return,而是用一個新的關鍵字yield。yield語句的作用主要有兩點。一是返回當前語句的技術結果,二是掛起函數的狀態,當下次調用時,從當前位置繼續執行。

  關於產生器函數我們先來看一個簡單的例子。

def g_func():    print(‘first‘)    yield 11111    print(‘second‘)    yield 22222    print(‘third‘)    yield 3333g=g_func()print(g)   #<generator object g_func at 0x0030E180>print(next(g))  #first11111print(next(g))#second22222print(next(g))#third3333

   接著我們來看一個進階一點的。現在有這樣我們想產生一個大於某個數的的所有質數。這個一看是產生的是一個無窮的數列,所以正常方法是行不通的。就算是產生一個有窮的的序列,一旦我們的序列長度很大,直接產生這對記憶體佔用也是巨大的,但是我們的產生器就可以完美解決這個問題。我們可以產生一個產生器,需要多少取多少即可。

import mathdef is_prime(n):    for i in range(2,int(math.sqrt(n))+1):        if n <= 1:               return False        if n%i==0:            return False    return Truedef creat_prime(n):    while True:        if is_prime(n):            yield print(n)        n+=1g=creat_prime(10)for i in range(100):    next(g)

 

 

Python產生器總結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.