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中threading超线程用法实例分析
May 16 Python
django实现分页的方法
May 26 Python
Python实现高效求解素数代码实例
Jun 30 Python
django 按时间范围查询数据库实例代码
Feb 11 Python
python处理csv中的空值方法
Jun 22 Python
Python+OpenCV感兴趣区域ROI提取方法
Jan 10 Python
python如何获取当前文件夹下所有文件名详解
Jan 25 Python
python基础教程之while循环
Aug 14 Python
在tensorflow中实现屏蔽输出的log信息
Feb 04 Python
python库skimage给灰度图像染色的方法示例
Apr 27 Python
python中urllib.request和requests的使用及区别详解
May 05 Python
Flask使用SQLAlchemy实现持久化数据
Jul 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中防止伪造跨站请求的小招式
2011/09/02 PHP
phpExcel中文帮助手册之常用功能指南
2014/08/18 PHP
又一个PHP实现的冒泡排序算法分享
2014/08/21 PHP
简单介绍PHP的责任链编程模式
2015/08/11 PHP
PHP与以太坊交互详解
2018/08/24 PHP
jQuery html()等方法介绍
2009/11/18 Javascript
在javascript中实现函数数组的方法
2013/12/25 Javascript
用原生js做个简单的滑动效果的回到顶部
2014/10/15 Javascript
jQuery实现判断滚动条到底部
2015/06/23 Javascript
JavaScript String 对象常用方法总结
2016/04/28 Javascript
原生js实现ajax方法(超简单)
2016/09/20 Javascript
Bootstrap警告(Alerts)的实现方法
2017/03/22 Javascript
xmlplus组件设计系列之按钮(2)
2017/04/26 Javascript
Vue 多层组件嵌套二种实现方式(测试实例)
2017/09/08 Javascript
JavaScript事件处理程序详解
2017/09/19 Javascript
通俗易懂地解释JS中的闭包
2017/10/23 Javascript
vue 父组件调用子组件方法及事件
2018/03/29 Javascript
对vuejs的v-for遍历、v-bind动态改变值、v-if进行判断的实例讲解
2018/08/27 Javascript
Nodejs调用Dll模块的方法
2018/09/17 NodeJs
微信小程序与webview交互实现支付功能
2019/06/07 Javascript
基于jQuery实现挂号平台首页源码
2020/01/06 jQuery
js实现点击上传图片并设为模糊背景
2020/08/02 Javascript
Python实现SSH远程登陆,并执行命令的方法(分享)
2017/05/08 Python
Python 判断文件或目录是否存在的实例代码
2018/07/19 Python
Python实现变声器功能(萝莉音御姐音)
2019/12/05 Python
Python导入模块包原理及相关注意事项
2020/03/25 Python
一文详述 Python 中的 property 语法
2020/09/01 Python
Python+Selenium随机生成手机验证码并检查页面上是否弹出重复手机号码提示框
2020/09/21 Python
日本热销NO.1胶原蛋白冻:Aishitoto爱希特多
2019/06/20 全球购物
火车的故事教学反思
2014/02/11 职场文书
《大海那边》教学反思
2014/04/09 职场文书
高中毕业典礼演讲稿
2014/09/09 职场文书
大学生党员自我剖析材料
2014/10/06 职场文书
关于群众路线的心得体会
2014/11/05 职场文书
团员个人总结
2015/02/26 职场文书
美国运营商 T-Mobile 以 117.83Mb/s 的速度排第一位
2022/04/21 数码科技