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