12、python高级特性--生成器

生成器

要创建一个generator:

  • 第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator;

  • 第二种方法,只需要把print(b)改为yield b就可以

**难点理解:**generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而generator函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行;

generator函数的“调用”实际返回一个generator对象;

可以通过next()函数获得generator的下一个返回值,但是更多是使用for循环,因为generator也是可迭代对象;

#要创建一个generator,第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator
#创建L和g的区别仅在于最外层的[]和(),L是一个list,而g是一个generator。
L = [x * x for x in range(10)]  #列表生成式
g = (x * x for x in range(10))   #generator

#可以通过next()函数获得generator的下一个返回值
#但是更多是使用for循环,因为generator也是可迭代对象
for n in g:
    print(n)

#普通函数计算斐波拉契数列
def fib1(max):
    n, a, b = 0, 0, 1
    while n < max:
        print(b)
        a, b = b, a + b
        n = n + 1
    return 'done'
#调用普通函数
fib1(6)

#创建一个generator,第二种方法,只需要把print(b)改为yield b就可以
#如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator
#generator函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行
#把函数改成generator后,基本上从来不会用next()来获取下一个返回值,而是直接使用for循环来迭代

#创建一个generator,计算斐波拉契数列
def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1
    return 'done'
#调用generator函数计算斐波拉契数列
for n in fib(6):
    print(n)
    

发布了70 篇原创文章 · 获赞 29 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/LOVEYSUXIN/article/details/103147506