Python解析式、生成器

列表解析 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)}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章