生成器

简述

生成器通过函数中的yield表达式来生成,也可以通过生成器解析式来生成

生成器是一个迭代器,但是迭代器不一定是一个生成器

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

 

举个栗子

from random import randint

def fun1(n):
    for i in range(n):
        yield i

gen1 = fun1(5)
print(type(gen1)) #<class 'generator'>

for ele in gen1:
    print(ele)

#0
#1
#2
#3
#4

 

生成器特性

(1)保存执行上下文

def fib():
    a, b = 0, 1
    while True:
        yield b
        a, b = b, a + b

gen = fib()
print(next(gen)) #1
print(next(gen)) #1
print(next(gen)) #2
print(next(gen)) #3
print(next(gen)) #5
print(next(gen)) #8
print(next(gen)) #13
print(next(gen)) #21

 

(2)利用next函数与调用的代码进行交互

 python-生成器 随笔

 

生成器解析

gen = (i for i in range(10))
print(gen) #<generator object <genexpr> at 0x00000000020B01B0>
print(type(gen)) #<class 'generator'>
print(next(gen)) #0
print(next(gen)) #1

 

应用场景

每次你需要返回一个序列的函数或在循环中运行的函数时,都应该考虑到生成器

 

栗子1

 使用生成器的数据流缓冲

使用这些数据的第三方代码可以暂停、恢复、和停止生成器,在开始这一过程之前无需导入所有的数据

 

栗子2

对于基于某些序列的数据转换算法,生成器有助于降低算法的复杂度并提高效率

 

参考资料:《python高级编程》

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄