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中实现对Timestamp和Datetime及UTC时间之间的转换
Apr 08 Python
在Python的Django框架中实现Hacker News的一些功能
Apr 17 Python
Python3中类、模块、错误与异常、文件的简易教程
Nov 20 Python
分享一下Python数据分析常用的8款工具
Apr 29 Python
python 实现将字典dict、列表list中的中文正常显示方法
Jul 06 Python
Flask框架信号用法实例分析
Jul 24 Python
Django框架 querySet功能解析
Sep 04 Python
使用jupyter Nodebook查看函数或方法的参数以及使用情况
Apr 14 Python
浅谈pandas dataframe对除数是零的处理
Jul 20 Python
给Django Admin添加验证码和多次登录尝试限制的实现
Jul 26 Python
Python监听剪切板实现方法代码实例
Nov 11 Python
pytorch 计算Parameter和FLOP的操作
Mar 04 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
如何分别全角和半角以避免乱码
2006/10/09 PHP
php 文件上传代码(限制jpg文件)
2010/01/05 PHP
php自定义函数转换html标签示例
2016/09/29 PHP
PHP递归实现快速排序的方法示例
2017/12/18 PHP
PHP+mysql防止SQL注入的方法小结
2019/04/27 PHP
php实现微信公众号创建自定义菜单功能的实例代码
2019/06/11 PHP
Add a Formatted Table to a Word Document
2007/06/15 Javascript
几个javascript操作word的参考代码
2009/10/26 Javascript
JS模式之单例模式基本用法
2015/06/30 Javascript
JQuery日期插件datepicker的使用方法
2016/03/03 Javascript
jQuery 3.0十大新特性最终版发布
2016/07/14 Javascript
js中用cssText设置css样式的简单方法
2016/09/19 Javascript
原生js实现电商侧边导航效果
2017/01/19 Javascript
微信小程序 开发之顶部导航栏实例代码
2017/02/23 Javascript
Jquery遍历筛选数组的几种方法和遍历解析json对象,Map()方法详解以及数组中查询某值是否存在
2019/01/18 jQuery
利用vue重构有赞商城的思路以及总结整理
2019/02/21 Javascript
JavaScript setInterval()与setTimeout()计时器
2019/12/27 Javascript
Vue切换div显示隐藏,多选,单选代码解析
2020/07/14 Javascript
Element-ui upload上传文件限制的解决方法
2021/01/22 Javascript
[00:32]2018DOTA2亚洲邀请赛VGJ.T出场
2018/04/03 DOTA
python编程使用selenium模拟登陆淘宝实例代码
2018/01/25 Python
Python基于Floyd算法求解最短路径距离问题实例详解
2018/05/16 Python
双向RNN:bidirectional_dynamic_rnn()函数的使用详解
2020/01/20 Python
Python Map 函数的使用
2020/08/28 Python
NFL墨西哥官方商店:Tienda NFL
2017/11/28 全球购物
北美最大的参茸药食商城:德成行
2020/12/06 全球购物
为什么要用EJB
2014/04/17 面试题
竞争与合作演讲稿
2014/05/12 职场文书
安全宣传标语口号
2014/06/06 职场文书
幼儿园中班区域活动总结
2014/07/09 职场文书
2015建军节87周年演讲稿
2015/03/19 职场文书
工程催款通知书
2015/04/17 职场文书
2015年药品销售工作总结范文
2015/05/25 职场文书
长征观后感
2015/06/09 职场文书
python - timeit 时间模块
2021/04/06 Python
go使用Gin框架利用阿里云实现短信验证码功能
2021/08/04 Golang