关于
Python list comprehension 其实就是 generator.
该怎么理解?
另外 map filter、generator 也让人挺不解的,求python 大牛都给解释下。这么设计的缘由是什么?
关于
Python list comprehension 其实就是 generator.
该怎么理解?
另外 map filter、generator 也让人挺不解的,求python 大牛都给解释下。这么设计的缘由是什么?
这样处理主要是 Lazy
求值的做法
设想一些应用场景,你需要对1000万个斐波那切数相加求和。
第二种方法,就是一种 lazy
的方式,也就是 python
惯用的 generator
4 回答4.4k 阅读✓ 已解决
4 回答3.8k 阅读✓ 已解决
1 回答2.9k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
1 回答4.5k 阅读✓ 已解决
1 回答3.8k 阅读✓ 已解决
1 回答2.8k 阅读✓ 已解决
首先关于问题里面引用的那句话:不要这样理解,会把自己绕进去,而且也不准确。
这个问题要往简单来看。对于一个简单的 list comprehension
[x**2 for x in range(10)]
,它等价于:所以,list comprehension 只是一个语法糖,能让容器的初始化变得更加简洁,但它本质上还是在往容器里不断塞东西。(当然,由于这个语法存在,python 也可以针对性的优化性能,性能会比自己
append
好一些)它跟 generator 概念不一样,如果要说的话,迭代器(iterator)可能才是描述
x**2 for x in range(10)
这种语法的正确方法,虽然它的名字确实叫做 generator expression。其次,什么是 generator。
这个概念本身是很晦涩,如果初学不要强行理解。
简单说它就是一个数据生成器,或者精确点说,它是个调用者可控的迭代器(iterator),仅此而已。
Generator 函数就像一个扭蛋机,使用者每次投入一枚硬币它就吐出一颗扭蛋。
这样设计的好处是,耦合低和可控。
至于 generator 的高级用法,比如模拟 coroutine 什么的,可以暂时无视。
最后,关于
map
、filter
等函数的设计思路。从 generator 的特性可以看出,它所能表达的只能是一种顺序输出的情况,无法后悔,除非从头开始。
这就像一条工厂的流水线,只能向前不能后退。
如果我们有这样一条流水线,我们能做什么呢?
map
filter
流水线生产是工业时代智慧体现,能够将执行效率做到最高,并且流水线上各个环节都没有耦合性,它的合理性相当明显。