標籤: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產生器總結