#Python系列#--Python之杨辉三角generator实现

user

雨橙

中国.四川.成都

世界之上、唯有远见、惟爱不变。


杨辉三角generator实现完整代码如下:

#!/usr/bin/python
# _*_coding:utf-8 _*_
# 杨辉三角 generator 实现


#实现方法一
def getNum():
    num = [1]
    while True:
        yield num
        num = [1]+[x+y for x,y in zip(num[:-1], num[1:])]+[1]


#实现方法二
def getNum1():
    num = [1]
    while True:
        yield num
        num = [num[x]+num[x+1] for x in range(len(num)-1)]
        num.insert(0,1)
        num.append(1)


n = 0
for x in getNum1():
    print(x)
    n += 1
    if n > 10:
        break

这里说一下生成器generator,什么是生成器

在 Python 中,使用了 yield 的函数被称为生成器(generator)

跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。

在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回yield的值。并在下一次执行 next()方法时从当前位置继续运行。

下面使用 yield 实现斐波那契数列:
#!/usr/bin/python
# _*_ coding:utf-8 _*_

import sys

#生成器函数 - 斐波那契
def fibonacci(n):
    a, b, counter = 0, 1, 0
    while True:
        if (counter > n):
            return
        yield a
        a, b = b, a + b
        counter += 1

f = fibonacci(10)
# f 是一个迭代器,由生成器返回生成
while True:
    try:
        print(next(f))
    except StopIteration:
        sys.exit()


什么情况下需要使用 yield?

一个函数 f。f 返回一个 list,这个 list 是动态计算出来的(不管是数学上的计算还是逻辑上的读取格式化),并且这个 list 会很大(无论是固定很大还是随着输入参数的增大而增大)。

这个时候,我们希望每次调用这个函数并使用迭代器进行循环的时候一个一个的得到每个 list 元素而不是直接得到一个完整的 list 来节省内存,这个时候 yield 就很有用。
posted at