列表解析 List Comprehension
舉例
生成一個列表,元素0-9,對每一個參數自增1後求平方返回新列表 l1 = list(range(10)) l2 = [] for i in l1: l2.append((i+1)**2) print(l2) - 列表解析式 l1 = list(range(10)) l2 = [(i+1)**2 for in l1] print(l2) print(type(l2))
語法
[返回值 for 元素 in 可迭代對象 if 條件]
- 使用中括號 [], 內部是for循環,if條件語句可選
- 返回一個新的列表
列表解析式是一種語法糖
編譯器會優化,不會因爲簡寫而影響效率,反而因優化提高了效率
減少工作量,減少出錯(可能吧)
簡化了代碼,單可讀性增強(可能吧)
生成器表達式Generator expression
語法
(返回值 for 元素 in 可迭代對象 if 條件)
- 列表解析式的中括號換成小括號就行了
- 返回一個生成器
和列表解析式的區別
生成器表達式是按需計算(或稱爲惰性求值,延遲計算),需要的時候才計算值
列表解析式是立即返回值
生成器
可迭代對象
迭代器
生成器表達式
- 舉例
g = ("{:04}".format(i) for i in range(1,11))
nest(g)
for x in g:
print(x)
print("______")
for x in g:
print(x)
總結
- 延遲計算
- 返回迭代器,可以迭代
- 從前到後走完一遍後,不能回頭
和列表解析式的對比
- 計算方式
- 生成器表達式延遲計算,列表解析式立即計算
- 內存佔用
- 單從返回值本身來說,生成器表達式省內存,列表解析式返回新的列表
- 生成器沒有數據,內存佔用極少,但是使用的時候,雖然一個個返回數據,但是合起來佔用的內存也差不多
- 列表解析式構造新的列表需要佔用內存
- 計算速度
- 單看計算時間,生成器表達式耗時非常短,列表解析式耗時長
- 但是生成器本身並沒有返回任何值,至返回了一個生成器對象
- 列表解析式構造並返回一個新的列表
集合解析式
語法
{返回值 for 元素 in 可迭代對象 if 條件}
- 列表解析式的中括號換成大括號{} 就行了
- 立即返回一個集合
用法
{(x, x+1) for x in range(10)}
{[x] for x in range(10)} #錯誤,注意集合特性
字典解析式
語法
{返回值 for 元素 in 可迭代對象 if 條件}
- 列表解析式的中括號換成大括號{}就行了
- 使用key.value形式
- 立即返回一個字典
用法
{x:(x,x+1) for x in range(10)}
{x:[x,x+1] for x in range(10)}
{(x,):[x,x+1] for x in range(10)}
{[x]:[x,x+1] for x in rnage(10)} #錯誤,注意字典特性
{chr(0x41 + x ):x**2 for x in range(10)}
{str(x):y for x in range(3) for y in range(4)}