Python 三大器之生成器

生成器-generator

问题: 如果一次性将列表中的所有元素都加载到列表中, 占用内存, 影响性能…
解决: 生成器可以边使用边计算下一个元素, 不用将所有的元素都加载进来

注意:
获取生成器里的元素, 通过使用next函数就可以不断的获取下一个元素
如果当前已经是最后一个元素, 继续next程序会出错 , StopIteration
在for循环中遍历生成器的时候,当已经获取到最后一个元素时,会自动跳出,不会报错
return, break, 也会终止

#普通列表生成
numbers=[] 
for i in range(0,101): 
  numbers.append(i) 
print(numbers) 

#列表生成式
numbers=[i for i in range(0,101)] 
print(numbers)

#生成器(generator)
numbers=(i for i in range(0,101))
print(numbers)
print(type(numbers))
print(next(numbers))

生成器执行结果如下:
生成器执行结果

生成器是一种特殊的迭代器,它的返回值不是通过return而是用yield。 生成器一定是迭代器(反之不成立),因此任何生成器也是一种懒加载的模式生成值。用生成器来实现斐波那契数列的例子是:

def fib():
    prev, curr = 0, 1
    while True:
        yield curr
        prev, curr = curr, curr + prev
f = fib()
print(f)
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())

在这里插入图片描述

generator和函数的执行流程不一样:
函数是顺序执行,遇到return语句或者函数执行完毕就返回,再次执行重新调用,
而generator,在每次调用next()的时候执行,遇到yield语句返回,
再次执行时从上次返回的yield语句处继续执行(从哪里跌倒,就从哪里爬起来)。

猜你喜欢

转载自blog.csdn.net/weixin_42367527/article/details/82760364
今日推荐