Python列表推导式与生成器用法分析
本文实例讲述了Python列表推导式与生成器用法。分享给大家供大家参考,具体如下:
1.先看两个列表推导式
deft1(): func1=[lambdax:x*iforiinrange(10)] result1=[f1(2)forf1infunc1] printresult1 deft2(): func2=[lambdax,i=i:x*iforiinrange(10)] result2=[f2(2)forf2infunc2] printresult2
上面是两个列表推导式,里面包含有lambda表达式。输出结果分别为:
[18,18,18,18,18,18,18,18,18,18]
[0,2,4,6,8,10,12,14,16,18]
2.为什么结果会不同
在上面的例子中,列表解析会生成一系列的函数对象。例如
deffunc(): pass
会产生一个名为func的函数对象。注意不同于func(),加上小括号以后,此时变为了调用函数对象。
函数对象只有在调用的时候才开始对内部的变量进行引用。在t1()方法中,对i来说,当函数对它引用的时候,它已经变为9,所以10个函数都引用了i=9。
而对于t2()方法来说,lambda函数相当于变成接受两个参数了,所以返回了不一样的结果。
3.另外的方式
deft3(): func3=(lambdax:x*iforiinrange(10)) result3=[f3(2)forf3infunc3] printresult3
上面的代码,输出的结果为:
[0,2,4,6,8,10,12,14,16,18]
此时,相当于把列表推导式变成了生成器,结果又不一样了!
对于生成器,只有你需要的时候它才会求值,这也是和列表解析式的区别,列表解析式只要你运行,马上就把i变为了9,可是生成器不会,当你调用第一个函数的时候,他把相应的i求出来,然后停止,等你下一次调用,这个就完美符合我们的预期了.
更多关于Python相关内容可查看本站专题:《Python列表(list)操作技巧总结》、《Python字符串操作技巧汇总》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》
希望本文所述对大家Python程序设计有所帮助。