1. 程式人生 > >詳解Python中的生成器表達式(generator expression)

詳解Python中的生成器表達式(generator expression)

新元素 括號 tuple 列表推導式 特點 解析式 表達式 但是 bracket

  

  介紹

    1、生成器表達式(generator expression)也叫生成器推導式或生成器解析式,用法與列表推導式非常相似,在形式上生成器推導式使用圓括號(parentheses)作為定界符,而不是列表推導式所使用的方括號(square brackets)。

    2、與列表推導式最大的不同是,生成器推導式的結果是一個生成器對象。生成器對象類似於叠代器對象,具有惰性求值的特點,只在需要時生成新元素,比列表推導式具有更高的效率,空間占用非常少,尤其適合大數據處理的場合。

    3、使用生成器對象的元素時,可以根據需要將其轉化為列表或元組,也可以使用生成器對象的next()方法或者內置函數next()進行遍歷,或者直接使用for循環來遍歷其中的元素。但是不管用哪種方法訪問其元素,

      只能從前往後正向訪問每個元素,不能再次訪問

    4、已訪問過的元素,也不支持使用下標訪問其中的元素。當所有元素訪問結束以後,如果需要重新訪問其中的元素,必須重新創建該生成器對象,enumerate、filter、map、zip等其他叠代器對象也具有同樣的特點。

  

  

#1、創建生成器對象
g = ((i+2)**2 for i in range(10))
print g
#<generator object <genexpr> at 0x0000000003517798>

#2、將生成器對象轉換為元組
a = tuple(g)
print
a #(4, 9, 16, 25, 36, 49, 64, 81, 100, 121) #3、生成器對象已遍歷結束,沒有元素了 print list(g) #[] #4、重新創建生成器對象 g = ((i+2)**2 for i in range(10)) #5、使用生成器對象的next()方法獲取元素 print g.next() # 4 print g.next() # 9 # 6、使用函數next()獲取生成器對象中的元素 print next(g) # 16 g = ((i+2)**2 for i in range(10)) #7、使用循環直接遍歷生成器對象中的元素
for item in g: print item #8、 filter對象也具有類似的特點 x = filter(None, range(20)) print x # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] #9、map對象也具有類似的特點 x = map(str, range(20)) print x # [‘0‘, ‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘, ‘6‘, ‘7‘, ‘8‘, ‘9‘, ‘10‘, ‘11‘, ‘12‘, ‘13‘, ‘14‘, ‘15‘, ‘16‘, ‘17‘, ‘18‘, ‘19‘]

詳解Python中的生成器表達式(generator expression)