python3:列表推導式,生成器表示式,字典推導式 三種用法講解
阿新 • • 發佈:2018-11-09
列表推導式
任務:
我們有個任務是提取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.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迴圈 都可以用推導式進行完成,效能高比較高,但是如果場景過於複雜就不要用,可讀
性要排在第一位.
謝謝瀏覽,有好的建議請評論 ,謝謝