(1):通常的for..in...循環(huán)中,,in后面是一個(gè)數(shù)組,,這個(gè)數(shù)組就是一個(gè)可迭代對(duì)象,,類似的還有鏈表,,字符串,文件,。他可以是a = [1,2,3],,也可以是a = [x*x for x in range(3)],。 它的缺點(diǎn)也很明顯,就是所有數(shù)據(jù)都在內(nèi)存里面,,如果有海量的數(shù)據(jù),,將會(huì)非常耗內(nèi)存。 ?。?)生成器是可以迭代的,,但是只可以讀取它一次。因?yàn)橛玫臅r(shí)候才生成,,比如a = (x*x for x in range(3)),。!!!!注意這里是小括號(hào)而不是方括號(hào)。 ?。?)生成器(generator)能夠迭代的關(guān)鍵是他有next()方法,,工作原理就是通過(guò)重復(fù)調(diào)用next()方法,直到捕獲一個(gè)異常,。 ?。?)帶有yield的函數(shù)不再是一個(gè)普通的函數(shù),而是一個(gè)生成器generator,,可用于迭代 ?。?)yield是一個(gè)類似return 的關(guān)鍵字,迭代一次遇到y(tǒng)ield的時(shí)候就返回yield后面或者右面的值,。而且下一次迭代的時(shí)候,,從上一次迭代遇到的yield后面的代碼開(kāi)始執(zhí)行 (6)yield就是return返回的一個(gè)值,,并且記住這個(gè)返回的位置,。下一次迭代就從這個(gè)位置開(kāi)始。 ?。?)帶有yield的函數(shù)不僅僅是只用于for循環(huán),,而且可用于某個(gè)函數(shù)的參數(shù),只要這個(gè)函數(shù)的參數(shù)也允許迭代參數(shù),。 ?。?)send()和next()的區(qū)別就在于send可傳遞參數(shù)給yield表達(dá)式,這時(shí)候傳遞的參數(shù)就會(huì)作為yield表達(dá)式的值,,而yield的參數(shù)是返回給調(diào)用者的值,,也就是說(shuō)send可以強(qiáng)行修改上一個(gè)yield表達(dá)式值。 ?。?)send()和next()都有返回值,,他們的返回值是當(dāng)前迭代遇到的yield的時(shí)候,yield后面表達(dá)式的值,其實(shí)就是當(dāng)前迭代yield后面的參數(shù),。 ?。?0)第一次調(diào)用時(shí)候必須先next()或send(),否則會(huì)報(bào)錯(cuò),send后之所以為None是因?yàn)檫@時(shí)候沒(méi)有上一個(gè)yield,,所以也可以認(rèn)為next()等同于send(None) |
|