把列表推导式中的中括号改写成小括号就实现生成器效果了,生成器也是特殊的迭代器,生成器和迭代器都只能使用一次。
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的返回值
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/73423.html