什么是生成器generator?
PYTHON中生成器可以简单的理解为就是迭代器,跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。
生成器构建
1. 通过生成器函数
2. 通过生成器推导式
3. python内置函数或者模块提供
生成器函数:
def test(*args): for i in args: yield i #只要函数里面有yield 那这个就是生成器函数 。这里用while循环效果也是一样 num = 1000 a = test(*range(num)) print(next(a))
yield from使用
def test(*args): li = [0,1,2] #yield li 返回整个list yield from li #这里返回类似迭代器,返回列表中的第一个元素.yield from 也可以多个 num = 10000000 a = test(*range(num)) print(next(a))
yield send
def gen(name): print(f'您好! {name} ') while 1: food = yield 11 print(f'{name} 今天想吃 {food} 么?') dog = gen('kkk') next(dog) # 还可以给上一个yield发送值 dog.send('酸菜') ret = dog.send('香肠') print(ret) ret = dog.send('烤串') print(ret) 输出:::::::::::::::: 您好! kkk kkk 今天想吃 酸菜 么? kkk 今天想吃 香肠 么? 11 kkk 今天想吃 烤串 么? 11
send和next()区别:
相同点:
send 和 next()都可以让生成器对应的yield向下执行一次。
都可以获取到yield生成的值。
不同点:
第一次获取yield值只能用next不能用send(可以用send(None))。
send可以给上一个yield置传递值。
yield与return的区别:
return一般在函数中只设置一个,他的作用是终止函数,并且给函数的执行者返回值。
yield在生成器函数中可设置多个,他并不会终止函数,next会获取对应yield生成的元素。