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使用循环实现批量创建文件夹示例
Mar 25 Python
跟老齐学Python之不要红头文件(2)
Sep 28 Python
更改Python命令行交互提示符的方法
Jan 14 Python
Ubuntu安装Jupyter Notebook教程
Oct 18 Python
python正则表达式及使用正则表达式的例子
Jan 22 Python
实例讲解Python3中abs()函数
Feb 19 Python
Python实现的多进程拷贝文件并显示百分比功能示例
Apr 09 Python
python 实现将文件或文件夹用相对路径打包为 tar.gz 文件的方法
Jun 10 Python
用Pytorch训练CNN(数据集MNIST,使用GPU的方法)
Aug 19 Python
通过python扫描二维码/条形码并打印数据
Nov 14 Python
PyQt实现计数器的方法示例
Jan 18 Python
python区块链持久化和命令行接口实现简版
May 25 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/11/16 PHP
PHP扩展CURL的用法详解
2014/06/20 PHP
非常好用的Zend Framework分页类
2014/06/25 PHP
PHP列出MySQL中所有数据库的方法
2015/03/12 PHP
Laravel 5框架学习之Blade 简介
2015/04/08 PHP
PHP中SSO Cookie登录分析和实现
2015/11/06 PHP
详解PHP安装mysql.so扩展的方法
2016/12/31 PHP
php实现每日签到功能
2018/11/29 PHP
实例分析10个PHP常见安全问题
2019/07/09 PHP
js每次Title显示不同的名言
2008/09/25 Javascript
JavaScript 学习笔记(十四) 正则表达式
2010/01/22 Javascript
ext jquery 简单比较
2010/04/07 Javascript
Jquery 实现弹出层插件
2015/01/28 Javascript
简单实现js选项卡切换效果
2016/02/03 Javascript
js实现页面跳转的五种方法推荐
2016/03/10 Javascript
JS实现页面打印功能
2017/03/16 Javascript
JavaScript原型继承_动力节点Java学院整理
2017/06/30 Javascript
Vue引用第三方datepicker插件无法监听datepicker输入框的值的解决
2018/01/27 Javascript
Mac下安装vue
2018/04/11 Javascript
Angular数据绑定机制原理
2018/04/17 Javascript
bootstrap里bootstrap动态加载下拉框的实例讲解
2018/08/10 Javascript
vue-i18n结合Element-ui的配置方法
2019/05/20 Javascript
[00:10]DOTA2全国高校联赛 以DOTA2会友
2018/05/30 DOTA
Python实现将16进制字符串转化为ascii字符的方法分析
2017/07/21 Python
Python使用pymysql从MySQL数据库中读出数据的方法
2018/07/25 Python
Python中矩阵创建和矩阵运算方法
2018/08/04 Python
python使用thrift教程的方法示例
2019/03/21 Python
Win10环境python3.7安装dlib模块趟过的坑
2019/08/01 Python
Python通过Manager方式实现多个无关联进程共享数据的实现
2019/11/07 Python
python ETL工具 pyetl
2020/06/07 Python
python中二分查找法的实现方法
2020/12/06 Python
在线购买澳大利亚设计师手拿包和奢华晚装手袋:Olga Berg
2019/03/20 全球购物
新教师培训方案
2014/06/08 职场文书
大学军训决心书
2015/02/05 职场文书
出纳试用期工作总结2015
2015/05/28 职场文书
Java面试题冲刺第十八天--Spring框架3
2021/08/07 面试题