Python列表推導式與生成器用法分析
本文實例講述了Python列表推導式與生成器用法。分享給大家供大家參考,具體如下:
1. 先看兩個列表推導式
def t1(): func1 = [lambda x: x*i for i in range(10)] result1 = [f1(2) for f1 in func1] print result1 def t2(): func2 = [lambda x, i=i: x*i for i in range(10)] result2 = [f2(2) for f2 in func2] print result2
上面是兩個列表推導式,里面包含有lambda
表達式。輸出結果分別為:
[18, 18, 18, 18, 18, 18, 18, 18, 18, 18]
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
2. 為什么結果會不同
在上面的例子中,列表解析會生成一系列的函數對象。例如
def func(): pass
會產生一個名為func的函數對象。注意不同于func()
,加上小括號以后,此時變?yōu)榱苏{用函數對象。
函數對象只有在調用的時候才開始對內部的變量進行引用。在t1()
方法中,對i來說, 當函數對它引用的時候, 它已經變?yōu)?, 所以10個函數都引用了i=9
。
而對于t2()
方法來說,lambda
函數相當于變成接受兩個參數了,所以返回了不一樣的結果。
3. 另外的方式
def t3(): func3 = (lambda x: x*i for i in range(10)) result3 = [f3(2) for f3 in func3] print result3
上面的代碼,輸出的結果為:
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
此時,相當于把列表推導式變成了生成器,結果又不一樣了!
對于生成器, 只有你需要的時候它才會求值, 這也是和列表解析式的區(qū)別, 列表解析式只要你運行, 馬上就把i變?yōu)榱?, 可是生成器不會, 當你調用第一個函數的時候, 他把相應的i求出來, 然后停止, 等你下一次調用, 這個就完美符合我們的預期了.
更多關于Python相關內容可查看本站專題:《Python列表(list)操作技巧總結》、《Python字符串操作技巧匯總》、《Python數據結構與算法教程》、《Python函數使用技巧總結》、《Python入門與進階經典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對大家Python程序設計有所幫助。