可迭代對(duì)象:我們已經(jīng)知道可以對(duì)list序臂、tuple蚌卤、str等類(lèi)型的數(shù)據(jù)使用for...in...的循環(huán)語(yǔ)法從其中依次拿到數(shù)據(jù)進(jìn)行使用,我們把這樣的過(guò)程稱為遍歷奥秆,也叫迭代逊彭。
我們把可以通過(guò)for...in...這類(lèi)語(yǔ)句迭代讀取一條數(shù)據(jù)供我們使用的對(duì)象稱之為可迭代對(duì)象(Iterable)**
判斷對(duì)象是否可迭代:
使用 isinstance() 判斷一個(gè)對(duì)象是否是 Iterable 對(duì)象
*可迭代對(duì)象的本質(zhì)就是可以向我們提供一個(gè)這樣的中間“人”即迭代器幫助我們對(duì)其進(jìn)行迭代遍歷使用。
*在迭代一個(gè)可迭代對(duì)象的時(shí)候构订,實(shí)際上就是先獲取該對(duì)象提供的一個(gè)迭代器侮叮,然后通過(guò)這個(gè)迭代器來(lái)依次獲取對(duì)象中的每一個(gè)數(shù)據(jù).
*可以通過(guò)iter()函數(shù)獲取這些可迭代對(duì)象的迭代器
總:一個(gè)具備了__iter__方法的對(duì)象,就是一個(gè)可迭代對(duì)象
當(dāng)我們已經(jīng)迭代完最后一個(gè)數(shù)據(jù)之后悼瘾,再次調(diào)用next()函數(shù)會(huì)拋出StopIteration的異常囊榜,來(lái)告訴我們所有數(shù)據(jù)都已迭代完成,不用再執(zhí)行next()函數(shù)了亥宿。
一個(gè)實(shí)現(xiàn)了__iter__方法和__next__方法的對(duì)象卸勺,就是迭代器。
除了for循環(huán)能接收可迭代對(duì)象烫扼,list曙求、tuple等也能接收。
如果想要一個(gè)對(duì)象成為一個(gè)可以迭代的對(duì)象(即可以使用for),那么必須實(shí)現(xiàn)__iter__方法
生成器:
為了達(dá)到記錄當(dāng)前狀態(tài)悟狱,并配合next()函數(shù)進(jìn)行迭代使用静浴,我們可以采用更簡(jiǎn)便的語(yǔ)法,即生成器(generator)挤渐。生成器是一類(lèi)特殊的迭代器
只要在def中有yield關(guān)鍵字的 就稱為 生成器苹享;使用了yield關(guān)鍵字的函數(shù)不再是函數(shù),而是生成器
yield關(guān)鍵字作用:
保存當(dāng)前運(yùn)行狀態(tài)(斷點(diǎn))浴麻,然后暫停執(zhí)行得问,即將生成器(函數(shù))掛起
將yield關(guān)鍵字后面表達(dá)式的值作為返回值返回,此時(shí)可以理解為起到了return的作用
*可以使用next()函數(shù)讓生成器從斷點(diǎn)處繼續(xù)執(zhí)行软免,即喚醒生成器(函數(shù))
*使用send()喚醒:
除了可以使用next()函數(shù)來(lái)喚醒生成器繼續(xù)執(zhí)行外椭赋,還可以使用send()函數(shù)來(lái)喚醒執(zhí)行
使用send()函數(shù)的一個(gè)好處是可以在喚醒的同時(shí)向斷點(diǎn)處傳入一個(gè)附加數(shù)據(jù)
協(xié)程:協(xié)程是python個(gè)中另外一種實(shí)現(xiàn)多任務(wù)的方式
自帶CPU上下文;
只要在合適的時(shí)機(jī)或杠, 我們可以把一個(gè)協(xié)程 切換到另一個(gè)協(xié)程。 只要這個(gè)過(guò)程中保存或恢復(fù) CPU上下文那么程序還是可以運(yùn)行的