python的Iterator与Iterable

2019-05-30  本文已影响0人  Judy警官

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__()方法。
上一篇 下一篇

猜你喜欢

热点阅读