84669 personnes étudient
152542 personnes étudient
20005 personnes étudient
5487 personnes étudient
7821 personnes étudient
359900 personnes étudient
3350 personnes étudient
180660 personnes étudient
48569 personnes étudient
18603 personnes étudient
40936 personnes étudient
1549 personnes étudient
1183 personnes étudient
32909 personnes étudient
关于
Python list comprehension 其实就是 generator.
该怎么理解?
另外 map filter、generator 也让人挺不解的,求python 大牛都给解释下。这么设计的缘由是什么?
小伙看你根骨奇佳,潜力无限,来学PHP伐。
首先关于问题里面引用的那句话:不要这样理解,会把自己绕进去,而且也不准确。
这个问题要往简单来看。对于一个简单的 list comprehension [x**2 for x in range(10)],它等价于:
[x**2 for x in range(10)]
l = [] for x in range(10): l.append(x**2)
所以,list comprehension 只是一个语法糖,能让容器的初始化变得更加简洁,但它本质上还是在往容器里不断塞东西。(当然,由于这个语法存在,python 也可以针对性的优化性能,性能会比自己 append 好一些)
append
List comprehensions provide a concise way to create lists. List comprehensions 提供了一种简洁明了的方式来创建 list。 来自 python 官方文档
list
它跟 generator 概念不一样,如果要说的话,迭代器(iterator)可能才是描述 x**2 for x in range(10) 这种语法的正确方法,虽然它的名字确实叫做 generator expression。
x**2 for x in range(10)
其次,什么是 generator。
这个概念本身是很晦涩,如果初学不要强行理解。
简单说它就是一个数据生成器,或者精确点说,它是个调用者可控的迭代器(iterator),仅此而已。
Generator 函数就像一个扭蛋机,使用者每次投入一枚硬币它就吐出一颗扭蛋。
这样设计的好处是,耦合低和可控。
至于 generator 的高级用法,比如模拟 coroutine 什么的,可以暂时无视。
最后,关于 map、filter 等函数的设计思路。
map
filter
从 generator 的特性可以看出,它所能表达的只能是一种顺序输出的情况,无法后悔,除非从头开始。
这就像一条工厂的流水线,只能向前不能后退。
如果我们有这样一条流水线,我们能做什么呢?
流水线生产是工业时代智慧体现,能够将执行效率做到最高,并且流水线上各个环节都没有耦合性,它的合理性相当明显。
这样处理主要是 Lazy 求值的做法
Lazy
设想一些应用场景,你需要对1000万个斐波那切数相加求和。
第二种方法,就是一种 lazy 的方式,也就是 python 惯用的 generator
lazy
python
generator
不知道题主这句话是从何得来的,我测试的Python2.7就是转化成for函数而已如下. 不知道Py3.*中是否也是如此(可能变了吧)
首先关于问题里面引用的那句话:不要这样理解,会把自己绕进去,而且也不准确。
这个问题要往简单来看。对于一个简单的 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
流水线生产是工业时代智慧体现,能够将执行效率做到最高,并且流水线上各个环节都没有耦合性,它的合理性相当明显。
这样处理主要是
Lazy
求值的做法设想一些应用场景,你需要对1000万个斐波那切数相加求和。
第二种方法,就是一种
lazy
的方式,也就是python
惯用的generator
不知道题主这句话是从何得来的,我测试的Python2.7就是转化成for函数而已如下.
不知道Py3.*中是否也是如此(可能变了吧)