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写入CSV文件的方法
Jul 08 Python
关于python的list相关知识(推荐)
Aug 30 Python
django限制匿名用户访问及重定向的方法实例
Feb 07 Python
python实现微信发送邮件关闭电脑功能
Feb 22 Python
python3 破解 geetest(极验)的滑块验证码功能
Feb 24 Python
python3爬取各类天气信息
Feb 24 Python
python解析json串与正则匹配对比方法
Dec 20 Python
Python关于excel和shp的使用在matplotlib
Jan 03 Python
django正续或者倒序查库实例
May 19 Python
python 解决mysql where in 对列表(list,,array)问题
Jun 06 Python
Python入门基础之数字字符串与列表
Feb 01 Python
matplotlib源码解析标题实现(窗口标题,标题,子图标题不同之间的差异)
Feb 22 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设计模式之迭代器模式的深入解析
2013/06/13 PHP
windows下配置apache+php+mysql时出现问题的处理方法
2014/06/20 PHP
typecho插件编写教程(三):保存配置
2015/05/28 PHP
thinkPHP交易详情查询功能详解
2016/12/02 PHP
PHP封装的多文件上传类实例与用法详解
2017/02/07 PHP
PHP html_entity_decode()函数讲解
2019/02/25 PHP
php使用pecl方式安装扩展操作示例
2019/08/12 PHP
javascript 无提示关闭窗口脚本
2009/08/17 Javascript
jQuery ajax在GBK编码下表单提交终极解决方案(非二次编码方法)
2010/10/20 Javascript
JS/jQuery实现默认显示部分文字点击按钮显示全部内容
2013/05/13 Javascript
浅析JavaScript中的常用算法与函数
2013/11/21 Javascript
JavaScript解析json格式数据简单示例
2014/12/09 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 简史
2015/01/09 Javascript
浅谈JSON.parse()和JSON.stringify()
2015/07/14 Javascript
JS实现按比例缩放图片的方法(附C#版代码)
2015/12/08 Javascript
详解webpack进阶之插件篇
2017/07/06 Javascript
实现jquery放大镜的两种方法
2018/02/22 jQuery
vue 设置proxyTable参数进行代理跨域
2018/04/09 Javascript
如何利用@angular/cli V6.0直接开发PWA应用详解
2018/05/06 Javascript
详解微信小程序网络请求接口封装实例
2019/05/02 Javascript
非常实用的jQuery代码段集锦【检测浏览器、滚动、复制、淡入淡出等】
2019/08/08 jQuery
基于iview-admin实现动态路由的示例代码
2019/10/02 Javascript
Vue.js中provide/inject实现响应式数据更新的方法示例
2019/10/16 Javascript
在 Vue 中使用 JSX 及使用它的原因浅析
2020/02/10 Javascript
vue中移动端调取本地的复制的文本方式
2020/07/18 Javascript
Python的Tornado框架实现异步非阻塞访问数据库的示例
2016/06/30 Python
python中解析json格式文件的方法示例
2017/05/03 Python
利用Python读取文件的四种不同方法比对
2017/05/18 Python
使用Python做垃圾分类的原理及实例代码附源码
2019/07/02 Python
如何用 Python 制作 GitHub 消息助手
2021/02/20 Python
小天鹅官方商城:LittleSwan
2017/06/16 全球购物
Feelunique美国:欧洲大型的在线美妆零售电商
2018/11/04 全球购物
英文自荐信
2013/12/19 职场文书
竞选班长演讲稿
2013/12/30 职场文书
深入浅析Django MTV模式
2021/09/04 Python
nginx中proxy_pass各种用法详解
2021/11/07 Servers