Discuss / Python / 生成器

生成器

Topic source

七月上行

#1 Created at ... [Delete] [Delete and Lock User]
n = 1
s = [1]
while True:
    yield s
    temp = []
    for i in range(n-1):
        temp.append(s[i]+s[i+1])
    s = [1] + temp + [1]
    n += 1

要创建一个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中:

七月上行

#2 Created at ... [Delete] [Delete and Lock User]
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,方便写代码

  • 1

Reply