Python生成器和迭代器的构造方法和传值理解
2023-04-18 12:34:16 时间
把列表推导式中的中括号改写成小括号就实现生成器效果了,生成器也是特殊的迭代器,生成器和迭代器都只能使用一次。
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的返回值
相关文章
- 学会这五种编程语言,再来研究DevOps也不迟
- 谷歌向开发者推送的安卓8.1来了!10大新功能!
- Android 8.1开发者预览版发布 启用全新安全协议“DNS over TLS
- 挨踢部落故事汇(30):我与Python的相爱相杀
- 挨踢部落坐诊第九期: Java、Python、PHP他们都说很简单
- 神经网络中 BP 算法的原理与 Python 实现源码解析
- 挨踢部落故事汇(15):不断拓新成为科技大潮中的弄潮儿
- 面向Python语言的三大顶级机器学习库
- TensorFlow 1.0:在智能手机端解锁机器学习
- 学习Python:做数据科学还是网站开发?
- flowable异步任务加锁流程
- Teradata天睿公司在业内率先将DevOps扩展至数据仓库
- 时延检测利器-uftrace
- 八个 Python 数据生态圈的前沿项目
- 数据科学家必知的7款Python工具
- 十种程序语言帮你读懂大数据的“秘密”
- Spark多语言编程实践
- 别老扯什么Hadoop了,你的数据根本不够大
- 红帽LINUX 5下安装Hadoop 2.0.0-alpha
- Hadoop0.20更新笔记