分类: Python/Ruby
2018-12-16 17:14:12
迭代
一个重复的过程,每一次重复成为一次迭代,并且每次重复的结果是下一次重复的初始值
可迭代对象(iterable)
使用 iter 内置函数可以获取迭代器的对象。
可迭代对象满足的条件:实现了__iter__方法
可迭代对象的判断方法
使用isinstance()函数
from collections import Iterable
isinstance("123",Iterable) #字符串是不是可迭代对象 返回True
isinstance(1,Iterable) #数字是不是可迭代对象 返回False
迭代器(iterator)
迭代器是一种带有状态的对象,能够调用next()获取容器的下一个值,但如果调用了next方法,容器没有值可以返回,则会抛出一个StopIteration异常。
1 . 为何要有迭代器
对于序列类型:字符串,列表,元组可以依赖于索引来迭代取值
但是对于dict,set,文件,python必须为我们提供一种不依赖于索引取值的方法
这个方法就是迭代器
2 迭代器满足的条件:实现__iter__方法和__next__方法。
3 迭代器的特点:
获取较多的值得时候(比如一百万个数据),比起使用列表等容器存储,更加省内存。因为迭代器有next方法,不会一次性把所有数据生成,而是一个接一个的计算,当你想要下一个值得时候才给你返回。
总结:
获取迭代器
对于python内置的可迭代对象,可以使用函数iter()获取相应的迭代器。
iter()和__iter__
1 __iter__用于自定义用户对象(类)
2 iter()用于支持序列访问协议,也就是定义有__getitem__()函数的内置对象,以及实现了__getitem__()函数的用户自定义对象。
实际上,iter()和__iter__联系很紧密,iter()是直接调用了对象的__iter__方法,并且把这个方法的返回值作为自己的返回值。
在for..in…循环中,比如 for i in list,会先调用iter(list)获取可迭代对象list的迭代器,再每次循环调用迭代器的next()方法获取值。
如果一个类想被用于for ... in循环,类似list或tuple那样,就必须实现一个__iter__()方法,该方法返回一个迭代对象,然后,Python的for循环就会不断调用该迭代对象的next()方法拿到循环的下一个值,直到遇到StopIteration错误时退出循环。
【iter()】创建迭代器,然后通过【next()】访问迭代器中的元素
dic={'beijing':1,'shanghai':2,'shenyang':3}
dic_items=iter(dic)
print(next(dic_items))
print(next(dic_items))
print(next(dic_items))
【__iter__】和【__next__】将类(class)改造成迭代器
1. 把一个类作为一个迭代器使用需要在类中实现两个方法 __iter__() 与 __next__() 。
2. __iter__() 方法返回一个特殊的迭代器对象, 这个迭代器对象实现了 __next__() 方法并通过 StopIteration 异常标识迭代的完成。
3. __next__() 方法(Python 2 里是 next())会返回下一个迭代器对象