Iterator:
# 迭代器(Iterator):可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
# Iterator对象表示的是一个数据流,可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据, 所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。
#一个生成偶数的迭代器的例子:
from collections import Iterable,Iterator
from functools import reduce
class EvenIterator(object):
def __init__(self,n):
self.stop=n
self.value=-2
def __iter__(self):
return self
def __next__(self):
self.value+=2
if self.value>self.stop:
raise StopIteration
return self.value
e_iter=EvenIterator(12)
for en in e_iter:
print(en,end='en ')
#一个生成器是一个Iterator对象:
print("\n")
print("生成器是一个Iterator:%s"%isinstance((x for x in range(10)),Iterator))
#可以通过iter()方法把Iterable(list,tuple,dict,str等)转换成Iterator
# Python的for循环本质上就是通过不断调用next()函数实现的
l_l=[1,2,3]
l_t=iter(l_l)
print("\n")
while 1:
try:
print(next(l_t))
except StopIterationas e:
print("l_t结束鸟~")
break
# 总结:
# 凡是可作用于for循环的对象都是Iterable类型;
# 凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;
# 集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。
Iterable:
#可迭代(Iterable):他的特点其实就是我的序列的大小长度已经确定了(list,tuple,dict,string等)。他遵循可迭代的协议。
# 可迭代协议:
# 含__iter__()方法。且可迭代对象中的__iter__()方法返回的是一个对应的迭代器。(如list对应的迭代器就是list_iterator)
Iterator与Iterable区别:
#在交互模式下:help(Iterable)
# class Iterable(builtins.object)
# | Methods defined here:
# |
# | __iter__(self)
#在交互模式下:help(Iterator)
# class Iterator(Iterable)
# | Method resolution order:
# | Iterator
# | Iterable
# | builtins.object
# |
# | Methods defined here:
# |
# | __iter__(self)
# |
# | __next__(self)
# | Return the next item from the iterator. When exhausted, raise StopIteion
#总结:
# 从上面的代码我们很清楚的看出Iterator继承iterable。这样我们就很清楚的看到了他们之间的关系了。
# 那我们说能不能把iterable转换Iterator呢?当然可以。可以通过iter()函数进行转换。其实说白了执行iter()方法就是去调用类中的__iter__()方法。
网友评论