魔法函数__iter__()和__next__()

两个概念Iterable和Iterator

  • Iterable: 有迭代能力的对象 (如:list, dict, set, tuple,str)
  • Iterator: 迭代器

通过iter()函数可以将有迭代能力的对象转化成迭代器

可以通过collections类判断一个对象是Iterable还是Iterator

from collections import Iterable, Iterator

# 常见的Iterable: list, dict
a = [1, 2, 4, 5]

isinstance(a, Iterable)   # True
isinstance(a, Iterator)   # Fasle

b = iter(a)

isinstance(b, Iterable)   # True
isinstance(b, Iterator)   # True

迭代器是一个可以记住遍历位置的对象。(只能向前迭代不能后退)

迭代器是一个可以被next()函数调用并不断返回下一个值的对象

有迭代能力的对象从集合的第一个元素开始访问,真到所有元素访问完毕

# 两者都可用for语句迭代元素
for i in a:
    print(i)

for i in b:
    print(i)
# Iterator对象可用next()函数迭代元素(一直向后)
next(b)    # 1
next(b)    # 2

# 到最后无元素时,抛出StopIteration异常

__iter__和__next__

iter()函数主要映射类中__iter__函数

next()函数主要映射类中__next__函数

class A(object):
    def __iter__(self):
        print("返回一个类B对象")
        return B()


class B(object):
    def __next__(self):
        print(" you got me!!!!!!")

obj_a = A()  # 类A实例
obj_b = B()  # 类B实例
iter(obj)  # 返回一个类B对象
next(iter(obj))  # 返回一个类B对象    you got me!!!!!! 

一个类实现了__iter__, 我们认为它有迭代能力,称其为Iterable.

一个类同时实现了__iter__和__next__,称其为Iterator.

modify(obj_a)  # 当前对象为Iterable
modify(obj_b)    # 什么都不是

 带有迭代器的类

class MyRange(object):
    def __init__(self, end):
        self.start = 0
        self.end = end

    def __iter__(self):
        return self

    def __next__(self):
        if self.start < self.end:
            ret = self.start
            self.start += 1
            return ret
        else:
            raise StopIteration


m = MyRange(5)
modify(m)          # Iterable, Iterator

# 利用for语句迭代元素,会捕获StopIteration异常并自动结束for
for i in m:
    print(i)
# 利用next()函数迭代元素
print(next(a))
print(next(a))
print(next(a))
print(next(a))
print(next(a))
print(next(a)) # 其实到这里已经完成了,我们在运行一次查看异常

 

你可能感兴趣的:(Python,Standard,library)