1. 程式人生 > >python3:列表推導式,生成器表示式,字典推導式 三種用法講解

python3:列表推導式,生成器表示式,字典推導式 三種用法講解

列表推導式

任務:
我們有個任務是提取0—20的奇數位.
1.首先我們想到的是用for迴圈加if做到,如下:

b=[]
for i in range(21):
    if i%2==1:
        b.append(i)
print(b)

2.懂list 也可以想到這樣的用法

b=list(range(21))
print(b)
print(b[1::2])

都可以打印出這樣的結果:

[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]

用第二種方法是有侷限性,如果過於複雜的場景並不適用,現在我們隆重的介紹列表推導式

3.列表推導式

b=list(range(21))
b=[i for i in b if i%2==1]  
print(b)

我們只用一行程式碼就解決了我們的任務,下邊我介紹更復雜的場景
任務:我們要抽取 0-20的奇數並計算其平方.

def square(i):
    return i*i
b=list(range(20))

b=[square(i) for i in b if i%2==1]

print(b)

列印結果:

[1, 9, 25, 49, 81, 121, 169, 225, 289, 361]

程式碼很簡單應該都能看懂. 解析下結果結構
[i for i in b if i%21] ,有三個結構 i,for i in b,if i%2

1
1.i 是指填充到列表的值
2.for i in b 是遍歷b
3.if i%2==1 對迴圈的值進行過濾.

注意:這種方式只適合簡單的場景,效能高於列表操作
過於複雜我們就不需要用了,可讀性是我們追求的

生成器表示式

我們稍微改變下 如下:

b=list(range(21))
b=(i for i in b if i%2==1)
print(b)

列印結果:

<generator object <genexpr> at 0x000000000221AE60>

通過結果分析出顯示了generator 這就是生成器的標識,不要以為用小括號就是
set,tuple.這個注意下.
他自己是可以遍歷的,如下:

b=list(range(21))
b=(i for i in b if i%2==1)

for i  in b:
    print(i)

列印結果:

1
3
5
#

生成器的內部原理和適用場景,以後我會在專門的章節寫,不是本章節的重點.

字典推導式

上邊介紹了用一行程式碼可以生成list,我們同樣的原理也可以生成dict.
參考如下的程式碼

b={"boby1":30,"boby2":60}

dict={value:(key+1) for value,key in b.items() }

print(dict)

和上邊的區別是【】變成了{}, 裡面的原理是一樣的,換湯不換藥.

總結:
簡單的for迴圈 都可以用推導式進行完成,效能高比較高,但是如果場景過於複雜就不要用,可讀
性要排在第一位.

謝謝瀏覽,有好的建議請評論 ,謝謝