week03_python生成器

生成器表達式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)})
#會輸出多少個元素???


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章