Python列表推導(dǎo)式與生成器用法分析
本文實例講述了Python列表推導(dǎo)式與生成器用法。分享給大家供大家參考,具體如下:
1. 先看兩個列表推導(dǎo)式
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
上面是兩個列表推導(dǎo)式,里面包含有lambda
表達(dá)式。輸出結(jié)果分別為:
[18, 18, 18, 18, 18, 18, 18, 18, 18, 18]
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
2. 為什么結(jié)果會不同
在上面的例子中,列表解析會生成一系列的函數(shù)對象。例如
def func(): pass
會產(chǎn)生一個名為func的函數(shù)對象。注意不同于func()
,加上小括號以后,此時變?yōu)榱苏{(diào)用函數(shù)對象。
函數(shù)對象只有在調(diào)用的時候才開始對內(nèi)部的變量進(jìn)行引用。在t1()
方法中,對i來說, 當(dāng)函數(shù)對它引用的時候, 它已經(jīng)變?yōu)?, 所以10個函數(shù)都引用了i=9
。
而對于t2()
方法來說,lambda
函數(shù)相當(dāng)于變成接受兩個參數(shù)了,所以返回了不一樣的結(jié)果。
3. 另外的方式
def t3(): func3 = (lambda x: x*i for i in range(10)) result3 = [f3(2) for f3 in func3] print result3
上面的代碼,輸出的結(jié)果為:
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
此時,相當(dāng)于把列表推導(dǎo)式變成了生成器,結(jié)果又不一樣了!
對于生成器, 只有你需要的時候它才會求值, 這也是和列表解析式的區(qū)別, 列表解析式只要你運(yùn)行, 馬上就把i變?yōu)榱?, 可是生成器不會, 當(dāng)你調(diào)用第一個函數(shù)的時候, 他把相應(yīng)的i求出來, 然后停止, 等你下一次調(diào)用, 這個就完美符合我們的預(yù)期了.
更多關(guān)于Python相關(guān)內(nèi)容可查看本站專題:《Python列表(list)操作技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python入門與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對大家Python程序設(shè)計有所幫助。
相關(guān)文章
Python使用plt.boxplot() 參數(shù)繪制箱線圖
這篇文章主要介紹了Python使用plt.boxplot() 參數(shù)繪制箱線圖 ,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06python 實現(xiàn)數(shù)組list 添加、修改、刪除的方法
下面小編就為大家分享一篇python 實現(xiàn)數(shù)組list 添加、修改、刪除的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04如何不用安裝python就能在.NET里調(diào)用Python庫
這篇文章主要介紹了如何不用安裝python就能在.NET里調(diào)用Python庫,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-07-07終于搞懂了Keras中multiloss的對應(yīng)關(guān)系介紹
這篇文章主要介紹了終于搞懂了Keras中multiloss的對應(yīng)關(guān)系介紹,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06pytorch中Tensor.to(device)和model.to(device)的區(qū)別及說明
這篇文章主要介紹了pytorch中Tensor.to(device)和model.to(device)的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07python實現(xiàn)一行輸入多個值和一行輸出多個值的例子
今天小編就為大家分享一篇python實現(xiàn)一行輸入多個值和一行輸出多個值的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07