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中mechanize库的简单使用示例
Jan 10 Python
Python中logging模块的用法实例
Sep 29 Python
Python pickle类库介绍(对象序列化和反序列化)
Nov 21 Python
python简单实现基数排序算法
May 16 Python
Python实现简单的用户交互方法详解
Sep 25 Python
Pycharm远程调试原理及具体配置详解
Aug 08 Python
python画蝴蝶曲线图的实例
Nov 21 Python
关于sys.stdout和print的区别详解
Dec 05 Python
tensorflow保持每次训练结果一致的简单实现
Feb 17 Python
django之导入并执行自定义的函数模块图解
Apr 01 Python
PyQt5通过信号实现MVC的示例
Feb 06 Python
python模块与C和C++动态库相互调用实现过程示例
Nov 02 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 反向排序和随机排序代码
2010/06/30 PHP
php 修改、增加xml结点属性的实现代码
2013/10/22 PHP
Yii2实现同时搜索多个字段的方法
2016/08/10 PHP
用javascript实现自定义标签
2007/05/08 Javascript
商城常用滚动的焦点图效果代码简单实用
2013/03/28 Javascript
利用js判断浏览器类型(是否为IE,Firefox,Opera浏览器)
2013/11/22 Javascript
全面解析Bootstrap排版使用方法(文字样式)
2015/11/30 Javascript
基于javascript实现简单计算器功能
2016/01/03 Javascript
Node.js服务器环境下使用Mock.js拦截AJAX请求的教程
2016/05/23 Javascript
AngularJS+Bootstrap实现多文件上传与管理
2016/11/08 Javascript
Bootstrap popover用法详解
2016/12/22 Javascript
Bootstrap源码解读模态弹出框(11)
2016/12/28 Javascript
jQuery编写textarea输入字数限制代码
2017/03/23 jQuery
详解angularJs中关于ng-class的三种使用方式说明
2017/06/02 Javascript
jQuery扇形定时器插件pietimer使用方法详解
2017/07/18 jQuery
JS随机排序数组实现方法分析
2017/10/11 Javascript
vue2.0 资源文件assets和static的区别详解
2018/04/08 Javascript
Vue源码解析之Template转化为AST的实现方法
2018/12/14 Javascript
Vue 3.0双向绑定原理的实现方法
2019/10/23 Javascript
[46:28]EG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.23
2019/09/05 DOTA
Pycharm学习教程(4) Python解释器的相关配置
2017/05/03 Python
Pycharm学习教程(7)虚拟机VM的配置教程
2017/05/04 Python
解决Python的str强转int时遇到的问题
2018/04/09 Python
pandas 按照特定顺序输出的实现代码
2018/07/10 Python
Django 创建新App及其常用命令的实现方法
2019/08/04 Python
Python3自定义http/https请求拦截mitmproxy脚本实例
2020/05/11 Python
马德里竞技官方网上商店:Atletico Madrid Shop
2019/03/31 全球购物
C语言编程题
2015/03/09 面试题
幼儿园中班教师寄语
2014/04/03 职场文书
交通事故协议书范文
2014/04/16 职场文书
2015年扶贫帮困工作总结
2015/05/20 职场文书
芙蓉镇观后感
2015/06/10 职场文书
2016年圣诞节活动总结范文
2016/04/01 职场文书
2019求职信大礼包
2019/05/15 职场文书
导游词之徐州-云龙山
2019/09/29 职场文书
Python实战实现爬取天气数据并完成可视化分析详解
2022/06/16 Python