生成器
Topic sources = [1]
while True:
yield s
temp = [0] + s + [0]
s = [temp[i]+temp[i+1] for i in range(0, len(temp)-1)]
更强的想法,每一层在两边都补0,方便写代码
- 1
s = [1]
while True:
yield s
temp = [0] + s + [0]
s = [temp[i]+temp[i+1] for i in range(0, len(temp)-1)]
更强的想法,每一层在两边都补0,方便写代码
七月上行
要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator: generator保存的是算法,每次调用next(g),就计算出g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。 也就是说,上面的函数和generator仅一步之遥。要把fib函数变成generator,只需要把print(b)改为yield b就可以了: 这就是定义generator的另一种方法。如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator: 这里,最难理解的就是generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。 但是用for循环调用generator时,发现拿不到generator的return语句的返回值。如果想要拿到返回值,必须捕获StopIteration错误,返回值包含在StopIteration的value中: