Python 大牛解释下列表推导的疑惑,python大牛,关于Python lis
Python 大牛解释下列表推导的疑惑,python大牛,关于Python lis
关于
Python list comprehension 其实就是 generator.
该怎么理解?
另外 map filter、generator 也让人挺不解的,求python 大牛都给解释下。这么设计的缘由是什么?
不知道题主这句话是从何得来的,我测试的Python2.7就是转化成for函数而已如下.
不知道Py3.*中是否也是如此(可能变了吧)
首先关于问题里面引用的那句话:不要这样理解,会把自己绕进去,而且也不准确。
这个问题要往简单来看。对于一个简单的 list comprehension [x**2 for x in range(10)],它等价于:
l = []for x in range(10): l.append(x**2)
所以,list comprehension 只是一个语法糖,能让容器的初始化变得更加简洁,但它本质上还是在往容器里不断塞东西。(当然,由于这个语法存在,python 也可以针对性的优化性能,性能会比自己 append 好一些)
它跟 generator 概念不一样,如果要说的话,迭代器(iterator)可能才是描述 x**2 for x in range(10) 这种语法的正确方法,虽然它的名字确实叫做 generator expression。
其次,什么是 generator。
这个概念本身是很晦涩,如果初学不要强行理解。
简单说它就是一个数据生成器,或者精确点说,它是个调用者可控的迭代器(iterator),仅此而已。
Generator 函数就像一个扭蛋机,使用者每次投入一枚硬币它就吐出一颗扭蛋。
这样设计的好处是,耦合低和可控。
至于 generator 的高级用法,比如模拟 coroutine 什么的,可以暂时无视。
最后,关于 map、filter 等函数的设计思路。
从 generator 的特性可以看出,它所能表达的只能是一种顺序输出的情况,无法后悔,除非从头开始。
这就像一条工厂的流水线,只能向前不能后退。
如果我们有这样一条流水线,我们能做什么呢?
流水线生产是工业时代智慧体现,能够将执行效率做到最高,并且流水线上各个环节都没有耦合性,它的合理性相当明显。
这样处理主要是 Lazy 求值的做法
设想一些应用场景,你需要对1000万个斐波那切数相加求和。
第二种方法,就是一种 lazy 的方式,也就是 python 惯用的 generator
编橙之家文章,
相关内容
- 通过brew安装了python2.X和python3.X,python3没有自带pip,p
- pycharm编辑器‘�û�δ��这种乱码,需要转码还是怎么
- 求好的gevent开源项目来练习,gevent开源项目练习,有没有
- 完成python字典取值操作原理及效率程度是什么,python字
- 求教在客户端中插入chrome浏览器的方法,chrome浏览器
- Python Pycharm代码自动补全功能怎么调试,pythonpycharm,Py
- 看到一些python网站消息实时的通知怎么实出?,python实
- numpy读取csv文件报“Python UnicodeEncodeError”,,numpy读取
- python可以将临时文件保存到内存中吗?,python内存,比如
- 提取html页面中数据表格内的数据内容怎么操作?,html表
评论关闭