Python列表推导式与生成器用法分析
作者:bitcarmanlee 时间:2022-03-21 12:06:54
本文实例讲述了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()
,加上小括号以后,此时变为了调用函数对象。
函数对象只有在调用的时候才开始对内部的变量进行引用。在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程序设计有所帮助。
来源:https://blog.csdn.net/bitcarmanlee/article/details/78347870
标签:Python,列表推导式,生成器
0
投稿
猜你喜欢
从 msxml6.dll 中获取 DOMDocument 对象的方法与属性
2009-02-22 18:46:00
2020年10款优秀的Python第三方库,看看有你中意的吗?
2021-01-03 10:35:08
深入SQL SERVER 2000的内存管理机制
2010-04-25 10:52:00
在ASP.NET 2.0中操作数据之三十七:DataList批量更新
2023-07-23 10:59:03
Python初学者必须掌握的25个内置函数详解
2022-07-02 16:09:21
python可视化text()函数使用详解
2023-08-31 19:48:15
Laravel框架文件上传功能实现方法示例
2023-11-15 19:16:31
Anaconda和Pycharm的安装配置教程分享
2022-10-22 07:12:30
python中列表添加元素的几种方式(+、append()、extend())
2022-07-17 19:59:42
Django框架静态文件使用/中间件/禁用ip功能实例详解
2023-06-12 02:48:38
如何让利用Python+AI使静态图片动起来
2022-06-06 08:15:31
sqlserver 多库查询 sp_addlinkedserver使用方法(添加链接服务器)
2011-09-30 11:49:22
详解Python Flask API 示例演示(附cookies和session)
2021-12-03 18:37:29
python中protobuf和json互相转换应用处理方法
2023-03-15 11:50:55
sql处理数据库锁的存储过程分享
2023-07-05 18:03:25
Python函数式编程
2023-12-29 10:58:46
如何让shell终端和goland控制台输出彩色的文字
2023-07-13 03:24:56
Python个人博客程序开发实例信息显示
2022-07-06 15:31:05
asp随机提取access数据库记录的几种方法
2007-09-06 19:42:00
Python3实现简单可学习的手写体识别(实例讲解)
2021-10-05 14:24:05