码迷,mamicode.com
首页 > 编程语言 > 详细

python三大器之迭代器

时间:2017-08-22 01:51:04      阅读:230      评论:0      收藏:0      [点我收藏+]

标签:break   collect   try   self   elf   容器   pen   color   logs   

python中的三大器有迭代器,生成器,装饰器,本文重点讲解下迭代器

迭代器:具备了__next__和__iter__方法的对象

可迭代对象:具备了__iter__方法的对象

1.可迭代对象,可以通过for...in...这类语句迭代读取一条数据供我们使用的对象称之为可迭代对象(Iterable),可以通过isinstance()判断

In [1]: from collections import Iterable

In [2]: isinstance({},Iterable)
Out[2]: True

In [3]: isinstance((),Iterable)
Out[3]: True

In [4]: isinstance("",Iterable)
Out[4]: True

In [5]: for item in {}:
   ...:     pass
   ...: 

In [6]: for item in "":
   ...:     pass
   ...: 

In [7]: for item in ():
   ...:     pass
   ...: 

2.for in的本质

li = [100, 200, 300, 400]
# for num in li:
#     print(num)


# 1. 通过调用可迭代对象的__iter__()获取迭代器
# 2. 对迭代器调用__next__进行迭代操作,
#     如果没有抛出StopIteration异常,表示迭代没有结束,把获取到的数据元素放到变量中
#     如果抛出了异常,表示迭代结束,退出执行
# 3. 执行循环体
# 4. 跳转到第2步执行

iterator = li.__iter__()

while True:
    try:
        num = iterator.__next__()
    except StopIteration:
        break
    else:
        print(num)

3.自定义迭代器

class MyIterable(object):
    def __init__(self):
        self.container = [] # 定义一个容器

    def add(self, item):
        self.container.append(item)

    def __iter__(self):
        return Iterator(self.container) # 返回一个迭代器


class Iterator(object):
    def __init__(self, container):
        self.container = container
        self.i = 0

    def __next__(self):
        if self.i < len(self.container):
            count = self.i
            self.i += 1
            return self.container[count]
        else:
            raise StopIteration

    def __iter__(self):
        pass


mi = MyIterable()
it = mi.__iter__()
mi.add(1)
mi.add(2)
mi.add(3)

for item in mi:
    print(item)

from collections import Iterator

print(isinstance(it, Iterator))

 

4.合并迭代器,Python要求定义的迭代的迭代器必须实现__iter__(self),并且返回self。通常,一个可迭代对象对象的迭代器都是固定的,并且,类与类

之间需要距离性,对象之间需要相似性,所以通常可迭代对象和迭代器写在一起,就是下面的。

class MyIterable(object):
    def __init__(self):
        self.container = []
        self.i = 0

    def add(self, item):
        self.container.append(item)

    def __next__(self):
        if self.i < len(self.container):
            count = self.i
            self.i += 1
            return self.container[count]
        else:
            raise StopIteration

    def __iter__(self):
        return self


mi = MyIterable()
mi.add(1)
mi.add(2)
mi.add(3)

for item in mi:
    print(item)

 

python三大器之迭代器

标签:break   collect   try   self   elf   容器   pen   color   logs   

原文地址:http://www.cnblogs.com/greatfish/p/7407387.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!