python列表的推導(dǎo)式和生成器迭代器

列表是我們?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)]
  1. 附帶條件的列表推導(dǎo)式
my4 = [x for x in range(0, 20) if x % 2 == 0]
print(my4)
  1. 附帶運(yùn)算的列表推導(dǎo)式
my5 = [x**2 for x in range(0, 10)]
print(my5)
  1. 附帶多項(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)題

  1. 存儲(chǔ)的大量數(shù)據(jù),沒(méi)有規(guī)則
    解決方案:不要存大量數(shù)據(jù)

  2. 有規(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)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末余素,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子炊昆,更是在濱河造成了極大的恐慌桨吊,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凤巨,死亡現(xiàn)場(chǎng)離奇詭異视乐,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)磅甩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門炊林,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人卷要,你說(shuō)我怎么就攤上這事《懒瘢” “怎么了僧叉?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)棺榔。 經(jīng)常有香客問(wèn)我瓶堕,道長(zhǎng),這世上最難降的妖魔是什么症歇? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任郎笆,我火速辦了婚禮,結(jié)果婚禮上忘晤,老公的妹妹穿的比我還像新娘宛蚓。我一直安慰自己,他們只是感情好设塔,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布凄吏。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪痕钢。 梳的紋絲不亂的頭發(fā)上图柏,一...
    開(kāi)封第一講書(shū)人閱讀 49,784評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音任连,去河邊找鬼蚤吹。 笑死,一個(gè)胖子當(dāng)著我的面吹牛随抠,可吹牛的內(nèi)容都是我干的距辆。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼暮刃,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼跨算!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起椭懊,我...
    開(kāi)封第一講書(shū)人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤诸蚕,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后氧猬,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體背犯,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年盅抚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了漠魏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡妄均,死狀恐怖柱锹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情丰包,我是刑警寧澤禁熏,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站邑彪,受9級(jí)特大地震影響瞧毙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜寄症,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一宙彪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧有巧,春花似錦释漆、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)檀训。三九已至,卻和暖如春享言,著一層夾襖步出監(jiān)牢的瞬間峻凫,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工览露, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留荧琼,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓差牛,卻偏偏與公主長(zhǎng)得像命锄,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子偏化,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 迭代器協(xié)議 1.迭代器協(xié)議是指:對(duì)象必須提供一個(gè)next方法脐恩,執(zhí)行該方法要么返回迭代中的下一項(xiàng),要么就引起一個(gè)St...
    貓茂懋閱讀 573評(píng)論 1 2
  • 我們?cè)趯W(xué)習(xí)web前端的路程起步時(shí)總是疑問(wèn),我們?nèi)绾胃玫谋闅v元素呢韵卤?迭代器和生成器是什么骗污?今天為大家?guī)吓c精彩的E...
    儂姝沁兒閱讀 3,309評(píng)論 0 6
  • 1. 迭代器協(xié)議 由于生成器自動(dòng)實(shí)現(xiàn)了迭代器協(xié)議,而迭代器協(xié)議對(duì)很多人來(lái)說(shuō)沈条,也是一個(gè)較為抽象的概念需忿。所以,為了更好...
    KavinDotG閱讀 328評(píng)論 0 1
  • [TOC] 迭代器 為什么要用迭代器蜡歹? 提供了一種不依賴索引的取值方式屋厘,使一些不具有索引屬性的對(duì)象也能遍歷輸出相比...
    派大星的喜悲沒(méi)人看見(jiàn)閱讀 591評(píng)論 0 0
  • 人生旅途,總會(huì)遇到磨難與挫折季稳,誤解與疏離擅这,沒(méi)有苦難何來(lái)信念的光輝,守得住內(nèi)心的善意與良知景鼠,豁達(dá)與包容,風(fēng)雨兼程痹扇,便成從容
    儷羨閱讀 258評(píng)論 0 0