关于
Python list comprehension 其实就是 generator.
该怎么理解?
另外 map filter、generator 也让人挺不解的,求python 大牛都给解释下。这么设计的缘由是什么?
伊谢尔伦2017-04-17 13:46:40
首先關於問題裡面引用的那句話:不要這樣理解,會把自己繞進去,而且也不準確。
這個問題要往簡單來看。對於一個簡單的 list comprehension [x**2 for x in range(10)]
,它等價於:
l = []
for x in range(10):
l.append(x**2)
所以,list comprehension 只是一個語法糖,能讓容器的初始化變得更加簡潔,但它本質上還是在往容器裡不斷塞東西。 (當然,由於這個語法存在,python 也可以針對性的最佳化效能,效能會比自己 append
好一些)
List comprehensions provide a concise way to create lists.
List comprehensions 提供了一種簡潔明了的方式來創建list
。
來自 python 官方文件
它跟 generator 概念不一樣,如果要說的話,迭代器(iterator)可能才是描述 x**2 for x in range(10)
這種語法的正確方法,雖然它的名字確實叫做 generator expression。
其次,什麼是 generator。
這個概念本身是很晦澀,如果初學不要強行理解。
簡單說它就是一個資料產生器,或精確點說,它是個呼叫者可控制的迭代器(iterator),僅此而已。
Generator 函數就像一個扭蛋機,使用者每次投入一枚硬幣它就吐出一顆扭蛋。
這樣設計的好處是,耦合低和可控。
至於 generator 的高階用法,例如模擬 coroutine 什麼的,可以暫時無視。
最後,關於 map
、filter
等函數的設計思路。
從 generator 的特性可以看出,它所能表達的只能是一種順序輸出的情況,無法後悔,除非從頭開始。
這就像一條工廠的流水線,只能向前不能後退。
如果我們有這樣一條流水線,我們能做什麼呢?
map
filter
管線生產是工業時代智慧體現,能夠將執行效率做到最高,且管線上各個環節都沒有耦合性,它的合理性相當明顯。
PHPz2017-04-17 13:46:40
這樣處理主要是 Lazy
求值的做法
設想一些應用場景,你需要對1000萬個斐波那切數相加求和。
第二種方法,就是一種 lazy
的方式,也就是 python
慣用的 generator