把列表推导式中的中括号改写成小括号就实现生成器效果了,生成器也是特殊的迭代器,生成器和迭代器都只能使用一次。
1.生成器构造方法
list1 = [i for i in range(1, 10000) if i % 3 != 0]
print(list1)
its = (i for i in range(1, 10000) if i % 3 != 0)
print(its)
2.生成器的三种访问方式
print(next(its))
print(next(its))
print(its.__next__())
for i in its:
if i < 100:
print(i)
3.使用含有yield语句的函数来构造生成器
def test():
print('+++++++++')
yield '状态1'
print('+++++++++')
yield '状态2'
print('+++++++++')
yield '状态3'
print('+++++++++')
yield '状态4'
print('+++++++++')
# test() # 直接调用函数不会执行任何代码
res = test()
print(next(res)) # 返回第一个yield语句的状态值,到此被阻断,后面的print没有执行
print(next(res)) # 每次遇到yield都会被阻断
4.迭代器执行到最后,如果再次执行next会返回错误,因为迭代器是会记录状态的,状态执行完毕就会返回错误
def test():
for i in range(1, 9):
print('++++++++++++')
yield ('状态%d' % i)
print('++++++++++++')
res = test()
print(next(res))
5.send()方法给yield传值
def test():
res1 = yield '状态1'
print(res1)
res2 = yield '状态2'
print(res2)
res = test()
# print(next(res))
# print(res.send('aaa')) # 给yield传值,但是不能直接从第一步就使用send方法
print(res.send(None)) # 如果第一次调用只能传None,因为send是记录上一次的挂起状态,第一步没有上一次
res.close() # 关闭生成器
print(res.__next__()) # 后面不能访问,返回:StopIteration
# 如果生成器中有return语句,一旦next遇到return就会停止并返回return的返回值