列表是我們?cè)趐ython編程中用到的最多的數(shù)據(jù)類型,我們平常在學(xué)習(xí)的過(guò)程中,一般只操作小數(shù)據(jù)量的列表。所謂推導(dǎo)式就是根據(jù)遍歷互捌,然后把需要的數(shù)據(jù)列舉出來(lái)遗契,比之前的創(chuàng)建列表然后再根據(jù)遍歷依次往列表里添加數(shù)據(jù)要簡(jiǎn)單許多辐棒。
推導(dǎo)式:按照一定的規(guī)則進(jìn)行推導(dǎo)產(chǎn)生對(duì)應(yīng)的數(shù)據(jù)
語(yǔ)法:變量 = [推導(dǎo)表達(dá)式]
優(yōu)點(diǎn):語(yǔ)法簡(jiǎn)單,可以通過(guò)包含邏輯條件生成一個(gè)符合條件的列表
缺點(diǎn):邏輯過(guò)于簡(jiǎn)單牍蜂!不能生成條件更加復(fù)雜的更加準(zhǔn)確的列表
先給大家列出一個(gè)最簡(jiǎn)單的推倒式:
a = [x for x in range(10)]
- 附帶條件的列表推導(dǎo)式
my4 = [x for x in range(0, 20) if x % 2 == 0]
print(my4)
- 附帶運(yùn)算的列表推導(dǎo)式
my5 = [x**2 for x in range(0, 10)]
print(my5)
- 附帶多項(xiàng)數(shù)據(jù)的列表推導(dǎo)式
my6 = [x + y for x in range(0, 5) for y in range(0,2)]
print(my6)
生成器
處理列表中如果存儲(chǔ)大量的數(shù)據(jù)漾根,導(dǎo)致內(nèi)存急劇消耗的問(wèn)題
存儲(chǔ)的大量數(shù)據(jù),沒(méi)有規(guī)則
解決方案:不要存大量數(shù)據(jù)有規(guī)則的數(shù)據(jù):不要直接通過(guò)列表操作
解決方案:通過(guò)列表生成器 操作
生成器:在程序執(zhí)行到該代碼時(shí)鲫竞,才會(huì)執(zhí)行運(yùn)算得到結(jié)果
生成器雖然也是遍歷但是不會(huì)自動(dòng)執(zhí)行辐怕,會(huì)根據(jù)數(shù)據(jù)的需要或者人為操作執(zhí)行,生成器的語(yǔ)法很簡(jiǎn)單从绘,舉個(gè)例子:
推導(dǎo)式
my_list = [x for x in range(0, 100)]
生成器
my_generator = (x for x in range(0, 100))
使用方法:
print(my_list)# 列表推導(dǎo)式:直接產(chǎn)生包含所有數(shù)據(jù)的列表
print(my_generator)# 列表生成器:產(chǎn)生一個(gè)生成器對(duì)象寄疏,包含算法
# 使用生成器中的數(shù)據(jù)
# (1) 通過(guò)系統(tǒng)內(nèi)建函數(shù)next()獲取生成器中下一個(gè)數(shù)據(jù)
print(next(my_generator)) # 0
print(next(my_generator)) # 1
print(next(my_generator)) # 2
print(next(my_generator)) # 3
# (2) 通過(guò)類型的__next__()魔法方法,直接獲取下一個(gè)數(shù)據(jù)
print(my_generator.__next__()) # 4
print(my_generator.__next__()) # 5
print(my_generator.__next__()) # 6
print(my_generator.__next__()) # 7
如果我們想定義一個(gè)自己的生成器函數(shù)怎么辦僵井?用return好像不行陕截。沒(méi)關(guān)系,python有yield的關(guān)鍵詞批什。其作用和return的功能差不多农曲,就是返回一個(gè)值給調(diào)用者,只不過(guò)有yield的函數(shù)返回值后函數(shù)依然保持調(diào)用yield時(shí)的狀態(tài)渊季,當(dāng)下次調(diào)用的時(shí)候朋蔫,在原先的基礎(chǔ)上繼續(xù)執(zhí)行代碼,直到遇到下一個(gè)yield或者滿足結(jié)束條件結(jié)束函數(shù)為止
迭代器
可以使用isinstance()判斷一個(gè)對(duì)象是否是Iterator對(duì)象
迭代器:
PYTHON中在collections集合模塊中提供了迭代器對(duì)象
迭代對(duì)象:collections.Iterable
迭代標(biāo)識(shí):collections.Iterator
迭代器由兩部分組成却汉,用于循環(huán)遍歷的迭代對(duì)象驯妄,它是一個(gè)Iterable類型的對(duì)象,
用于記錄迭代狀態(tài)的迭代標(biāo)識(shí)合砂,通過(guò)Iterator對(duì)象進(jìn)行操作
生成器:
PYTHON中提供的一種可以將程序算法表達(dá)式包含起來(lái)的一個(gè)用于產(chǎn)生列表數(shù)據(jù)的對(duì)象
在操作過(guò)程中通過(guò)next()函數(shù)進(jìn)行調(diào)用青扔,算法表達(dá)式產(chǎn)生下一個(gè)數(shù)據(jù)用于程序運(yùn)算的操作對(duì)象
迭代器:用來(lái)遍歷數(shù)據(jù)
生成器:用來(lái)產(chǎn)生數(shù)據(jù)
1. list/set/dict/tuple是否是Iterable類型,是否是Iterator類型
Iterable類型?否
Iterator類型微猖?否
2. [1,2,3]是否是Iterable類型谈息,是否是Iterator類型
Iterable類型?是
Iterator類型凛剥?否
3. class User:..是否是Iterable類型侠仇,是否是Iterator類型
Iterable類型?否[如果類型重寫了__iter__()函數(shù)并返回了迭代對(duì)象:是]
Iterator類型犁珠?否
4. 什么是迭代器逻炊?
迭代器是用來(lái)標(biāo)識(shí)一個(gè)對(duì)象是否可以循環(huán)遍歷,并且可以記錄循環(huán)遍歷狀態(tài)的對(duì)象
主要通過(guò)collections.Iterable類型來(lái)判斷是否是可以迭代的類型
在迭代過(guò)程中犁享,通過(guò)collections.Iterator來(lái)記錄迭代狀態(tài)