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自然语言编码转换模块codecs介绍
Apr 08 Python
Python中文竖排显示的方法
Jul 28 Python
Python 文件处理注意事项总结
Apr 10 Python
python3.6+django2.0开发一套学员管理系统
Mar 03 Python
使用实现XlsxWriter创建Excel文件并编辑
May 04 Python
Python中模块(Module)和包(Package)的区别详解
Aug 07 Python
python安装virtualenv虚拟环境步骤图文详解
Sep 18 Python
Python操作MySQL数据库实例详解【安装、连接、增删改查等】
Jan 17 Python
django3.02模板中的超链接配置实例代码
Feb 04 Python
pytorch 实现在一个优化器中设置多个网络参数的例子
Feb 20 Python
浅谈Keras的Sequential与PyTorch的Sequential的区别
Jun 17 Python
python如何运行js语句
Sep 09 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
咖啡知识大全
2021/03/03 新手入门
php 无法加载mysql的module的时候的配置的解决方案引发的思考
2012/01/27 PHP
WordPress中限制非管理员用户在文章后只能评论一次
2015/12/31 PHP
PHP实现一个简单url路由功能实例
2016/11/05 PHP
PHP用正则匹配form表单中所有元素的类型和属性值实例代码
2017/02/28 PHP
laravel5.4生成验证码的实例讲解
2017/08/05 PHP
JavaScript中的集合及效率
2010/01/08 Javascript
兼容IE和FF的js脚本代码小结(比较常用)
2010/12/06 Javascript
PHP使用方法重载实现动态创建属性的get和set方法
2014/11/17 Javascript
js实现鼠标划过给div加透明度的方法
2015/05/25 Javascript
JS选取DOM元素的简单方法
2016/07/08 Javascript
Node.js实现简单管理系统
2019/09/23 Javascript
js实现双人五子棋小游戏
2020/05/28 Javascript
JS实现密码框效果
2020/09/10 Javascript
[01:31](回顾)杀出重围,决战TI之巅
2014/07/01 DOTA
用Python编程实现语音控制电脑
2014/04/01 Python
用Python制作在地图上模拟瘟疫扩散的Gif图
2015/03/31 Python
Python找出最小的K个数实例代码
2018/01/04 Python
Python KMeans聚类问题分析
2018/02/23 Python
Python File readlines() 使用方法
2018/03/19 Python
python监测当前联网状态并连接的实例
2018/12/18 Python
Python之——生成动态路由轨迹图的实例
2019/11/22 Python
使用python的pyplot绘制函数实例
2020/02/13 Python
Django models文件模型变更错误解决
2020/05/11 Python
Homestay中文官网:全球寄宿家庭
2018/10/18 全球购物
戴森英国官网:Dyson英国
2019/05/07 全球购物
软件测试面试题
2015/10/21 面试题
高考自主招生自荐信
2013/10/20 职场文书
大学活动总结范文
2014/04/29 职场文书
2014年党支部学习材料
2014/05/19 职场文书
入党综合考察材料
2014/06/02 职场文书
暑假社会实践心得体会
2014/09/02 职场文书
小学生暑假生活总结
2015/07/13 职场文书
python 爬取哔哩哔哩up主信息和投稿视频
2021/06/07 Python
mysql优化之query_cache_limit参数说明
2021/07/01 MySQL
Win10防火墙白名单怎么设置?Win10添加防火墙白名单方法
2022/04/06 数码科技