實(shí)用炫酷!這樣寫 Python 代碼四兩撥千斤!

大家好,我是安果!
判斷一個(gè)程序員水平的高低,不能光看他的發(fā)量,也不能光看他的代碼量,還要看他代碼蘊(yùn)含的思想,代碼的質(zhì)量
代碼蘊(yùn)含的思想主要體現(xiàn)在各種設(shè)計(jì)模式的運(yùn)用上,而代碼的質(zhì)量就既要實(shí)現(xiàn)需求,又要保證代碼的簡(jiǎn)潔優(yōu)雅。保證代碼質(zhì)量是需要長(zhǎng)期積累,養(yǎng)成良好的編程習(xí)慣,不斷思考優(yōu)化的
今天就給大家介紹一種實(shí)用的保證代碼簡(jiǎn)潔的武功—— Python 推導(dǎo)四式
什么是推導(dǎo)式
推導(dǎo)式 comprehensions(又稱解析式),是 python 的一種獨(dú)有特性。推導(dǎo)式是可以從一個(gè)數(shù)據(jù)序列構(gòu)建另一個(gè)新的數(shù)據(jù)序列。
看定義很抽象,下面我們來看看具體的例子,通過例子來學(xué)習(xí)這四種推導(dǎo)式。
列表推導(dǎo)式
我們先來看一個(gè)需求:
快速創(chuàng)建一個(gè)包含元素1-9的平方的列表
面對(duì)這個(gè)需求,我們通常的實(shí)現(xiàn)方式是這樣的:
lis = []
for i in range(1, 10):
lis.append(i*i)
print(lis) # [1, 4, 9, 16, 25, 36, 49, 64, 81]
用列表推導(dǎo)式怎么實(shí)現(xiàn)呢?你只需要一行代碼:
lis = [x * x for x in range(1, 10)]
print(list) # [1, 4, 9, 16, 25, 36, 49, 64, 81]
這就是推導(dǎo)式。我們可以看到列推導(dǎo)式的語(yǔ)法是這樣的:
變量名 = [表達(dá)式 for 變量 in 列表]
再來一個(gè)復(fù)雜點(diǎn)的:
list = [x * y for x in range(1, 10) for y in range(1, 10)]
print(lis)
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 2, 4, 6, 8, 10, 12, 14, 16, 18, 3, 6, 9, 12, 15, 18, 21, 24, 27, 4, 8, 12, 16, 20, 24, 28, 32, 36, 5, 10, 15, 20, 25, 30, 35, 40, 45, 6, 12, 18, 24, 30, 36, 42, 48, 54, 7, 14, 21, 28, 35, 42, 49, 56, 63, 8, 16, 24, 32, 40, 48, 56, 64, 72, 9, 18, 27, 36, 45, 54, 63, 72, 81]
這個(gè)是多個(gè)變量的類型,因此我們可以擴(kuò)展上面的語(yǔ)法:
變量名 = [表達(dá)式 for 變量 in 列表 for 變量 in xxx]
當(dāng)然,還有一種帶條件的列推導(dǎo)式,它的語(yǔ)法是這樣的:
變量名 = [表達(dá)式 for 變量 in 列表 if 條件]
我們來看一個(gè)需求:快速創(chuàng)建一個(gè)包含1-10之間所有偶數(shù)的列表。
lis = [i for i in range(1, 11) if i % 2 == 0]
print(lis) # [2, 4, 6, 8, 10]
字典推導(dǎo)式
字典推導(dǎo)式的形式和列表推導(dǎo)式類似,語(yǔ)法也是類似的,只不過字典推導(dǎo)式返回的結(jié)果是字典。
變量名 = {key: value表達(dá)式}
我們來看一個(gè)例子:
dic = {x: x/2 for x in range(1,11) if x % 2 == 0}
print(dic) # {2: 1.0, 4: 2.0, 6: 3.0, 8: 4.0, 10: 5.0}
如果這里我寫成下面這種方式,返回的結(jié)果是什么呢?
dic = {'half': x/2 for x in range(1,11) if x % 2 == 0}
print(dic)
大家可以自己嘗試運(yùn)行一下,看跟你想的結(jié)果是不是一樣的。
集合推導(dǎo)式
看了前面兩個(gè)推導(dǎo)式,想必你已經(jīng)知道集合推導(dǎo)式怎么寫了。語(yǔ)法如下:
變量名 = {表達(dá)式 for 變量 in 列表 for 變量 in xxx}
或者
變量名 = {表達(dá)式 for 變量 in 列表 if 條件}
來一個(gè)實(shí)際的例子:創(chuàng)建一個(gè)存儲(chǔ)10個(gè)偶數(shù)的集合。
set1 = {x for x in range(10) if x % 2 == 0}
print(set1) # {0, 2, 4, 6, 8}
元組推導(dǎo)式
我們先來看一個(gè)例子:
tup=(x for x in range(1,10))
print(tup) # <generator object <genexpr> at 0x1101fade0>
看到這個(gè)結(jié)果打印是不是有點(diǎn)懵?
上面的代碼返回的變量其實(shí)是一個(gè)生成器,并不是一個(gè)元組。其實(shí)沒有真正的元組推導(dǎo)式,我們只能用一個(gè)類似的方法來生成元組,暫且叫做“偽元組推導(dǎo)式”吧。
上面的例子我們來改進(jìn)一下:
tup=tuple(x for x in range(1,10))
print(tup) # (1, 2, 3, 4, 5, 6, 7, 8, 9)
在前面加上 tuple 來顯式進(jìn)行類型轉(zhuǎn)換就行了。
總結(jié)
這里介紹了四種 Python 的推導(dǎo)式,主要是用來簡(jiǎn)化 循環(huán)的代碼,生成不同的數(shù)據(jù)結(jié)構(gòu)用的
當(dāng)然,從這些基礎(chǔ)的表達(dá)式語(yǔ)法出發(fā),還可以運(yùn)用到復(fù)雜的推導(dǎo)式,大家在寫代碼時(shí)留心使用就會(huì)發(fā)現(xiàn)它的強(qiáng)大之處。這種一行代碼既簡(jiǎn)潔明了,又可以在新手面前炫技,用起來不要太爽
