生成器★★★★
生成器generator
● 生成器指的是生成器对象,可以由生成器表达式得到,也可以使用yield关键字得到一个生成器函数,调用这个函数得到一个生成器对象
● 生成器对象,是一个可迭代对象,是一个迭代器
● 生成器对象,是延迟计算、惰性求值的
生成器函数
●函数体中包含yield语句的函数,就是生成器函数,调用后返回生成器对象.
生成器函数
def inc():
for i in range(5):
yield i #暂停函数执行 ,返回yield 的值
type(inc)
>>> function
type(inc())
>>>generator #生成器对象
g= inc()
next(g)# 求解下一个数,
普通函数调用,函数会立即执行直到执行完毕.
生成器函数调用,并不会立即执行函数体,而是需要使用next函数驱动生成器执行
def gen():
print(11111)
yield 1
print(22222)
yield 2
print(33333)
return 3 #一般不写return 这里只做测试
yield
g=gen()
next()
当打印完3333后,碰到return 3 ,后面的语句不在执行,所以会抛StopIteration ,生成器停止,便不能在继续执行.把yield 表达式的值返回
再次执行会执行到下一个yield语句又会停止执行
return 语句 后面的语句不在执行
生成器的执行
● 在生成器函数中,可以多次yield,每执行一次yield后会暂停执行,把yield表达式的值返回
● 再次执行会执行到下一个yield语句又会暂停执行
● return语句依然可以终止函数运行,但return语句的返回值不能被获取到
● return会导致当前函数返回,无法继续执行,也无法继续获取下一个值,抛出StopIteration异常
● 如果函数没有显式的return语句,如果生成器函数执行到结尾(相当于执行了return None),一样会抛出StopIteration异常
生成器函数
● 包含yield语句的生成器函数调用后,生成 生成器对象 的时候,生成器函数的函数体不会立即执行
● next(generator) 会从函数的当前位置向后执行到之后碰到的第一个yield语句