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