一. 生成器语法
只要函数内部包含有yield关键字,那么函数名()的到的结果就是生成器,并且不会执行函数内部代码
def func():
print('====>first')
yield 1
print('====>second')
yield 2
print('====>third')
yield 3
print('====>end')
g=func()
print(g) #<generator object func at 0x0000000002184360>
yield:相当于return,可以保存函数运行状态
x = yield另外一个特性:接收send传送过来的值,赋值给上一次停留的yield
生成器就是迭代器:自动实现迭代器(必须提供Next()方法)协议,所以通过next()方法进行取值
优点一:延迟计算,对于大数据量处理友好,节省内存
【return方法占空间大,效率低】
优点二:代码更简洁
【eval()可以把类型转换字典】
生成器只能遍历一次
def test():
for i in range(4):
yield i
t = test()
#按需生产,生成器只能遍历一次
t1 = (i for i in t) #生成器
t2 = (j for j in t1)
print(list(t1))
print(list(t2))
# 输出
[0, 1, 2, 3]
[]
def test():
for i in range(4):
yield i
t = test()
#按需生产,生成器只能遍历一次
t1 = [i for i in t] #列表
t2 = (j for j in t1)
print(list(t1))
print(list(t2))
# 输出
[0, 1, 2, 3]
[0, 1, 2, 3]