迭代器与生成器是Python比较难的知识点, 在学Python之前, 我已经有了多年的C语言与MATLAB的使用经验了, 但是学这些知识点, 还是有一定的困难, 总觉得是一知半解的.
现在, 经过一段时间的学习和梳理, 感觉是搞懂了, 写下这篇文章与大家分享.
学习具体概念技术之前, 得知道这些知识点有什么用, 没有用的知识点不值得花费大力气去学习.
优点:
1 节省内存, 每次生成一个元素, 而不是先计算出所有的元素, 保存下来.
如果需要保存下来, 可以用个list(XXX)来实现
2 提速.
因为内存更小
3 各种花式循环, 节省代码长度.
首先, 要搞明白"Iterable"(可迭代的)这个概念.
"可迭代的"简单的来说, 是可以按顺序, 依次返回变量中的元素.
很显然, Python的各种容易是可迭代的, 字符串也是可迭代的, 因为可以依次去其中的字符.
做法为反例, 标量, 比如数字"1024", 不是可迭代的, 因为它只有一个元素.
可以通过下图的方法来检验变量是否是可迭代的:
上图中, 分别检验了各种容器, 字符串和标量数字是否是可迭代的, 结果符合预期.
iter: 生成迭代器(对象)
next: 作用于迭代器, 依次返回下一个元素
如果是自定义class, 可以通过函数__iter__, next, 定义这两种函数的行为.
iter只能用于可迭代的对象, 如下图, 标量数字"1024"就不能用来生成数字.
上图中, 试图将数字标量"1024"变成迭代器, 就会发生报错, 显示是"不可迭代的"
iter将可迭代的对象变成迭代器, 然后可以用next依次返回元素, 越界时, 会报错StopIteration, 类似于单向链表, 只能得到下一个元素, 不能返回上一个元素.
如上图所示, 通过iter, 将字符串"lihaitao"变成了一个迭代器, 然后通过next函数, 从左到右, 依次返回了单个字符, 最后会发现, 如果元素取完, 还要使用next函数的话, 就会报错.
为什么要这么做? 依次取出元素有什么好处?
1 节省内存, 每次生成一个元素, 而不是先计算出所有的元素, 保存下来.
2 提速. 因为内存更小
吐槽一下: 当然了, 因为这个例子特别简单, 好像无法体现出这些好处. 先记住, 以后接触到更复杂的例子, 就能体会到了.
生成器: 返回的对象是迭代器
生成器本质上定义了迭代器中元素的生成机制.
生成器分成了两种:
a 生成表达式
比如, (i * 2 for i in range(10))
上图的例子中, 通过for循环, 依次取得里面的元素.
好像没有什么特别的, 与列表生成器[i * 2 for i in range(10)] (注意一个是圆括号, 另一个是方括号)的结果好像是一样的.
结果是一样, 但是内部的原理差别很大.
(i * 2 for i in range(10))里面的原理是:
1 i 取值为0, 然后乘以2, 然后被for循环取出来, 打印.
2 i 取值为1, 然后乘以2, 然后被for循环取出来, 打印.
3 以此类推, 知道i取值为最后一个元素, 然后乘以2, 然后被for循环取出来, 打印.
[i * 2 for i in range(10)]里面的原理是:
先计算出所有的值: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
然后使用for循环, 依次取出这些值, 依次打印.
一句话概括的话, (i * 2 for i in range(10))是一边计算, 一边被取出, 而[i * 2 for i in range(10)]是先全部被计算出来, 然后被取出.
生成器的另一种形式:
b 生成函数
通过yield来返回下一个元素.
比如生成著名的斐波那契数列:
封面图片就是斐波那契数列的一个应用.
基于"生成函数", 生成斐波那契数列的代码:
运行结果:
看起来和普通函数差不多, 没有了return, 多了个关键词yield.
yield与return不同, 碰到了return, 函数直接结束了, 只能返回"0".
而yield是决定了每次next后返回什么元素.
调用第一次next的时候, 程序运行, 直到第一次碰到yield, 此时a = 0, next的返回元素就是0, 然后会保存程序所有的当前状态,
下一次调用next的时候, 在上次保存的状态下继续运行, 直到又碰到了yield, 此时a = 1, 因此, 第二次next返回的元素是1
以此类推.
如果打个类比的话, yield的那一行可以作为断点, 碰到了断点, 程序就中断了, 直到下一个next, 就继续执行代码.直到碰到下一个断点(yield)
最后,作为一个IT的过来人,我自己整理了一些学习资料,希望对你们有帮助。
在学习python中有任何困难不懂的可以微信扫描下方CSDN官方认证二维码加入python交流学习
多多交流问题,互帮互助,这里有不错的学习教程和开发工具。
(python兼职资源+python全套学习资料)
一、Python所有方向的学习路线
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、Python必备开发工具
三、精品Python学习书籍
当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
四、Python视频合集
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
五、实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
六、Python练习题
检查学习结果。
七、面试资料
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
最后,千万别辜负自己当时开始的一腔热血,一起变强大变优秀。