生成器
生成器,用术语来说是生成器(generator)和带yield的generator function.
但在介绍生成器之前,先来认识一下迭代器(iterator),迭代器表示的是一个数据流,通过被 next(iterator) 调用获取下一个数据,因为我们并不知道这个数据流的长度,于是只有通过不断地调用 next() 函数获取数据,直到抛出 StopIteration 异常。
迭代器的应用常见于循环的控制条件语句中,例如:
for element in list:
pass
上面的代码中的 list 会从一个列表数据结构(列表是可迭代的,但和迭代器的区别是,没有 next() 方法(iterable 和 iterator 的区别))转变为迭代器(iterator),也就是说在执行for element in list: 的代码时,实际上执行了 it = iter(list):代码,用一个迭代器 it 代表了原列表中数据的流。(并且,在for 中使用迭代器不会抛出异常,原因是 for 隐藏了try…except 的细节)具体的转换类似于这样:
it = iter(list)
while True:
try:
it.next()
except StopIteration:
break
于是以上就是对迭代器的简单介绍。
生成器:
- 函数加yield,可以参考廖教程的实现杨辉三角函数。代码如下
# 每次执行到yield时暂停,然后再次调用时继续。
def myfunc():
list = [1]
while True:
yield(list)
length = len(list)
if length == 1:
list = [1, 1]
ls = [1]
j = 0
while j <= length-2:
ls.append(list[j]+list[j+1])
j += 1
ls.append(1)
list = ls
- generator
# 用小括号则是生成器表达式
g = (i for i in range(10))
# 用中括号则是列表表达式
l = [i for i in range(10)]
Ps. 生成器与迭代器的区别:生成器保存的是生成下一个数据的方法,迭代器是每次取一个数据。
map函数
map函数返回的也是 generator, map函数把一个函数映射在列表里的每个值上。他的参数里有函数,所以也就是高阶函数。
并且因为返回的是一个generator,所以常用list() 包裹上使得返回列表。
to be continued…