python——yield小小小小记

网上都说带有yield的函数在python之中被称为generator(生成器),我:……然后看了廖雪峰的yield浅析,

把我暂时能用到的整理如下……

让我们从斐波那契数列(除第一个第二个数字以外每个数字都等于前两个数字之和)入手:

1.简单地输出斐波那契数列前n个数:

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

但该函数返回None,其他函数无法得到该函数生成的数列,函数可复用性较差。

要提高fab函数的可复用性,最好不要直接打印出数列,而是返回一个list,以下是fab2.0:

2.fab2.0:

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 

这样就一次性返回一个链表。

……但但但但是又有人举手了,该函数在运行中占用的内存会随着参数max的增大而增大,

如果要解除内存占用,最好不要用list解决问题,而是通过iterable对象来迭代……


这里要提一下range()和xrange(),不会的可以参考我的另一篇文章《python——range()和xrange()》链接:https://blog.csdn.net/LOG_IN_ME/article/details/81943929

for i in range(1000): pass 

会导致生成一个1000个元素的list,而:

for i in xrange(1000): pass 

则是在每次迭代中返回下一个数值,内存占用很小,因为xrange()返回一个iterable对象。


同理,为了实现迭代功能同时有保持代码的简洁性,yield就派上用场了……

3.使用yield的fab():

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

获得了iterable的效果:

for n in fab(5):
    print n

简单地讲,yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,调用 fab(5) 不会执行 fab 函数,而是返回一个 iterable 对象!在 for 循环执行时,每次循环都会执行 fab 函数内部的代码,执行到 yield b 时,fab 函数就返回一个迭代值,下次迭代时,代码从 yield b 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。

猜你喜欢

转载自blog.csdn.net/LOG_IN_ME/article/details/81941814