国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python列表推導式與生成器用法分析

2020-02-15 22:38:32
字體:
來源:轉載
供稿:網友

本文實例講述了Python列表推導式與生成器用法。分享給大家供大家參考,具體如下:

1. 先看兩個列表推導式

def t1():  func1 = [lambda x: x*i for i in range(10)]  result1 = [f1(2) for f1 in func1]  print result1def 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(),加上小括號以后,此時變為了調用函數對象。

函數對象只有在調用的時候才開始對內部的變量進行引用。在t1()方法中,對i來說, 當函數對它引用的時候, 它已經變為9, 所以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]

此時,相當于把列表推導式變成了生成器,結果又不一樣了!

對于生成器, 只有你需要的時候它才會求值, 這也是和列表解析式的區別, 列表解析式只要你運行, 馬上就把i變為了9, 可是生成器不會, 當你調用第一個函數的時候, 他把相應的i求出來, 然后停止, 等你下一次調用, 這個就完美符合我們的預期了.

更多關于Python相關內容可查看本站專題:《Python列表(list)操作技巧總結》、《Python字符串操作技巧匯總》、《Python數據結構與算法教程》、《Python函數使用技巧總結》、《Python入門與進階經典教程》及《Python文件與目錄操作技巧匯總》

希望本文所述對大家Python程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宕昌县| 门头沟区| 梅州市| 泽库县| 德清县| 阜康市| 庐江县| 社旗县| 睢宁县| 清丰县| 雷波县| 永昌县| 凤山县| 兴义市| 屯昌县| 衡阳县| 沛县| 仲巴县| 汨罗市| 疏勒县| 潜山县| 绵竹市| 长海县| 漳州市| 潢川县| 兴山县| 韶关市| 米易县| 南宫市| 平安县| 兴海县| 修武县| 抚州市| 延川县| 炎陵县| 乐昌市| 临澧县| 临澧县| 衢州市| 平度市| 罗山县|