生成器:是一个特殊的迭代器(迭代器的抽象层级更高)所以, 拥有迭代器的特性
1)惰性计算数据, 节省内存
2)能够记录状态, 并通过next()函数, 访问下一个状态
3)具备可迭代特性
创建方式
1)生成器表达式,把列表推导式的[] 修改成 ()
l = (i for i in range(1, 100) if i % 2 == 0)
print(l)
print(next(l))
print(next(l))
print(l.__next__())
#
for i in l:
print(i)
#运行结果
<generator object <genexpr> at 0x000002467E1F48C8>
2
4
6
8
2)生成器函数,函数中包含 yield语句,这个函数的执行结果就是 "生成器"
# 生成器的创建方式2
# yied, 可以去阻断当前的函数执行, 然后, 当使用next()函数, 或者, __next__(), 都会让函数继续执行,
# 然后, 当执行到下一个 yield语句的时候, 又会被暂停
def test():
print("xxx")
yield 1
print("a")
yield 2
print("b")
yield 3
print("c")
g = test()
print(g)
print(next(g))
print(g.__next__())
#运行结果
<generator object test at 0x000001EB753548C8>
xxx
1
a
2
def test():
print("xxx")
yield 1
print("a")
yield 2
print("b")
yield 3
print("c")
g = test()
for i in g:
print(i)
#运行结果
xxx
1
a
2
b
3
c
send() 方法,send方法有一个参数,指定的是上一次被挂起的yield语句的返回值,相比于.next()可以额外的给yield 语句传值,注意第一次调用,t.send(None)
关闭生成器,g.close(),后续如果继续调用, 会抛出StopIteration异常
注意,如果碰到return,会直接终止, 抛出StopIteration异常提示,生成器只会遍历一次