生成器表達式Generator expression
語法:
(返回值 for 元素 in 可迭代對象 if 條件)
列表解析式的中括號換成小括號就行了
返回一個生成器
和列表解析式的區別:
生成器表達式是按需計算(或稱惰性求值、延遲計算),需要的時候才計算值
列表解析式是立即返回值
生成器:
可迭代對象
迭代器
舉例說明:
g = ("{:04}".format(i) for i in range(1, 11)) print(type(g))# <class 'generator'> print(next(g)) for x in g: print(x) print("#"*50) for x in g: print(x) 總結: 可以延遲計算;返回迭代器,可以迭代;從前到後走完一遍後,不能回頭;
練習題:
it = ("{}".format(i+1) for i in range(2)) first = next(it) second = next(it) print(first) print(second) val = int(first) + int(second) #想一下這裏不用int()函數會怎麼樣? print(val)
和列表解析式的對比:
計算方式:
生成器表達式延遲計算,列表解析式立即計算;
內存佔用:
單從返回值本身來說,生成器表達式省內存,列表解析式返回新的列表;
生成器沒有數據,內存佔用極少,但是使用的時候,雖然一個個返回數據,但是合起來佔用的內存也差不多;
列表解析式構造新的列表需要佔用內存;
計算速度:
單看計算時間看,生成器表達式耗時非常短,列表解析式耗時長;
但是生成器本身並沒有返回任何值,只是返回了一個生成器對象;
列表解析式構造並返回了一個新的列表;
集合解析式:
語法:
{返回值 for 元素 in 可迭代對象 if 條件}
列表解析式的中括號換成花括號{}就行了
立即返回一個集合
用法:
{(x, x + 1) for x in range(10)}
字典解析式:
語法:
{返回值 for 元素 in 可迭代對象 if 條件}
列表解析式的中括號換成花括號{}就行了
使用key:value形式
立即返回一個字典
用法:
print({x: (x, x+1) for x in range(10)}) print({x: [x, x+1] for x in range(10)}) print({(x): [x, x+1] for x in range(10)}) # print({[x]: [x, x+1] for x in range(10)})#####??????????? print({chr(0x41+x): x**2 for x in range(10)}) print({str(x): y for x in range(3) for y in range(4)})
print({str(x): y for x in range(3) for y in range(4)}) #會輸出多少個元素???