迭代器
1.该对象需提供next方法,返回迭代器的下一项
2.如果没有下一项即迭代完成时会抛出一个StopIteration异常。
1 2 3 | list1 = [ 1 , 2 , 3 ] iter1 = iter (list1) iter2 = iter (list1)<br> for i in iter1: print ( "迭代器1:" ,i)<br> print ( "迭代器2" , next (iter2)) for i in iter2: print ( "迭代器2:" ,i) |
总结:
我们for循环列表字典等,并不是真正的for循环列表本身。而是for循环他们返回的一个迭代器对象,这些迭代器对象只能迭代一次
事实上除了for外,sum,min,max函数等内置对象都会使用迭代器协议访问对象。也就是说他们会先调用这些对象中的__iter__
方法,如果没有的话则会去找__getitem__
方法
生成器
1 2 3 4 5 6 | def test_generator(n): for i in range (n): yield i * * 2 generator1 = test_generator( 3 ) generator1 next (generator1) |
1.生成器本身是一种特殊的迭代器,也就是说生成器就是迭代器。
2.生成器会自动实现迭代器协议,也就是说只要我们yield后,自动就生成了next对象包括StopIteration等结构。
3.生成器使用yield语句返回一个值。yield语句挂起该生成器函数的状态,保留足够的信息。对生成器函数的第二次(或第n次)调用,跳转到函数上一次挂起的位置。生成器不仅“记住”了它的数据状态,生成还记住了程序执行的位置。
二者区别
1.迭代器是访问容器的一种方式,也就是说容器已经出现。我们是从已有元素拓印出一份副本,只为我们此次迭代使用。而生成器则是,而生成器则是自己生成元素的。也就是前者是从有到有的复制,而后者则是从无到有的生成。
2.在用法上生成器只需要简单函数写法,配合yield就能实现。而迭代器真正开发中很难使用到。我们可以把生成器看做,python给我们提供的特殊接口实现的迭代器。
如果到这里还是不太清楚,那我们就再研究深入一点
1 2 | list1 = list ( dir (generator1)) # 生成器所有的方法 list2 = list ( dir ( iter ([ 1 , 2 , 3 ]))) # 迭代器所有的方法 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!