3 回答

TA貢獻(xiàn)1906條經(jīng)驗 獲得超3個贊
這樣處理主要是 Lazy
求值的做法
設(shè)想一些應(yīng)用場景,你需要對1000萬個斐波那切數(shù)相加求和。
一種方法是先用一個列表,寫一個函數(shù),直接生成1000萬個個斐波那切數(shù),然后再把1000萬個存儲,然后迭代這個list的每一個數(shù)進(jìn)行疊加求和。(先生成,再處理)
另外一種方式就是,寫一個能按照要求,每次生成一個斐波那切數(shù)函數(shù),求和的過程為每調(diào)用函數(shù),生成一個斐波那切數(shù),然后進(jìn)行求和一次。(一邊生成一遍處理)
第二種方法,就是一種 lazy
的方式,也就是 python
慣用的 generator

TA貢獻(xiàn)1873條經(jīng)驗 獲得超9個贊
不知道題主這句話是從何得來的,我測試的Python2.7就是轉(zhuǎn)化成for函數(shù)而已如下.
不知道Py3.*中是否也是如此(可能變了吧)

TA貢獻(xiàn)2051條經(jīng)驗 獲得超10個贊
首先關(guān)于問題里面引用的那句話:不要這樣理解,會把自己繞進(jìn)去,而且也不準(zhǔn)確。
這個問題要往簡單來看。對于一個簡單的 list comprehension?[x**2 for x in range(10)]
,它等價于:
l?=?[]for?x?in?range(10): ????l.append(x**2)
所以,list comprehension 只是一個語法糖,能讓容器的初始化變得更加簡潔,但它本質(zhì)上還是在往容器里不斷塞東西。(當(dāng)然,由于這個語法存在,python 也可以針對性的優(yōu)化性能,性能會比自己?append
?好一些)
List comprehensions provide a concise way to create lists.
List comprehensions 提供了一種簡潔明了的方式來創(chuàng)建?list
。
來自?python 官方文檔
它跟 generator 概念不一樣,如果要說的話,迭代器(iterator)可能才是描述?x**2 for x in range(10)
?這種語法的正確方法,雖然它的名字確實叫做?generator expression。
其次,什么是 generator。
這個概念本身是很晦澀,如果初學(xué)不要強(qiáng)行理解。
簡單說它就是一個數(shù)據(jù)生成器,或者精確點說,它是個調(diào)用者可控的迭代器(iterator),僅此而已。
Generator 函數(shù)就像一個扭蛋機(jī),使用者每次投入一枚硬幣它就吐出一顆扭蛋。
扭蛋機(jī)不知道也不關(guān)心使用者是誰
使用者不知道也不關(guān)心下次吐出的扭蛋是什么
當(dāng)使用想要扭蛋的時候就投幣,立即就會出一個扭蛋,或者告訴他已經(jīng)沒有庫存了
當(dāng)使用者不需要扭蛋的時候,他就可以一直無視這個扭蛋機(jī)
這樣設(shè)計的好處是,耦合低和可控。
至于 generator 的高級用法,比如模擬 coroutine 什么的,可以暫時無視。
最后,關(guān)于?map
、filter
?等函數(shù)的設(shè)計思路。
從 generator 的特性可以看出,它所能表達(dá)的只能是一種順序輸出的情況,無法后悔,除非從頭開始。
這就像一條工廠的流水線,只能向前不能后退。
如果我們有這樣一條流水線,我們能做什么呢?
流水線的入口接著一個 generator,源源不斷的從 generator 輸出到流水線
我們可以對流水線上的東西進(jìn)行加工,一塊鋼板在上面銼一下變成某米的后蓋,這就是?
map
我們可以把流水線上的殘次品扔掉,這就是?
filter
流水線生產(chǎn)是工業(yè)時代智慧體現(xiàn),能夠?qū)?zhí)行效率做到最高,并且流水線上各個環(huán)節(jié)都沒有耦合性,它的合理性相當(dāng)明顯。
- 3 回答
- 0 關(guān)注
- 288 瀏覽
添加回答
舉報