一、生成器定义
是一个特殊的迭代器(迭代器的抽象层层级更高),所以拥有迭代器的特性:
1、惰性计算数据,节省内存。解释:使用某个变量或者数组的拿取其中某个值,而不是全部拿取。
2、能够记录状态,并通过next()函数访问下一个状态
3、具备可迭代特性
但是,若果打造一个自己的迭代器,比较复杂,需要实现很多方法,所以,就有一个更加优雅的方法
二、创建方式
生成器表达式:把列表推导式中的[], 修改成()
列表推导式:x = [i for i in range(1,100) if i %2 == 0]
x = (i for i in range(1,100) if i %2 == 0)
生成器函数:
函数中包含 yield语句,这个函数的执行结果就是成撑起
第一次:
运行函数未被执行,并未输出任何。仅仅只是产生生成器。
第二次:
xxxx是295hang 的输出
1是296行 yield的返回出来的状态值,并未往下执行
当访问的状态值超过生成器的范围,会报错。
总结:yield可以阻断当前的函数执行,然后,当使用next函数或者__next__,都会让函数继续执行,然后,当执行到下一个,yield语句的时候,又会被暂停。
三、产生数据的方式
生成器具备可迭代特性。
next()函数,等价于 生成器__next__()
for in 生产数据
四、send 函数
send方法有一个参数,指定的是上一次被挂起的yield 语句的返回值。
相比于__next()__, 可以额外的给yield语句传值。

报错不能发的一个非空的值
注意第一次调用 send(None)
五、关闭生成器
close()
后续如果继续调用,会抛出StopIteration异常提示
注意:
若碰到return,会直接终止,抛出抛出StopIteration异常提示。并会显示return的值
生成器只会遍历一次