Python列表推导式与生成器用法分析


Posted in Python onAugust 02, 2018

本文实例讲述了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相关内容可查看本站专题:《Python列表(list)操作技巧总结》、《Python字符串操作技巧汇总》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
老生常谈python函数参数的区别(必看篇)
May 29 Python
python shell根据ip获取主机名代码示例
Nov 25 Python
python实现dijkstra最短路由算法
Jan 17 Python
python assert的用处示例详解
Apr 01 Python
Python3中_(下划线)和__(双下划线)的用途和区别
Apr 26 Python
python:按行读入,排序然后输出的方法
Jul 20 Python
python等差数列求和公式前 100 项的和实例
Feb 25 Python
python实现银行实战系统
Feb 26 Python
使用keras实现孪生网络中的权值共享教程
Jun 11 Python
python将下载到本地m3u8视频合成MP4的代码详解
Nov 24 Python
python 简单的调用有道翻译
Nov 25 Python
python单元测试之pytest的使用
Jun 07 Python
python flask实现分页的示例代码
Aug 02 #Python
Django分页查询并返回jsons数据(中文乱码解决方法)
Aug 02 #Python
Python实现正整数分解质因数操作示例
Aug 01 #Python
Python列表生成式与生成器操作示例
Aug 01 #Python
Python开发最牛逼的IDE——pycharm
Aug 01 #Python
django从请求到响应的过程深入讲解
Aug 01 #Python
python3.6的venv模块使用详解
Aug 01 #Python
You might like
DC宇宙的第一个英雄,堪称动漫史鼻祖,如今成为美国文化的象征
2020/04/09 欧美动漫
php+redis在实际项目中HTTP 500: Internal Server Error故障排除
2017/02/05 PHP
PHP获取本周所有日期或者最近七天所有日期的方法
2018/06/20 PHP
Laravel统一错误处理为JSON的方法介绍
2020/10/18 PHP
js 链式延迟执行DOME
2012/01/04 Javascript
基于jquery自己写tab滑动门(通用版)
2012/10/30 Javascript
javascript四舍五入函数代码分享(保留后几位)
2013/12/10 Javascript
jquery中animate的stop()方法作用实例分析
2015/01/30 Javascript
javascript Array 数组常用方法
2015/04/05 Javascript
基于Javascript倒计时效果
2016/12/22 Javascript
详解javascript中对数据格式化的思考
2017/01/23 Javascript
js时间戳格式化成日期格式的多种方法介绍
2017/02/16 Javascript
javascript简单链式调用案例分析
2017/05/10 Javascript
深入理解Vue-cli搭建项目后的目录结构探秘
2017/07/13 Javascript
angular2路由切换改变页面title的示例代码
2017/08/23 Javascript
Vue的轮播图组件实现方法
2018/03/03 Javascript
VueCli3构建TS项目的方法步骤
2018/11/07 Javascript
layui-laydate时间日历控件使用方法详解
2018/11/15 Javascript
浅谈 Webpack 如何处理图片(开发、打包、优化)
2019/05/15 Javascript
js获取本日、本周、本月的时间代码
2020/02/01 Javascript
es6中let和const的使用方法详解
2020/02/24 Javascript
Vue中computed及watch区别实例解析
2020/08/01 Javascript
vue实现选中效果
2020/10/07 Javascript
[02:34]DOTA2亚洲邀请赛 BG战队出场宣传片
2015/03/09 DOTA
Python标准库urllib2的一些使用细节总结
2015/03/16 Python
在Python中利用Pandas库处理大数据的简单介绍
2015/04/07 Python
python嵌套字典比较值与取值的实现示例
2017/11/03 Python
Python3实现腾讯云OCR识别
2018/11/27 Python
python实现石头剪刀布程序
2021/01/20 Python
对Python的多进程锁的使用方法详解
2019/02/18 Python
python数组循环处理方法
2019/08/26 Python
Python ArgumentParse的subparser用法说明
2020/04/20 Python
Pycharm常用快捷键总结及配置方法
2020/11/14 Python
大学生个人简历自我评价
2013/11/16 职场文书
庐山导游词
2015/02/03 职场文书
排查并解决MySQL生产库内存使用率高的报警
2022/04/11 MySQL