文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

python3迭代器和生成器

2023-01-31 08:07

关注

迭代对象:在我看来就是可以用for循环依次取值的一个序列就叫可迭代对象

迭代器:就是可以用next()来进行取值的对象

生成器:我的理解就是在迭代器的基础上给了与暂停功能的函数

生成器其实就是一种特殊的迭代器。它使一种更为高级、更为优雅的迭代器。

使用生成器让我们可以以一种更加简洁的语法来定义迭代器。



这三者的关系如下:

可迭代对象包含了迭代器,迭代器又包含了生成器

可迭代对象>>>迭代器>>>生成器

网上找了张图很明显

迭代器.png

下面进行举例:

In [78]: isinstance((),Iterable)#说明了元组是可迭代对象
Out[78]: True

In [79]: isinstance([],Iterable)#说明了列表是可迭代对象
Out[79]: True

In [80]: isinstance({},Iterable)#说明了字典是可迭代对象
Out[80]: True

In [81]: isinstance("abc",Iterable)#说明了字符串是可迭代对象
Out[81]: True

In [82]: aa = (x for x in range(5))#定义一个生成器

In [83]: type(aa)
Out[83]: generator

In [84]: isinstance(aa,Iterable)#说明了生成器是可迭代对象
Out[84]: True


而下面的例子则是证明了字典/元组/列表/字符串不是迭代器:

In [86]: isinstance((1,23,4),Iterator)
Out[86]: False

In [87]: isinstance([],Iterator)
Out[87]: False

In [88]: isinstance({},Iterator)
Out[88]: False

In [89]: isinstance("abc",Iterator)
Out[89]: False


下面的例子则说明生成器不都是迭代器:

In [90]: bb = [x for x in range(5)]

In [91]: type(bb)
Out[91]: list

In [92]: bb
Out[92]: [0, 1, 2, 3, 4]

In [93]: cc = inter(bb)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-93-fd07bb1f753d> in <module>()
----> 1 cc = inter(bb)

NameError: name 'inter' is not defined

In [94]: cc = iter(bb)

In [95]: type(cc)
Out[95]: list_iterator

In [96]: cc
Out[96]: <list_iterator at 0x7fa4d6e53390>

In [97]: isinstance(bb,Iterator)
Out[97]: False

In [98]: isinstance(bb,Iterable)
Out[98]: True

In [99]: isinstance(cc,Iterator)
Out[99]: True

In [100]: isinstance(cc,Generator)
Out[100]: False


生成器和迭代器的区别:

 生成器是next的,next的操作,按照序列顺序一次只能返回一个元素
 迭代器是一次性读取了可迭代对象的所有元素到内存。 


生成器函数的一个例子:


比如你欠了银行180W块钱,

但是你没有能力一次性的还完,

或者说你不想和亲戚朋友借钱来还,

所以你在银行办了18个月分期还款来缓解自己的压力(生成器),

就这样银行每次给你发这个月的账单你就还一次10W,

直到18个月后你就把钱还完了

这就是生成器,每个月来了账单就还一次,知道把钱还完

这样就不会在一次性还钱的时候把自己给急疯了,银行也能够收到它的钱的!

这就是生成器的作用,如果我们产生的数据很多,

数据量很大的话,很容易把进程跑死或者把服务器跑崩溃,

这个生成器就很好的解决了这个问题


如果有错误的地方欢迎各位大佬帮忙指正,谢谢!

这篇文章个人感觉还挺好:

https://www.cnblogs.com/vuedev/p/7349476.html


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯