1. 程式人生 > >2.2.2 生成器推導式

2.2.2 生成器推導式

列表 遍歷 ner ant 序列 方法 tor 知識 ext

  從形式上看,生成器推導式與列表推導式非常接近,只是生成器推導式使用圓括號而不是列表推導式使用的方括號。與列表推導式不同的是,生成器推導式的結果是一個生成器對象,而不是列表,也不是元組。使用生成器對象的元素是,可以根據需要將其轉化為列表或元組,也可以使用生成器對象的__next__()方法或者內置函數next()進行遍歷,或者直接將其作為叠代器對象來使用。但是不管哪種方法訪問其元素,當所有元素訪問結束以後,如果需要重新訪問其中的元素,必須重新創建該生成器對象。

 1 >>> g = (( i + 2 ) ** 2 for i in range(10))     #創建生成器對象
2 >>> g 3 <generator object <genexpr> at 0x00000000035414C0> 4 >>> 5 >>> tuple(g) #將生成器對象轉換為元組 6 (4, 9, 16, 25, 36, 49, 64, 81, 100, 121) 7 >>> 8 >>> list(g) #生成器對象已遍歷結束,已經沒有元素了 9 [] 10 >>> 11 >>> g = (( i + 2 ) ** 2 for
i in range(10)) 12 >>> 13 >>> g.__next__() #使用生成器對象的__next__()方法獲取元素 14 4 15 >>> g.__next__() #獲取下一個元素 16 9 17 >>> 18 >>> next(g) #使用內置函數next()獲取生成器對象中的元素 19 16 20 >>> next(g) #獲取下一個元素 21 25 22
>>> 23 >>> 24 >>> 25 >>> g = (( i + 2 ) ** 2 for i in range(10)) 26 >>> 27 >>> for item in g: #使用循環直接遍歷生成器對象中的元素 28 print(item,end= ) 29 30 31 4 9 16 25 36 49 64 81 100 121 32 >>>

  小提示:

    (1)生成器對象具有惰性求值的特點,只在需要時返回元素,比列表推導式具有更高的效率,尤其適合大量數據的遍歷。

  拓展知識:

    生成器對象。包含yield語句的函數也可以用來創建可叠代的生成器對象。下面的diamante演示了如何使用生成器來生成斐波那契數列。

 1 >>> def f():
 2     a,b = 1,1                  #序列解包,同時為多個元素賦值
 3     while True:
 4         yield a                #暫停執行,需要時再產生一個新元素
 5         a,b = b,a + b          #序列解包,繼續生成新元素
 6 
 7         
 8 >>> 
 9 >>> a = f()                    #創建生成器對象
10 
11 >>> for i in range(10):        #獲取斐波那契數列中前10個元素
12     print(a.__next__(),end =  )
13 
14     
15 1 1 2 3 5 8 13 21 34 55 
16 >>> 
17 >>> 
18 >>> 
19 >>> 
20 >>> 
21 >>> for i in f():              #獲取斐波那契數列中第一個大於100的元素
22     if i > 100:
23         print(i)
24         break
25 
26     
27 144
28 >>> 
29 >>> a = f()
30 >>> next(a)                    #使用內置函數next()獲取生成器對象中的元素
31 1
32 >>> 
33 >>> next(a)                    #每次獲取新元素是,由yield語句返回。
34 1
35 >>> 
36 >>> a.__next__()
37 2
38 >>> 

2.2.2 生成器推導式