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笔记(1) 关于我们应不应该继续学习python
Oct 24 Python
python通过装饰器检查函数参数数据类型的方法
Mar 13 Python
python定时器(Timer)用法简单实例
Jun 04 Python
在Linux下使用Python的matplotlib绘制数据图的教程
Jun 11 Python
Python中的zipfile模块使用详解
Jun 25 Python
使用Python3编写抓取网页和只抓网页图片的脚本
Aug 20 Python
解决pip install的时候报错timed out的问题
Jun 12 Python
Python实现的银行系统模拟程序完整案例
Apr 12 Python
Django中使用 Closure Table 储存无限分级数据
Jun 06 Python
python的scipy实现插值的示例代码
Nov 12 Python
Windows下Anaconda安装、换源与更新的方法
Apr 17 Python
python -v 报错问题的解决方法
Sep 15 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
ThinkPHP实现跨模块调用操作方法概述
2014/06/20 PHP
jQuery+PHP+ajax实现微博加载更多内容列表功能
2014/06/27 PHP
PHP获取文件夹大小函数用法实例
2015/07/01 PHP
PHP实现的解汉诺塔问题算法示例
2018/08/06 PHP
javascript轻松实现当鼠标移开时已弹出子菜单自动消失
2013/12/29 Javascript
js加载读取内容及显示与隐藏div示例
2014/02/13 Javascript
如何正确使用javascript 来进行我们的程序开发
2014/06/23 Javascript
JS简单模拟触发按钮点击功能的方法
2015/11/30 Javascript
js实现3D图片环展示效果
2017/03/09 Javascript
JavaScript实现跟随滚动缓冲运动广告框
2017/07/15 Javascript
详解vue中async-await的使用误区
2018/12/05 Javascript
JS实现的排列组合算法示例
2019/07/16 Javascript
vue中使用极验验证码的方法(附demo)
2019/12/04 Javascript
Java Varargs 可变参数用法详解
2020/01/28 Javascript
vue实现PC端分辨率适配操作
2020/08/03 Javascript
浅析Python多线程下的变量问题
2015/04/28 Python
Python使用SocketServer模块编写基本服务器程序的教程
2016/07/12 Python
pandas DataFrame的修改方法(值、列、索引)
2019/08/02 Python
Opencv求取连通区域重心实例
2020/06/04 Python
基于python实现计算两组数据P值
2020/07/10 Python
深入了解Python 方法之类方法 & 静态方法
2020/08/17 Python
CSS3实现简易版的刮刮乐效果
2016/09/27 HTML / CSS
HTML5新特性之语义化标签
2017/10/31 HTML / CSS
zooplus意大利:在线宠物商店
2019/08/07 全球购物
行政文员岗位职责
2013/11/08 职场文书
生产总经理岗位职责
2013/12/19 职场文书
大学生收银员求职信分享
2014/01/02 职场文书
党员违纪检讨书
2014/02/18 职场文书
生日礼品店创业计划书范文
2014/03/21 职场文书
校园活动宣传方案
2014/03/28 职场文书
讲座通知范文
2015/04/23 职场文书
《钓鱼的启示》教学反思
2016/02/18 职场文书
《自己的花是让别人看的》教学反思
2016/02/19 职场文书
Golang标准库syscall详解(什么是系统调用)
2021/05/25 Golang
Docker下安装Oracle19c
2022/04/13 Servers
MySQL深分页问题解决思路
2022/12/24 MySQL