迭代是数据处理的基石 扫描内存中放不下数据集时候, 我们要找到一种惰性获取数据项方式, 即按需一次获取一个数据项.
这就是迭代器
Python2.2在2001年加入了yield关键字 这个关键字用于构建生成器, 其作用与迭代器一样
值得一提的是在Python3中 range()返回的是一个类似生成器的对象 而Python2则是list(这点在我之前那篇浅谈面试阿里外包的面试文章中有提到)
所有Python程序员都知道序列可以迭代.!
原因是iter函数 解释器需求要迭代对象时会自动调用iter(x)
我们所有的所有循环 for while 都是默认... iter取值的
内置的iter函数有这几个作用
1. 检查是否实现了__iter__方法, 有则调用并获取迭代器
2. 如果没实现__iter__方法, 但是实现了__getitem__方法, python会自动创建1
3. 捕获异常机制 通常会提醒C object is not iterable 对象不可迭代!
任何python的序列都实现了__iter__我们所用的list, 元组, 集合, 字符串 dict 其实也都是class(所以我们都是站在巨人肩膀上开发的因为我们用着前辈们给定义好的方法, 这些方法提供了我们日常工作的便利)
而for 和while 每次循环可迭代对象时 都会获取迭代器只是我们看不到
这里值得一提的是,, for循环自带捕获异常, 而while不带
为什么提示StopIteration这个错误..
是因为next 获取下一个值时已经发现没有字符了
标准的迭代都存在两个方法.!
__next__返回一个可用的元素, 如果没有... 就抛stopiteration
__iter__返回 self 在应该使用迭代时候使用迭代器
迭代器只有 next 和iter两个方法 所以除了调用陪next() 方法, 以及捕获异常StopIteration
迭代器
迭代器是这样的对象:实现了无参数__next__方法, 返回序列中的下一个元素; 如果没有元素了. 那么抛出StopIteration异常,
python中跌大气还实现了__iter__方法 因此迭代器也可以迭代
现在我们再看看生成器还是上面的代码为例子
效果是一样的
只要在python函数中定义yield关键字, 该函数就是生成器函数. 调用生成器函数时, 会返回一个生成器对象. 也就是说 生成器函数是生成器工厂
之前我有一篇文章map高阶函数的替代者... 就是列表推导式!!! 但是列表推导式也不要写的特别复杂.
如果复杂最好还是加上注释这是用来做什么的. 如果过于复杂建议还是用函数来代替