Python yield 详解(嚼碎了喂你,一篇精通,无需再看其他文章)

Python yield详解

由“斐波那契”深入理解yield案例

​ 斐波那契(Fibonacci)數列是一个非常简单的递归数列,除第一个和第二个数外,任意一个数都可由前两个数相加得到

第一个版本

def fab(max):
    n, a, b = 0, 0, 1
    while n < max:
        print b
        a, b = b, a + b
        n = n + 1

执行 fab(5),我们可以得到如下输出:

>>> fab(5)
1
1
2
3
5

第二个版本

提高 fab 函数的可复用性,最好不要直接打印出数列,而是返回一个 List。

def fab(max): 
    n, a, b = 0, 0, 1 
    L = [] 
    while n < max: 
        L.append(b) 
        a, b = b, a + b 
        n = n + 1 
    return L 

可以使用如下方式打印出 fab 函数返回的 List:

>>> for n in fab(5):
...     print(n)
...
1
1
2
3
5

问题的引出

稍微高级的代码的 fab 函数通过返回 List 能满足复用性的要求,但是更有经验的开发者会指出,该函数在运行中占用的内存会随着参数 max 的增大而增大,如果要控制内存占用,最好不要用 List 来保存中间结果,而是通过 iterable 对象来迭代

第三个版本

利用 iterable 我们可以把 fab 函数改写为一个支持 iterable 的 class

class Fab():
    """
    Python3:自定义迭代器的类需要同时实现__iter__和__next__方法。
    Python2:自定义迭代器的类需要同时实现__iter__和next方法。
    """

    def __init__(self, max):
        self.max = max
        self.n, self.a, self.b = 0, 0, 1

    def __iter__(self):
        return self

    def __next__(self):
        
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值