python中的列表推导与生成器
来源:互联网 发布:天龙八部染发好看数据 编辑:程序博客网 时间:2024/05/29 14:56
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求出来, 然后停止, 等你下一次调用, 这个就完美符合我们的预期了.
阅读全文
0 0
- python中的列表推导与生成器
- Python中的列表推导和生成器表达式的使用
- Python语法实践之初探列表推导与生成器
- Python学习(二): 列表推导式与生成器表达式
- Python中的列表生成器与高级特性
- Python列表推导式和生成器表达式
- Python的列表推导式、迭代器、生成器
- python 列表推导和生成器表达式
- Python列表推导式、字典推导式、生成器示例
- python中的列表推导浅析
- Python中的列表推导式(list comprehension)
- Python中的循环,列表推导式
- Python中的嵌套列表推导式
- 004_002 Python 列表推导 列表函数调用 生成器表达式 生成列表
- python 中的列表解析和生成器表达式
- python中的迭代器与生成器
- python中的迭代器与生成器 .
- python中的迭代器与生成器
- 算法第二弹-线性规划之投资的收益和风险分析及代码实现
- 【java基础】多线程匿名内部类和lambda创建方式,及多线程中的两个面试题
- Docker环境安装以及基本使用
- SQL中内连接和外连接
- 利用ffmpeg将RTSP传输的h264原始码流保存到文件中
- python中的列表推导与生成器
- Java String 处理
- SSH与SSM学习之Spring13——动态代理之通知的使用
- 仿美团下拉刷新控件(一)
- NorFlash与NandFlash对比
- centOS7下编译安装nginx-1.12.2+php-7.1.9
- Javascript中call和apply的区别与详解
- Ajax基础
- 线程和进程的区别和联系