說說 Python 的生成器表達式

列表推導與生成器表達式均可以用於初始化元組、數組或其餘類型的序列。但列表推導須要先創建一個完整的列表,而後再把這 個列表傳遞到某個構造函數。而生成器表達式會逐個產出元素,這樣顯然可以節省內存。編程

列表推導寫法:數組

codes = [ord(symbol) for symbol in symbols]
x = tuple(codes)

生成器表達式寫法:函數

x = tuple(ord(symbol) for symbol in symbols)

從這個示例中能夠看出,生成器表達式比列表推導,減小了建立 codes 變量的內存損耗。code

還能夠看出生成器表達式的語法跟列表推導類似,但更簡潔,由於省略了方括號。這是生成器表達式的省略語法模式。內存

語法規則以下:class

  1. 若是生成器表達式是一個函數的惟一入參(好比示例中的 tuple 函數),那麼就能夠省略外層的圓括號。
  2. 若是生成器表達式不是一個函數的惟一入參,即這個函數有多個入參,那麼就必須使用圓括號包起生成器表達式,而後再傳入函數。

生成器表達式最大的好處就是減小內存損耗。假設咱們要計算兩個各含有 1000 個元素列表的笛卡兒積,使用生成器表達式就能夠減小一個包含 100 萬個元素的列表所佔用的內存。這一點很像 Java 中的流式編程。變量

好比說,有一個球袋,裏面裝着紅、黃與綠,三種顏色的球,每種球又分爲小、中、大三種規格。那麼這個球袋裏,就會有 9 種組合。構造函數

colors = ['紅', '黃', '綠']
sizes = ['小', '中', '大']
for ball in ('%s %s' % (c, s) for c in colors for s in sizes):
    logging.info(ball)

運行結果:語法

INFO - 紅 小
INFO - 紅 中
INFO - 紅 大
INFO - 黃 小
INFO - 黃 中
INFO - 黃 大
INFO - 綠 小
INFO - 綠 中
INFO - 綠 大
相關文章
相關標籤/搜索