十一、生成器和迭代器 4.生成器与yield关键字

生成器与yield关键字

生成器
    利用迭代器可以在每次取值时按照特定的规律生成数据,但当前迭代的状态需要我们自己记录,然后才能根据状态生成下一个数据
    为了更简便的记录当前的状态,并配合next()迭代,可以使用生成器(generator)
    生成器是一种特殊的iterator,生成器可以自定义,也可以使用tuple推导式来定义
    生成器按照指定算法来推算下一个数据,只需要往内存中存储一个生成器,节约内存,提升性能

生成器创建方式:
    1.( 推导式 ) 结果就是生成器
    2.自定义生成器,含有yield关键字的函数就是生成器
        含有yield关键字的函数返回结果是iterator,生成器函数就是一个返回iterator的函数

yield关键字使用在生成器函数中
    作用:
        1.充当return
        2.保存程序的运行状态,并暂停程序执行
    程序执行到yield时,会暂停并记录当前位置,当下一次next()调用生成器,唤醒yield继续向下执行

yield与return
    相同点:
        函数执行到yield和return时,都将返回结果
    不同点:
        函数执行到return时,函数会结束调用
        函数执行到yield时,函数会暂停,并记录当前的位置,下一次调用时从此位置继续执行

return
    生成器中执行到return会停止迭代并抛出异常,可以用来结束生成去运行

generator.send(value)
    功能:唤醒并传递参数value给yield

生成器函数被调用时的执行过程
    生成器函数被调用后,返回了一个iterator
    1.第一次调用iterator:
        执行到第一个yield时,返回yield 1,暂停执行,记录此位置,等待下一次被调用
    2.第二次调用iterator:
        执行到第二个yield时,返回yield 2,暂停执行,记录此位置,等待下一次被调用
    3.第三次调用iterator:
        执行到第三个yield时,返回yield 3,暂停执行,记录此位置,等待下一次被调用

# 定义普通函数,return后面的代码不再执行
def Func() :
    print('A 1')
    return 1
    print('B 2')
    return 2
Func()
print(Func())

# 定义生成器函数,使用yield关键字
def func() :
    print('A 1')
    yield 1
    print('B 2')
    yield 2
    print('C 3')
    yield 3

# 调用生成器函数,返回iterator
res = func()
print(res)

# 调用生成器函数返回的iterator

# next()
next(res)
print(next(res))
print(next(res))

# list()、tuple()等容器类型函数调用生成器返回的iterator时,会把返回结果作为容器的元素
print(list(res))
print(tuple(res))

# for循环
for i in res :
    print('---')
    print(i)



A 1
A 1
1
<generator object func at 0x0000006C17DA10C8>
A 1
B 2
2
C 3
3
[]
()
上一篇:Iterator


下一篇:STL迭代器适配器