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中的类与对象之描述符详解
Mar 27 Python
Python3处理文件中每个词的方法
May 22 Python
使用Python的urllib2模块处理url和图片的技巧两则
Feb 18 Python
django模板语法学习之include示例详解
Dec 17 Python
Python之web模板应用
Dec 26 Python
python自动发送邮件脚本
Jun 20 Python
利用Django模版生成树状结构实例代码
May 19 Python
pycharm访问mysql数据库的方法步骤
Jun 18 Python
python 获取当前目录下的文件目录和文件名实例代码详解
Mar 10 Python
基于python实现可视化生成二维码工具
Jul 08 Python
Python DES加密实现原理及实例解析
Jul 17 Python
使用pd.merge表连接出现多余行的问题解决
Jun 16 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
PHP的autoload自动加载机制使用说明
2010/12/28 PHP
浏览器关闭后,能继续执行的php函数(ignore_user_abort)
2012/08/01 PHP
基于CakePHP实现的简单博客系统实例
2015/06/28 PHP
PHP预定义超全局数组变量小结
2018/08/20 PHP
php实现银联商务公众号+服务窗支付的示例代码
2019/10/12 PHP
javascript 设计模式之单体模式 面向对象学习基础
2010/04/18 Javascript
jquery实现文本框鼠标右击无效以及不能输入的代码
2010/11/05 Javascript
JavaScript中的几个关键概念的理解-原型链的构建
2011/05/12 Javascript
使用原生js写的一个简单slider
2014/04/29 Javascript
jQuery html()方法使用不了无法显示内容的问题
2014/08/06 Javascript
js单独获取一个checkbox看其是否被选中
2014/09/22 Javascript
javascript实现图片上传前台页面
2015/08/18 Javascript
JS+CSS实现的竖向简洁折叠菜单效果代码
2015/10/22 Javascript
JavaScript实现网页头部进度条刷新
2017/04/16 Javascript
利用node.js本地搭建HTTP服务器
2017/04/19 Javascript
js自定义瀑布流布局插件
2017/05/16 Javascript
javascript字体颜色控件的开发 JS实现字体控制
2017/11/27 Javascript
Vue中用props给data赋初始值遇到的问题解决
2018/11/27 Javascript
vue设置动态请求地址的例子
2019/11/01 Javascript
Vue自定义指令结合阿里云OSS优化图片的实现方法
2019/11/12 Javascript
浅析JavaScript 函数防抖和节流
2020/07/13 Javascript
js实现弹幕飞机效果
2020/08/27 Javascript
在Vue中使用mockjs代码实例
2020/11/25 Vue.js
[16:04]DOTA2海涛带你玩炸弹 9月5日更新内容详解
2014/09/05 DOTA
[01:27]DOTA2电竞之夜 今夜共饮庆功酒
2014/08/02 DOTA
Python字符串特性及常用字符串方法的简单笔记
2016/01/04 Python
Python数据库的连接实现方法与注意事项
2016/02/27 Python
Python+PIL实现支付宝AR红包
2018/02/09 Python
对python遍历文件夹中的所有jpg文件的实例详解
2018/12/08 Python
Python3+Appium实现多台移动设备操作的方法
2019/07/05 Python
解决flask接口返回的内容中文乱码的问题
2020/04/03 Python
小学中秋节活动方案
2014/02/06 职场文书
行政求职信
2014/07/04 职场文书
个人简历求职信范文
2015/03/20 职场文书
2019年汽车租赁合同范本!
2019/08/12 职场文书
通过Python把学姐照片做成拼图游戏
2022/02/15 Python