python的生成器的应用yield--杨辉三角。

本文详细解释了Python中生成器的概念及yield关键字的作用,并通过具体示例对比了yield与return的区别,展示了如何利用生成器简化复杂数据结构的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先很多人一定不明白生成器yield是什么意思。其实和它最像的就是return。举个简单的例子吧。


return:的用法

def fib(n):
    a=1
    b=1
    for i in range(0,n+1):
        a,b=b,a+b
        return a

print fib(10)

打印结果:

1

Process finished with exit code 0

看见了吗,只打印的第一个就直接返回了。也就是说循环才刚开始就直接退出该函数了。


yield:的用法

def fib(n):
    a=1
    b=1
    for i in range(0,n+1):
        a,b=b,a+b
        yield a

for i in fib(10):
    print i

打印结果:

1
2
3
5
8
13
21
34
55
89
144

Process finished with exit code 0

通过一个循环将fib的值返回值,反复打印。该函数每次产生一个值,函数就会被冻结,函数停在原地等待被重新被唤醒。函数被唤醒后就从定制的那点开始执行。(通过迭代来使用所有的值)


递归生成器。

def flatten(list):
    try:
        for i in list:
            for j in flatten(i):
                yield j
    except TypeError:
        yield list

print list(flatten([[1,[2,3],[[4,5],6]],7,8,[9,10]]))

打印结果:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Process finished with exit code 0

分析一下:

[1,[2,3],[[4,5],6]] 被变量 i 读取,而第二重循环导致 j 读取 刚那个列表里的第一个元素 1。1不是列表,引发类型错误。因为一个数字是不能被for 循环的。所以引发TypeError异常。此时的list是 那个 1.  则第一个元素 1 被迭代出来。


yield还是很好用的。比如输出一个杨辉三角。

杨辉三角长什么样子呢?



他有一个规律,每一行的 0+该行 加 该行+0 等于下一行的半边。

举个例子。第四行 1331 。01331 + 13310 = 14641 也就是下一行。


last 是上个列表的最后一行。

[sum(_) for _ in zip([0]+last,last+[0])]     # 这就是上面的实现。

最后的生成结果。

[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
[1, 6, 15, 20, 15, 6, 1]
[1, 7, 21, 35, 35, 21, 7, 1]
[1, 8, 28, 56, 70, 56, 28, 8, 1]
[1, 9, 36, 84, 126, 126, 84, 36, 9, 1]




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值