📜  Python __iter __()和__next __()| 将对象转换为迭代器

📅  最后修改于: 2020-01-17 14:42:02             🧑  作者: Mango

在许多情况下,我们需要访问类似迭代器的对象。一种方法是使用生成器循环,但这会延长程序员的工作量和时间。Python通过为该任务提供内置方法__iter __()来简化此任务。
__iter __()函数返回给定的对象(数组,集合,元组等,或自定义对象)的迭代器。它创建一个可以使用__next __()函数,一次访问一个元素的对象,通常在处理循环时会很方便。
语法 :

iter(object)
iter(callable, sentinel)
  • Object:创建迭代器的对象。它可以是列表或元组之类的集合对象,也可以是用户定义的对象(使用OOPS)。
  • Callable,Sentinel: Callable表示一个可调用对象,并且sentinel是需要终止迭代的值,sentinel值表示要迭代的序列的结尾。
  • 例外情况:
    如果我们迭代了迭代器所有元素,错误StopIterationError会出现.

    __iter __()函数返回遍历给定对象的每个元素的迭代器对象。可以通过__next __()函数访问下一个元素。对于可调用对象和Sentinel值,将进行迭代,直到找到Sentinel值或到达元素末尾为止。无论如何,原始对象都不会被修改。
    代码1:

    # Python代码展示iter()
    listA = ['a','e','i','o','u']
    iter_listA = iter(listA)
    try:
        print( next(iter_listA))
        print( next(iter_listA))
        print( next(iter_listA))
        print( next(iter_listA))
        print( next(iter_listA))
        print( next(iter_listA)) #StopIteration错误
    except:
        pass

    输出:

    a
    e
    i
    o
    u

    代码2:

    # Python代码,展示如何使用iter()
    lst = [11, 22, 33, 44, 55]
    iter_lst = iter(lst)
    while True:
        try:
            print(iter_lst.__next__())
        except:
            break

    输出:

    11
    22
    33
    44
    55

    代码3:

    # Python代码,展示基础的iter()
    listB = ['Cat', 'Bat', 'Sat', 'Mat']
    iter_listB = listB.__iter__()
    try:
        print(iter_listB.__next__())
        print(iter_listB.__next__())
        print(iter_listB.__next__())
        print(iter_listB.__next__())
        print(iter_listB.__next__()) #StopIteration error
    except:
        print(" \n报错 'StopIterationError'",
                         "已经迭代到头了.")

    输出:

    Cat
    Bat
    Sat
    Mat
    报错 'StopIterationError' 已经迭代到头了.

    代码4:用户定义的对象(使用OOPS)

    # Python代码,展示iter()的面向对象
    class Counter:
        def __init__(self, start, end):
            self.num = start
            self.end = end
        def __iter__(self):
            return self
        def __next__(self):
            if self.num > self.end:
                raise StopIteration
            else:
                self.num += 1
                return self.num - 1
    # 测试代码
    if __name__ == '__main__' :
        a, b = 2, 5
        c1 = Counter(a, b)
        c2 = Counter(a, b)
        # 不使用iter(),打印范围
        print ("不使用iter(),打印范围")
        for i in c1:
            print ("吃更多的芒果, 计算中 ", i, end ="\n")
        print ("\n使用iter()打印范围\n")
        # 方法2-使用iter()
        obj = iter(c2)
        try:
            while True: # 打印直到报错
                print ("吃更多的芒果, 计算中 ", next(obj))
        except:
            # when StopIteration raised, Print custom message
            print ("\n你已经撑死,游戏结束")

    输出:

    不使用iter(),打印范围
    吃更多的芒果, 计算中  2
    吃更多的芒果, 计算中  3
    吃更多的芒果, 计算中  4
    吃更多的芒果, 计算中  5
    使用iter()打印范围
    吃更多的芒果, 计算中  2
    吃更多的芒果, 计算中  3
    吃更多的芒果, 计算中  4
    吃更多的芒果, 计算中  5
    你已经撑死,游戏结束