關(guān)于“Python list comprehension 其實(shí)就是 generator.”該怎么理解?
另外 map filter、generator 也讓人挺不解的,求python 大牛都給解釋下。這么設(shè)計(jì)的緣由是什么?
首先關(guān)于問(wèn)題里面引用的那句話(huà):不要這樣理解,會(huì)把自己繞進(jìn)去,而且也不準(zhǔn)確。這個(gè)問(wèn)題要往簡(jiǎn)單來(lái)看。對(duì)于一個(gè)簡(jiǎn)單的 list comprehension [x**2 for x in range(10)]
,它等價(jià)于:
l = []
for x in range(10):
l.append(x**2)
所以,list comprehension 只是一個(gè)語(yǔ)法糖,能讓容器的初始化變得更加簡(jiǎn)潔,但它本質(zhì)上還是在往容器里不斷塞東西。(當(dāng)然,由于這個(gè)語(yǔ)法存在,python 也可以針對(duì)性的優(yōu)化性能,性能會(huì)比自己 append 好一些)
List comprehensions provide a concise way to create lists. List comprehensions 提供了一種簡(jiǎn)潔明了的方式來(lái)創(chuàng)建 list。 來(lái)自 python 官方文檔
它跟 generator 概念不一樣,如果要說(shuō)的話(huà),迭代器(iterator)可能才是描述 x**2 for x in range(10) 這種語(yǔ)法的正確方法,雖然它的名字確實(shí)叫做 generator expression。
其次,什么是 generator。 這個(gè)概念本身是很晦澀,如果初學(xué)不要強(qiáng)行理解。
簡(jiǎn)單說(shuō)它就是一個(gè)數(shù)據(jù)生成器,或者精確點(diǎn)說(shuō),它是個(gè)調(diào)用者可控的迭代器(iterator),僅此而已。
Generator 函數(shù)就像一個(gè)扭蛋機(jī),使用者每次投入一枚硬幣它就吐出一顆扭蛋。
這樣設(shè)計(jì)的好處是,耦合低和可控。
至于 generator 的高級(jí)用法,比如模擬 coroutine 什么的,可以暫時(shí)無(wú)視。
最后,關(guān)于 map、filter 等函數(shù)的設(shè)計(jì)思路。 從 generator 的特性可以看出,它所能表達(dá)的只能是一種順序輸出的情況,無(wú)法后悔,除非從頭開(kāi)始。 這就像一條工廠的流水線,只能向前不能后退。 如果我們有這樣一條流水線,我們能做什么呢?
流水線生產(chǎn)是工業(yè)時(shí)代智慧體現(xiàn),能夠?qū)?zhí)行效率做到最高,并且流水線上各個(gè)環(huán)節(jié)都沒(méi)有耦合性,它的合理性相當(dāng)明顯。