生成器与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
[]
()