Python-推導(dǎo)式和生成器表達(dá)式

目錄:http://m.itdecent.cn/p/863c446364a8

一、推導(dǎo)式

推導(dǎo)式分為三種,分別為列表推導(dǎo)式,字典推導(dǎo)式,集合推導(dǎo)式。其中列表推導(dǎo)式為最常用的。

(一) 列表推導(dǎo)式

定義:用一行代碼構(gòu)建一個(gè)比較復(fù)雜有規(guī)律的列表。

我們通過程序來演示列表推導(dǎo)式的作用

首先我們先寫一個(gè)普通循環(huán)語句(通過循環(huán),向列表中添加1~10)

li=[]

for i in range(1,11):

? ? li.append(i)

print(li)

運(yùn)行結(jié)果為:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

那么我們通過列表推導(dǎo)式來完成這樣的操作。

li=[i for i in range(1,11)]

print(li)

運(yùn)行結(jié)果為:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

這樣我們就通過兩行代碼完成了。上面這個(gè)代碼就是列表推導(dǎo)式,接下來我們將列表推導(dǎo)式進(jìn)行一個(gè)分類:

列表推導(dǎo)式分兩類:循環(huán)模式、篩選模式

我們對這兩種模式進(jìn)行一一講解。

循環(huán)模式語法

循環(huán)模式:[變量(加工后的變量)for 變量 in iterable]

下面我們通過循環(huán)模式我們一些簡單操作。

1、將十以內(nèi)所有整數(shù)的平方寫入列表

li1=[i*i for i in range(1,11)]

print(li1)

運(yùn)行結(jié)果為:

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

2、30以內(nèi)所有的偶數(shù)寫入列表

li2=[i for i in range(2,30,2) ]

print(li2)

運(yùn)行結(jié)果為:

[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28]

3、從Python1期到Python10期寫入列表

li3=["python{}期".format(i) for i in range(1,11) ]

print(li3)

運(yùn)行結(jié)果為:

['python1期', 'python2期', 'python3期', 'python4期', 'python5期', 'python6期', 'python7期', 'python8期', 'python9期', 'python10期']

接下來我們研究篩選模式。

篩選模式語法:

篩選模式:[變量(加工后的變量)for 變量 in iterable if 條件]

針對于篩選模式我們進(jìn)行練習(xí)。

1、30以內(nèi)能被3整除的數(shù)

li4=[i for i in range(1,31) if i%3==0]

print(li4)

運(yùn)行結(jié)果為:

[3, 6, 9, 12, 15, 18, 21, 24, 27, 30]

2、過濾掉長度小于3的字符串列表,并將剩下的轉(zhuǎn)換為大寫字母

li5=[i.upper()? for i in ["ab","abc","abcd","abcde","abcdef"] if len(i)>=3 ]

print(li5)

運(yùn)行結(jié)果為:

['ABC', 'ABCD', 'ABCDE', 'ABCDEF']

3、找到嵌套列表中名字含有兩個(gè)‘e’的所有名字全部大寫

names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],

? ? ? ? ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]

li6=[j.upper() for i in names for j in i if j.count("e")==2]

print(li6)

運(yùn)行結(jié)果為:

['JEFFERSON', 'WESLEY', 'STEVEN', 'JENNIFER']

列表推導(dǎo)式總結(jié):

缺點(diǎn):

1."有毒",列表推導(dǎo)式只能構(gòu)建比較復(fù)雜并且有規(guī)律的列表

2.超過三層才能構(gòu)建成功的就不建議用列表推導(dǎo)式

3.查找錯(cuò)誤(debug模式)不行

優(yōu)點(diǎn):一行構(gòu)架,簡單

除了列表推導(dǎo)式以外還有字典推導(dǎo)式和集合推導(dǎo)式。下面我們進(jìn)行簡單了解。

(二) 字典推導(dǎo)式

字典推導(dǎo)式顧名思義推導(dǎo)出來的是字典

實(shí)例

list1 = ['a','b','c']

list2 = ['Danny','Jenny','LiMing']

dic = {list2[i]:list1[i] for i in range(len(list1))}

print(dic)

運(yùn)行結(jié)果為:

{'Danny': 'a', 'Jenny': 'b', 'LiMing': 'c'}

(三) 集合推導(dǎo)式

集合推導(dǎo)式可以幫我們直接生成一個(gè)集合,集合的特點(diǎn);無序,不重復(fù) 所以集合推導(dǎo)式自帶去重功能

實(shí)例

li7={i for i in range(1,11)}

print(li7)

運(yùn)行結(jié)果為:

{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

二、生成器表達(dá)式

為什么要把推導(dǎo)式與生成器表達(dá)式一塊說呢?生成器表達(dá)式和列表推導(dǎo)式的語法上一模一樣,只是把[]換成()就行了。

語法:

(變量(加工后的變量)for 變量 in iterable)

比如要遍歷1~10:

li8=(i for i in range(1,11))

for i in li8:

? ? print(i)

列表推導(dǎo)式與生成器表達(dá)式區(qū)別

寫法上

列表推導(dǎo)式: []

生成器表達(dá)式:? ()

本質(zhì)上

列表推導(dǎo)式:iterable?

生成器表達(dá)式:iterator

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容