1.8推导式
列表推導(dǎo)式
列表推導(dǎo)式,生成器表達(dá)式以及其他推導(dǎo)式,首先我們先看一下這樣的代碼,給出一個(gè)列表,通過(guò)循環(huán),想列表中添加1~10:
li = []
for i in range(10):li.append(i)
print(li)
列表推導(dǎo)式的常?語(yǔ)法:
[結(jié)果 for 變量 in 可迭代對(duì)象]
ls = [i for i in range(10)]
print(ls)
列表推導(dǎo)式是通過(guò)?行來(lái)構(gòu)建你要的列表, 列表推導(dǎo)式看起來(lái)代碼簡(jiǎn)單. 但是出現(xiàn)錯(cuò)誤之后很難排查.
lst = ['python%s' % i for i in range(1,19)]
print(lst)
篩選模式
語(yǔ)法:
[結(jié)果 for 變量 in 可迭代對(duì)象 if 條件]
lst = [i for i in range(100) if i %2 == 0]
print(lst)
生成器推導(dǎo)式
生成器表達(dá)式和列表推導(dǎo)式的語(yǔ)法基本上一樣的,只是把[]換成()
gen = (i for i in range(10))
print(gen)
# 結(jié)果: <generator object <genexpr> at 0x0000026046CAEBF8>
打印的結(jié)果就是一個(gè)生成器,我們可以使用for循環(huán)來(lái)循環(huán)這個(gè)生成器
gen = ("第%s次" % i for i in range(10))
for i in gen:print(i)
生成器表達(dá)式也可以進(jìn)行篩選
# 獲取1-100內(nèi)能被3整除的數(shù)
gen = (i for i in range(1,100) if i % 3 == 0)
for num in gen:print(num)
# 100以內(nèi)能被3整除的數(shù)的平?
gen = (i * i for i in range(100) if i % 3 == 0)
for num in gen:print(num)
# 尋找名字中帶有兩個(gè)e的人的名字
names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
# 不用推導(dǎo)式和表達(dá)式
result = []
for first in names:for name in first:if name.count("e") >= 2:result.append(name)
print(result)
# 推導(dǎo)式
gen = (name for first in names for name in first if name.count('e') >= 2)
for i in gen:print(i)
可以把生成器里面的值通過(guò)某些方法變成一個(gè)容器
li = []
gen = (i for i in range(1, 100) if i % 3 == 0)
for num in gen:# print(num)li.append(num)
print(li)
生成器表達(dá)式和列表推導(dǎo)式的區(qū)別:
1.列表推導(dǎo)式比較耗內(nèi)存,一次性加載.生成器表達(dá)式幾乎不占用內(nèi)存.使用的時(shí)候才分配和使用內(nèi)存
2.得到的值不一樣,列表推導(dǎo)式得到的是一個(gè)列表.生成器表達(dá)式獲取的是一個(gè)生成器
實(shí)例:
def func():print(111)yield 222
g = func() # 生成器g
g1 = (i for i in g) # 生成器g1. 但是g1的數(shù)據(jù)來(lái)源于g
g2 = (i for i in g1) # 生成器g2. 來(lái)源g1
# list的底層有for循環(huán),for就是一直執(zhí)行__next__() 所以可以將生成器放到list中
print(list(g)) # 獲取g中的數(shù)據(jù). 這時(shí)func()才會(huì)被執(zhí)行. 打印111.獲取到222. g完畢.
print(list(g1)) # 獲取g1中的數(shù)據(jù). g1的數(shù)據(jù)來(lái)源是g. 但是g已經(jīng)取完了. g1 也就沒(méi)有數(shù)據(jù)了
print(list(g2)) # 和g1同理理
print(next(g))
print(next(g1))
print(next(g2)) # 可以用next來(lái)驗(yàn)證 其實(shí)list就是將內(nèi)容迭代了轉(zhuǎn)換成了列表
每次對(duì)生成器調(diào)用 next() 時(shí),它會(huì)從上次離開(kāi)位置恢復(fù)執(zhí)行(它會(huì)記住上次執(zhí)行語(yǔ)句時(shí)的所有數(shù)據(jù)值)。
字典推導(dǎo)式
根據(jù)名字應(yīng)該也能猜到,推到出來(lái)的是字典
lst1 = ['jay','jj','meet']
lst2 = ['周杰倫','林俊杰','郭寶元']
dic = {lst1[i]:lst2[i] for i in range(len(lst1))}
print(dic)
升級(jí)版:
{key:value for key value in d.iterms()}
集合推導(dǎo)式
集合推導(dǎo)式可以幫我們直接生成一個(gè)集合,集合的特點(diǎn);無(wú)序,不重復(fù) 所以集合推導(dǎo)式自帶去重功能
lst = [1,2,3,-1,-3,-7,9]
s = {abs(i) for i in lst}
print(s)
總結(jié):
推導(dǎo)式有, 列表推導(dǎo)式, 字典推導(dǎo)式, 集合推導(dǎo)式, 沒(méi)有元組推導(dǎo)式
生成器表達(dá)式: (結(jié)果 for 變量 in 可迭代對(duì)象 if 條件篩選)
生成器表達(dá)式可以直接獲取到?成器對(duì)象. ?成器對(duì)象可以直接進(jìn)行for循環(huán). ?成器具有惰性機(jī)制.
集合推導(dǎo)式和字典推導(dǎo)式很是類(lèi)似,記住一個(gè)小技巧能夠快速區(qū)分那個(gè)是字典那個(gè)是集合
字典推導(dǎo)式前面的結(jié)果是有個(gè)冒號(hào),而集合的前面結(jié)果就是單純的結(jié)果
總結(jié)
- 上一篇: with上下文管理
- 下一篇: windows阿里云服务器配置