一.概念
特殊的迭代器
优点:1.惰性计算数据,节省内存;2.能够记录状态,并通过next()函数,访问下一个状态;3.具备可迭代特性
二.创建方式
1.生成器表达式:把列表推导的[]修改成()
# 列表
l = [i for i in range(1, 100) if i % 2 == 0]
print(l)
#生成器表达式
l = (i for i in range(1, 100) if i % 2 == 0)
print(l)
输出结果分别为:
2.生成器函数:函数中包含yield语句,该函数的执行结果就是“生成器”;
产生数据的方式:生成器具备可迭代特性;next()等同于生成器.__next__();for in
def test1():
print("xxx")
yield 1
print("a")
yield 2
print("b")
yield 3
print("c")
yield 4
print("d")
yield 5
print("e")
g = test1()
print(g)
print(next(g))
print(next(g))
输出结果:
法二:用for in语句
def test():
for i in range(1, 9):
yield i
g = test()
print(g)
print(next(g))
print(next(g))
三.send()方法
该方法有一个参数,指定的是上一次被挂起的yield语句的返回值
可以额外的给yield传值
第一次调用t.send(None)
def test():
print("xxx")
rest1 = yield 1
# 执行下面语句后,这里其实相当于res1 = "ooo"
print(rest1)
rest2 = yield 2
print(rest2)
g = test()
print(g.__next__())
print(g.send("ooo"))
'''
第一次传值,需用None,不然就用.__next__()
print(g.send(None))
print(g.send("ooo"))
'''
输出结果:
四.关闭生成器
g.close
五.注意
1.生成器碰到return则终止,抛出StopIteration异常提示
2.只遍历一次。